我在更新数据库中的行时遇到此错误。
System.Data.dll中出现'System.Data.OleDb.OleDbException'类型的异常,但未在用户代码中处理
其他信息:UPDATE语句中的语法错误。
无法调用该服务。可能的原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参阅堆栈跟踪。您可以尝试通过启动新代理,还原到默认配置或刷新服务来恢复。
这是我的更新代码:
public string UpdateInventory(string name, int quantity)
{
string strMessage = string.Empty;
string sql;
//Create connection object
OleDbConnection oleConn = new OleDbConnection(connString);
oleConn.Open();
//Update a row
sql = "UPDATE Product SET Quantity Attribute = '" + quantity + "' WHERE Name = '" + name + "'";
OleDbCommand cmd = new OleDbCommand(sql, oleConn);
int rowsAffected = (int)cmd.ExecuteNonQuery();
if(rowsAffected > 0)
{
strMessage = name + "Details updated succesfully";
}
else
{
strMessage = name + "Details not updated successfully";
}
oleConn.Close();
return strMessage;
}
但是如果我使用相同的代码更新小数价格和字符串描述。一切顺利。它只是在更新数量时获取代码。
答案 0 :(得分:0)
您的列名Quantity Attribute
中有一个空格,这很可能导致语法错误。您可以使用列名称周围的括号来解决此问题。此外,quantity
是int
,您正在尝试将其用作SQL命令中的字符串。很可能它也是表格中的int
,因此您不需要'
围绕该值,但不知道您的表格架构是什么?只是一个猜测。
您的代码最大的问题是它容易受到SQL注入攻击。您可以使用参数化查询来防范这种情况。参数化查询还有一个额外的好处,即根据各个参数的类型为您处理任何所需的值引用。
最后,我们考虑了使用using
块进行连接的最佳做法,即使退出using
块,也会为您关闭并处理连接,即使发生错误。
这是一个包含所有这些内容的例子:
try
{
using (OleDbConnection oleConn = new OleDbConnection(connString))
{
oleConn.Open();
//Update a row
sql = "UPDATE Product SET [Quantity Attribute] = ? WHERE Name = ?";
OleDbCommand cmd = new OleDbCommand(sql, oleConn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@Quantity", OleDbType.Int).Value = quantity;
cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = name;
int rowsAffected = (int)cmd.ExecuteNonQuery();
if(rowsAffected > 0)
{
strMessage = name + "Details updated succesfully";
}
else
{
strMessage = name + "Details not updated successfully";
}
}
}
catch (Exception ex)
{
strMessage = String.Format("Update error: {0}", ex.Message);
}
请注意,对于OleDb,问号用作参数的占位符,因此添加参数的顺序非常重要 - 它们必须与查询字符串中占位符的顺序相匹配。
生成的SQL看起来像这样(假设Quantity Attribute是一个int,quantity
= 20和name
=" Sample":
UPDATE Product SET [Quantity Attribute] = 20 WHERE Name = 'Sample'
作为最终建议,我还将代码包装在try-catch块中,因此如果抛出异常,它将被捕获并处理。未处理的异常还可以揭示有关您的程序的信息,这些信息不应该被泄露(因为它可以为潜在的黑客提供更多信息来改进他们破坏系统的企图)。由于这是一个WCF服务,根据您的配置异常,可能会或可能不会将详细信息返回给客户端,但未处理的异常会导致您的服务中断,并且会使客户端的服务通道出现故障。