在VS13上使用连接的Access数据库的C#,并在执行某个SQL时收到错误“没有给出一个或多个必需参数的值”。
这是我的代码。谢谢你的时间!
// ID accessors for an itemLine object
public void setID(string Value) { ID = Value; }
public string getID() { return ID; }
...
// Code snippet where error originates
foreach (CartItem itemLine in parBasket)
{
cmd.CommandText = "SELECT Instock FROM tblProducts WHERE ProductID = " + itemLine.getID() + "";
OleDbDataReader reader = cmd.ExecuteReader();
reader.Read();
int stock = Convert.ToInt32(reader["Instock"]);
stock = stock - itemLine.getQuanity();
reader.Close(); //Close the reader
cmd.CommandText = "UPDATE tblProducts SET InStock =" + stock + " WHERE ProductID = " + itemLine.getID() + "";
updated = updated + cmd.ExecuteNonQuery();
}
cn.Close();
return updated;
}
答案 0 :(得分:1)
如果CartItem.getID()
返回一个整数而不是字符串,那么您需要在正在构建的SELECT
语句中删除它周围的单引号。
更好 - 阅读使用SqlParameter
并在构建此类查询时使用此功能,因为它有助于避免此类错误,并且如果任何参数数据直接出现,也会阻止SQL injection attacks来自用户输入。
答案 1 :(得分:1)
要自己修复这些错误,您应该:
这应该是非常明显的错误。
现在使用我的水晶球而不是调试器,我认为你的问题是getId()
会返回一个字符串(根据你对这个问题的评论),你最终得到的结果是:WHERE ProductID = FortyTwo
第一个和第二个SQL查询。
对此的错误解决方法是将字符串括在引号中:WHERE ProductID = 'FortyTwo'
但是您应该小心,您的ID本身不包含引号(您应该转义)。
好的解决方案是使用SQL参数。假设SQL Server语法:WHERE ProductID = @id
和cmd.Parameters.AddWithValue("id", item.GetId())
。 (注意:您重复使用相同的命令,您应该不重复添加参数。而是添加一次,然后在每次迭代时更改其值。)