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)其数据类型......我不认为这是一个问题....
你至少应该在电子邮件地址周围加上单引号:
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注入攻击......
哎呀,我闻到了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已经设置了连接属性.
| 归档时间: |
|
| 查看次数: |
1651 次 |
| 最近记录: |