如何修复“ System.Data.OleDb.OleDbException:'UPDATE语句中的语法错误。'”?

时间:2019-05-28 16:58:49

标签: c# oledb

我在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();

2 个答案:

答案 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}}

以及所有其他用户输入。