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);
可能还有其他事情可能是错误的,但我看到的第一件事是,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注入的提示。干杯!