我遇到了一个问题而我无法解决这个问题。 我收到此错误:
守则:
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = " + @departmentCB.Text;
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@nextMaintainance", nextMaintainanceDT.Value);
command.ExecuteNonQuery();
我不明白的一件奇怪的事情是类似的代码在我的项目中没有任何错误就可以正常工作:
query = "UPDATE LDV SET received = @received, department = @department WHERE Id =" + @idTxt.Text;
command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@received", inDT.Value);
command.Parameters.AddWithValue("@department", departmentCb.Text);
command.ExecuteNonQuery();
MessageBox.Show("Lungenautomat wurde aktualisiert");
如果相关,我的连接字符串:
connectionString = ConfigurationManager.ConnectionStrings["SCBA_Manager_0._1.Properties.Settings.SCBAmanagerConnectionString"].ConnectionString;
我真的希望你能帮助我:( 谢谢!
答案 0 :(得分:1)
department
列是一个文本列,因此将其与值进行比较意味着该值应包含在引号中。
// This fix is not the recommended approach, see the explanation after this code block
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = '" + departmentCB.Text + "'";
// ^--------------------------^------ single quote added to wrap the value returned by departmentCB.Text
另一方面,在第二个示例中不会出现此错误,因为您正确使用Parameters.AddWithValue()
方法添加@department
参数的值,并且因为{ {1}}是一个数字列,因此它不需要包含在引号中的值。
然而,虽然上面显示的代码完成了这项工作,但这不是正确的工作方式。正确的方法是使用参数将所有值注入查询。您在上面显示的查询已正确使用某些值的参数(例如,第一个查询中为id
,第二个查询中为nextMaintenance
和received
),但是字符串不正确其他值的串联(例如,第一个查询中为department
,第二个查询中为department
)。
参数化SQL的用法
使用参数化SQL的好处是它会自动处理添加引号,防止SQL注入等。
因此,最好将您的第一个代码块更改为:
id
注意字符串SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = @department";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@department", departmentCb.Text);
command.Parameters.AddWithValue("@nextMaintainance", nextMaintainanceDT.Value);
command.ExecuteNonQuery();
是一个没有任何混乱串联的单个字符串,它包含两个参数query
和@nextMaintenance
?以及如何使用@department
在以下行中正确注入这些参数的值?
使用Parameters.AddWithValue()
列的参数可以类似地改进您的第二个代码块。
Id
更多信息
请阅读有关SQL注入(https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx)的内容,以了解如何像原始代码一样使用字符串连接可能导致各种安全问题,以及为什么参数化查询是将动态值注入SQL查询的首选方法。
您可以在此处详细了解参数化查询:https://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx
答案 1 :(得分:0)
在第一个示例中,WHERE子句的计算结果为
WHERE department = Kasseedorf
应该是
WHERE department = 'Kasseedorf'
所以该行应
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = '" + @departmentCB.Text +"'";
它适用于第二个例子,因为id是一个整数而且没有引用。