无法绑定多部分标识符"sxxx@yahoo.com"

kno*_*ter 1 c# sql-server

if (validateEmailId(email))
{
    pictureBox5.Visible = true;
    SqlConnection con = new SqlConnection("conection string");
    SqlCommand cmd2 = new SqlCommand("UPDATE  sumant SET email=" + email + " WHERE code ='" + textBox2.Text + "' ", con);
    cmd2.Connection = con;
    cmd2.Connection.Open();
    cmd2.ExecuteNonQuery();//line 7
    con.Close();
}
Run Code Online (Sandbox Code Playgroud)

validateEmailId是一个验证输入的电子邮件的函数(使用正则表达式)..在'email'文本框中输入的电子邮件已经过验证并返回到上述函数中.

当控件在遇到错误后转到第7行时:

无法绑定多部分标识符"sxxx@yahoo.com".

这意味着sxxx@yahoo.com已通过验证测试,但第7行出现问题.

在SQL端,"email"列有varchar(50)其数据类型......我不认为这是一个问题....

Arj*_*nbu 9

你至少应该在电子邮件地址周围加上单引号:

SqlCommand cmd2 = new SqlCommand("UPDATE  sumant SET email='" + email + "' WHERE code ='" + textBox2.Text + "' ", con);
Run Code Online (Sandbox Code Playgroud)

但是,这并不是传递params的好方法,因为你要为SQL注入攻击留下这么大的空间......

更好的方法是使用参数化查询,如下所示:

SqlCommand cmd2 = new SqlCommand("UPDATE  sumant SET email=@email WHERE code=@code", con);
cmd2.Parameters.AddWithValue("@email", email);
cmd2.Parameters.AddWithValue("@code", textBox2.Text);
Run Code Online (Sandbox Code Playgroud)

那么你不需要提供单引号,同时你可以防止SQL注入攻击......


Zyp*_*rax 6

哎呀,我闻到了SQL注入和缺乏处理.试试这个:

using (SqlConnection con = new SqlConnection("conection string")) {
    using (SqlCommand cmd2 = new SqlCommand("UPDATE sumant SET email=@Email WHERE code = @Code", con)) {
        cmd2.Parameters.AddWithValue("@Email", email);
        cmd2.Parameters.AddWithValue("@Code", textBox2.Text);
        con.Open();
        cmd2.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

using指令将关闭SqlConnection和SqlCommand,无论它们是否失败或正确执行.SqlParameters将阻止任何形式的SQL注入.

另一个旁注:你将conn参数传递给SqlCommand构造函数并在此之后设置SqlCommand的连接属性,将SqlConnection传递给SqlCommand已经设置了连接属性.

  • 使用块+1.作为旁注:在这种情况下,您可以删除外部使用块的大括号(当没有代码仅驻留在外部块中时). (2认同)