没有给出一个或多个必需参数的值.c# /访问
本文关键字:参数 访问 一个 | 更新日期: 2023-09-27 17:53:59
在VS13上使用c#连接Access数据库,当执行某些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;
}
如果CartItem.getID()
返回一个整数,而不是字符串,那么您需要在您正在构建的SELECT
语句中删除它周围的单引号。
甚至更好-阅读使用SqlParameter
并在构建这样的查询时使用它,因为它有助于避免这种错误,并且还可以防止SQL注入攻击,如果任何参数数据直接来自用户输入。
要自己修复这些错误,您应该:
- 使用调试器运行;
- 当SQL命令抛出异常时,调试器应该中断(至少在未处理的情况下)。如果你捕捉到它,调试器可能仍然会崩溃,但你必须调整它的配置来这样做);
- 使用Watch或其他东西查看SqlCommand的CommandText(即实际执行的SQL文本)。
这应该可以很明显地看出哪里出了问题。
现在使用我的水晶球而不是调试器,我认为你的问题是getId()
返回一个字符串(根据你对问题的评论),你最终会得到类似的东西:WHERE ProductID = FortyTwo
在第一个和第二个SQL查询。
糟糕的解决方案是将字符串括在引号中:WHERE ProductID = 'FortyTwo'
,但您应该注意您的ID本身不包含引号(您应该转义)。
好的解决方案是使用SQL参数。假设SQL Server语法为:WHERE ProductID = @id
和cmd.Parameters.AddWithValue("id", item.GetId())
。(注意:重复使用同一个命令时,应该使用而不是重复添加参数。而是添加一次,然后在每次迭代中更改它的值。