System.Data.OleDb.OleDbException 未处理:MS Access 中 UPDATE 语句中的

本文关键字:Access UPDATE 语句 MS Data OleDb OleDbException 未处理 System | 更新日期: 2023-09-27 18:33:35

我正在处理一个项目,我必须在所有查询中使用 Access 数据库,它一直显示此异常

System.Data.OleDb.OleDbException was unhandled
Message = Syntax error in UPDATE statement.
Source = Microsoft Office Access Database Engine
ErrorCode= - 2147217900

在以下查询中

public static string updateDailyBalance = "UPDATE DailyBalance SET [{0}] = {1} WHERE [CustomerID] = {2} & [PurchaseMonth] = {3}";

并在以下源代码中

for (int i = 0; i < dsCustomerBal.Tables[0].Rows.Count; i++)
{
    //{0} = Day, {1} = BalancePoints, {2} = CustomerID, {3} = yyyyMM
    string strQ = Constants.updateDailyBalance;
    strQ = strQ.Replace("{0}", l.ToString());
    strQ = strQ.Replace("{1}", dsCustomerBal.Tables[0].Rows[i]["Bal"].ToString());
    strQ = strQ.Replace("{2}", dsCustomerBal.Tables[0].Rows[i]["CustomerID"].ToString());
    strQ = strQ.Replace("{3}", _LastUpdatedDate.ToString("yyyyMM"));
    Database db1 = DatabaseFactory.CreateDatabase("Deltin");
    DbCommand dbComm1 = db1.GetSqlStringCommand(strQ);
    dbComm1.CommandTimeout = 0;
    int j = db.ExecuteNonQuery(dbComm1);
}

在行中

 int j = db.ExecuteNonQuery(dbComm1);

System.Data.OleDb.OleDbException 未处理:MS Access 中 UPDATE 语句中的

可能还有其他事情可能是错误的,但我看到的第一件事是,WHERE子句中没有&运算符。

我认为你需要像这样使用它;

WHERE [CustomerID] = {2} AND [PurchaseMonth] = {3}

但更重要的是,应始终使用参数化查询,而不是字符串替换和串联。这种字符串串联对SQL注入攻击是开放的。

将列值(而不是名称)定义为参数,将它们作为OleDbParameterCollection添加到 for 循环中,执行查询并在下次迭代之前使用 OleDbParameterCollection.Clear() 清除参数。

与往常一样,在进行此类游戏时 - 检查完整的输出。您发送的查询不是您在代码中的查询,而是真正向您显示错误的复制/粘贴。

THere is no & in SQL。这会导致语法错误。

另请了解 .NET 基类。除了参数是避免SQL注入的答案之外 - 您的字符串操作对String.Format一无所知,这将允许您将所有替换命令替换为一次运行。有趣的是,您已经在sql字符串中使用了string.format语法。

也就是说:这是由于严重疏忽而滥用数据库的邀请。阅读 SQL 注入并使用参数。

大家

好,我解决了我的问题,这与表中的空条目有关,这就是为什么更新给出语法错误的原因。感谢您提供有关SQL注入的提示。干杯!