>我的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引擎数据库",不会保存更改。
错误显示"System.Data.OleDb.OleDbException: 'UPDATE 语句中的语法错误'"指向 cmd.ExecuteNonQuery((;
首先,切勿使用字符串串联来构建查询。您请求的是SQL注入攻击。我在这里能看到的最重要的事情是确保只有字符串列(varchar、char、text 等(的列才有单引号值。成本是一个数字吗?如果是这样,那么它应该是:
, cost=" + treatCost.Text + ",
如果成本是一个数字,还要确保输入字段中没有货币金额。如果有人输入 1,422.00,这不是一个数字,并且会失败,因为 是用于装饰的。如果有人输入 1422.00 美元,这不是一个数字,因为 $ 用于装饰。其中任何一个都会使查询失败。
如果有人在备注字段中键入撇号,就会发生这种情况,SQL 服务器会将其解释为字符串的结束引号。 但是,如果用户知道一点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;
以及所有其他用户输入。