没有给出一个或多个必需参数的值.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;
}

没有给出一个或多个必需参数的值.c# /访问

如果CartItem.getID()返回一个整数,而不是字符串,那么您需要在您正在构建的SELECT语句中删除它周围的单引号。

甚至更好-阅读使用SqlParameter并在构建这样的查询时使用它,因为它有助于避免这种错误,并且还可以防止SQL注入攻击,如果任何参数数据直接来自用户输入。

要自己修复这些错误,您应该:

  1. 使用调试器运行;
  2. 当SQL命令抛出异常时,调试器应该中断(至少在未处理的情况下)。如果你捕捉到它,调试器可能仍然会崩溃,但你必须调整它的配置来这样做);
  3. 使用Watch或其他东西查看SqlCommand的CommandText(即实际执行的SQL文本)。

这应该可以很明显地看出哪里出了问题。

现在使用我的水晶球而不是调试器,我认为你的问题是getId()返回一个字符串(根据你对问题的评论),你最终会得到类似的东西:WHERE ProductID = FortyTwo在第一个和第二个SQL查询。

糟糕的解决方案是将字符串括在引号中:WHERE ProductID = 'FortyTwo',但您应该注意您的ID本身不包含引号(您应该转义)。

好的解决方案是使用SQL参数。假设SQL Server语法为:WHERE ProductID = @idcmd.Parameters.AddWithValue("id", item.GetId())。(注意:重复使用同一个命令时,应该使用而不是重复添加参数。而是添加一次,然后在每次迭代中更改它的值。