0

電子メールのみを更新するときに発生する問題は、他のすべての空白が null になります。SQL Server 2008でnullを許可するチェックを外したとしても、私のコードは-

protected void Updateinfo_Click(object sender, EventArgs e)
{
    string radiogender;
    if (Radiochngmale.Checked == true)
        radiogender = Radiochngmale.Text.ToString();
    else
        radiogender = Radiochngfemale.Text.ToString();
    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["Con"].ConnectionString;
    con.Open();
    if (con.State == ConnectionState.Open)
    {
        SqlCommand cmd = new SqlCommand();
        Random r = new Random();
        int next = r.Next();
        if (FileUpload2.HasFile)
        {
            string myMap = MapPath("~/").ToLower();
            string ImageName = FileUpload2.PostedFile.FileName;
            sImageFileExtension = ImageName.Substring(ImageName.LastIndexOf(".")).ToLower();
            if (sImageFileExtension == ".gif" || sImageFileExtension == ".png" || sImageFileExtension == ".jpg" || sImageFileExtension == ".jpeg" || sImageFileExtension == ".bmp")
            {
                string ImageSaveURL = myMap + "UserImage/" + next + sImageFileExtension;
                FileUpload2.PostedFile.SaveAs(ImageSaveURL);
            }
            else
                Response.Write("Invalid File");
        }
        cmd.Connection = con; 
        if(chngfname.Text==null)
            chngfname.Text="Select Firstname from Login where Email='"+Session["UserName"]+"'";
        if (chnglastname.Text == null)
            chnglastname.Text = "Select Lastname from Login where Email='" + Session["UserName"] + "'";
        if (chngage.Text == null)
            chngage.Text = "Select age from Login where Email='" + Session["UserName"] + "'";
        if (chngemail.Text == null)
            chngemail.Text = "Select Email from Login where Email='" + Session["UserName"] + "'";
        if (radiogender == null)
            radiogender = "Select gender from Login where Email='" + Session["UserName"] + "'";
        if (chngpassword.Text == null)
            chngpassword.Text = "Select Password from Login where Email='" + Session["UserName"] + "'";
        if ( FileUpload2.HasFile==null)
             sImageFileExtension = "Select profile_pic from Login where Email='" + Session["UserName"] + "'";
        if (chngfname.Text == null)
            chngfname.Text = "Select Firstname from Login where Email='" + Session["UserName"] + "'";
        cmd.CommandText =  "Update Login set FirstName = '"+chngfname.Text+"',LastName='"+chnglastname.Text+"',Email='"+chngemail.Text+"',Password='"+chngpassword.Text+"' ,gender='"+radiogender+"',age='"+chngage.Text+"' , profile_pic='"+ next + sImageFileExtension + "' where Email='"+Session["UserName"]+"'";  
        cmd.CommandType = CommandType.Text; 
        cmd.ExecuteNonQuery();
        }
    }

以前の値を取得するように言ったのに、なぜ取得しなかったのですか。確認して整理してください

4

2 に答える 2

2

これは、TextBox.Text が null にならないために発生しているため、SQL クエリは次のようになります。

Update Login 
  set FirstName = '', 
      LastName = '',
where Email = 'John.doe@nowhere.net'

-- etc...

データが実際に何かに設定されている 1 つまたは 2 つのフィールドを除いて。これはおそらくあなたが望んでいたものです:

update login
  set FirstName = 'John', 
      LastName = (select Lastname from login where email = 'John.doe@nowhere.net'), 
      etc...
where email = 'John.doe@nowhere.net'

ただし、サブクエリは必要ありません。値が null または空の文字列である値の上書きを回避したい場合は、SQL を次のように表示し、パラメーターを使用して、テキスト ボックスが空のときにパラメーターを DbNull に設定します。

cmd.Parameters.AddWithValue("@FirstName", (chngfname.Text == String.Empty) ? DbNull.Value : chngfname.Text;

update login
  set FirstName = coalesce(@firstName, FirstName), 
      LastName = coalesce(@LastName, LastName), 
      etc...
where Email = @Email

もう 1 つのオプションは、最初にレコードを選択し (既に行っていると思います)、データベースに既に存在する同じ値を使用することです。

if (chngfname.Text == String.Empty) chngfname.Text = Session["CurrentUserEntity"].FirstName;

さらに、これをパラメータ化されたクエリに変更する必要があります。

string sql = "update login set FirstName = @firstName, LastName = @lastName, etc... where email = @email;
cmd.Parameters.Add(...);
于 2012-08-25T13:26:42.863 に答える
1

現在の文字列連結方法の代わりに、パラメーター化されたクエリを使用するようにしてください。
これにより、引用の問題が解決され、SQL インジェクション攻撃が防止されます。

cmd.CommandText =  "Update Login set FirstName = @First, LastName=@Last, " +
                   "Email=@Mail, Password=@Pass, gender=@Gend,age=@Age, " + 
                   "profile_pic=@Prof " + 
                   "where Email=@oldMail";
cmd.Parameters.AddWithValue("@First", chngfname.Text);
cmd.Parameters.AddWithValue("@Last", chnglastname.Text);
cmd.Parameters.AddWithValue("@Mail", chngemail.Text);
cmd.Parameters.AddWithValue("@Pass", chngpassword.Text);
cmd.Parameters.AddWithValue("@Gend", radiogender);
cmd.Parameters.AddWithValue("@Age", chngage.Text);
cmd.Parameters.AddWithValue("@Prof", next + sImageFileExtension );
cmd.Parameters.AddWithValue("@oldMail", +Session["UserName"]);

ただし、以前のコメントで述べたように、あなたのコードは正しくないようです。
まず、TextBox.Text を null にすることはできません。空の文字列です。これにより、上記の null 値のテキストがスキップされ、データベースに空白の値を設定して終了します。少なくともテストを変更してみてください

if(string.IsNullOrEmpty(chngfname.Text))
    ......

ただし、この時点で、上記の各 if 内のコードを変更する必要があります。データベースから古い値を取得し、空の文字列の場合にそれらを使用することを意図している場合は、テキストボックスに保存するのではなく、その文字列を実行する必要があります。

編集:更新プロセスを開始する前に、更新しようとしているレコードの古い値をロードする必要があります。これは、同じ接続を使用して実行できます

   SqlDataAdapter da = new SqlDataAdapter("SELECT * from Login where EMail = @oldMail", con);
   da.SelectCommand.Parameters.AddWithValue("@oldMail", Session["UserName");
   DataTable dt = new DataTable();
   da.Fill(dt);

これで、そのユーザーの古い値がすべてデータテーブルにあるので、古い値のチェックに到達したら、次のように書くことができます

if(string.IsNullOrEmpty(chngfname.Text))
    cngfname.Text = (dt.Rows["FirstName"]  == DBNull.Value ? string.Empty : dt.Rows["FirstName"].ToString());

欠落している可能性のあるすべてのフィールドの値を既に取得しているため、そのSQL文字列を削除します

于 2012-08-25T13:27:31.020 に答える