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

时间:2014-03-26 11:10:07

标签: c# database visual-studio

在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;
}

2 个答案:

答案 0 :(得分:1)

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

更好 - 阅读使用SqlParameter并在构建此类查询时使用此功能,因为它有助于避免此类错误,并且如果任何参数数据直接出现,也会阻止SQL injection attacks来自用户输入。

答案 1 :(得分:1)

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

  1. 使用调试器运行;
  2. 当SQL命令抛出异常时,调试器应该中断(至少如果它未处理。如果你发现它,调试器可能仍会中断,但你必须调整它的配置才能这样做);
  3. 使用Watch或其他东西来查看SqlCommand的CommandText(即实际执行的SQL文本)。
  4. 这应该是非常明显的错误。

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

    对此的错误解决方法是将字符串括在引号中:WHERE ProductID = 'FortyTwo'但是您应该小心,您的ID本身不包含引号(您应该转义)。

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