我在UPDATE datagridview代码中遇到语法错误,该错误恰巧在另一个.cs文件中工作。我的小组一直在在线寻找不同的解决方案,但一切都无法正常进行。
我的小组一直在在线寻找不同的解决方案,但一切似乎都无法正常工作。
{
connection.Open();
OleDbCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Update Table1 set treatment = '" + treat.Text + "', remarks = '" + appRemarks.Text + "', cost = '" + treatCost.Text + "', Time = '" + textBox2.Text + "' where lastName = '" + Lastname.Text + "' ";
cmd.ExecuteNonQuery();
connection.Close();
MessageBox.Show("Updated Successfully!");
}
预期输出应该成功更新!单击更新按钮后,它应该反映在数据库文件中。有时输出是“ Microsoft Engine数据库”,它不保存更改。
错误指出“ System.Data.OleDb.OleDbException:'UPDATE语句中的语法错误。'”指向cmd.ExecuteNonQuery();
答案 0 :(得分:2)
首先,切勿使用字符串连接来构建查询。您正在要求进行SQL注入攻击。我在这里可以看到的最大事情是确保只有字符串列(varchar,char,text等)的列具有单引号值。是数字吗?如果是这样,那么应该是:
, cost=" + treatCost.Text + ",
如果cost是数字,则还要确保输入字段中没有货币金额。如果有人输入1,422.00,这不是数字,并且将失败,因为用于装饰。 如果有人投入1422.00美元,这不是一个数字,因为$用于装饰。 这些都会使查询失败。
答案 1 :(得分:2)
如果有人在“备注”字段中键入撇号,则会发生这种情况,SQL Server会将其解释为字符串的结尾引号。但是,如果用户懂一点sql并想引起麻烦,则可能发生更糟糕的事情。例如,在备注中加上Update Table1 set treatment = 'blah', remarks = ''-- where lastName = 'foobar'
将导致
foobar
这将覆盖表中的每一行,而不仅仅是覆盖remarks = '" + appRemarks.Text + "'
的行。
使用查询参数,以使用户提供的值不能解释为查询关键字和结构。
您将拥有remarks = @Remarks
而不是cmd.Parameters.Add("@Remarks", SqlDbType.NText).Value = appRemarks.Text;
{{1}}
以及所有其他用户输入。