【问题标题】:System.Data.OleDb.OleDbException was unhandled: Syntax error in UPDATE statement in MS AccessSystem.Data.OleDb.OleDbException 未处理:MS Access 中 UPDATE 语句中的语法错误
【发布时间】:2014-12-09 07:35:19
【问题描述】:

我正在做一个项目,我必须在所有查询中使用 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);

【问题讨论】:

  • 你调试过你的代码吗?执行之前strQ的值是多少?
  • 伙计们。学习 string.format。您可以用一个 string.format 替换所有替换语句。更好的是使用 - 参数。但是这个字符串处理尖叫“我不知道存在哪些 .NET 类”。

标签: c# sql ms-access ado.net ms-access-2007


【解决方案1】:

可能可能有其他事情出错,但我首先看到的是,WHERE 子句中没有 &amp; 运算符。

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

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

但更重要的是,您应该始终使用parameterized queries,而不是字符串替换和连接。这种字符串连接对SQL Injection 攻击开放。

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

【讨论】:

  • 语法错误可能是由于传递的字符串值没有正确引用引起的。再次参数是答案
  • @Steve 是的,但是由于 OP 没有告诉我们它们的列类型和值是什么,我们永远不知道 :)
【解决方案2】:

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

SQL 中没有 &。这会导致语法错误。

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

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

【讨论】:

    【解决方案3】:

    大家好,我解决了我的问题,它与表中的空条目有关,这就是 update 给出语法错误的原因。感谢有关 SQL 注入的提示。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多