System.Data.OleDb.OleDbException未处理:MS Access中的UPDATE语句中出现语法错误

时间:2014-12-09 07:35:19

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

在进行此类游戏时一如既往 - 检查完整输出。您发送的查询不是您的代码中的查询,而是显示错误的dcopy /粘贴。

这不是&amp;在SQL中。这导致语法错误。

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

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

答案 2 :(得分:0)

大家好我解决了我的问题,它与表中的空条目有关,这就是为什么更新会给出语法错误。感谢SQL注入提示。欢呼!