我正在开发一个项目,我必须在所有查询中使用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);
答案 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注入提示。欢呼!