没有为一个或多个必需参数提供值。 C#

No value given for one or more required parameters. C#

我有一个 C# 程序,我编写了一个代码,用于从库存中这些产品的数量中减去已售出的产品数量(访问数据表),所以我使用了这个代码:

foreach (DataGridViewRow r in dataGridView1.Rows)
{
      OleDbCommand command = new OleDbCommand("Update BookInserting set Amount = Amount - '" + Convert.ToInt32(r.Cells[1].Value) + "' where BookName = " + r.Cells[0].Value.ToString() + "", connection);
      connection.Open();
      command.ExecuteNonQuery();
      connection.Close();
}

但是当我 运行 它给了我这个错误: (没有为一个或多个必需参数给出值)。 试了好几次都解决不了,希望大家帮我解决。 提前致谢。

您的问题可能是由于 Access 无法将查询的某些部分识别为基础 table(或 table 本身)的对象。
使用参数可以避免这个问题和一个更严重的问题 Sql 注入。 (还有一个好处是,如果没有所有这些字符串连接,您的代码会变得更加清晰)

所以让我们尝试以这种方式更改您的代码:

// String sql with parameters placeholders 
string cmdText = @"Update BookInserting 
                   set Amount = Amount - @amt
                   where BookName = @book";

connection.Open();

// Just build the command just one time outside the loop and 
// add the two parameters required (without a value and in the exact order
// expected by the placeholders
OleDbCommand command = new OleDbCommand(cmdText, connection);
command.Parameters.Add("@amt", OleDbType.Integer);
command.Parameters.Add("@book", OleDbType.VarWChar);

// Inside the loop just change the parameters values and execute
foreach (DataGridViewRow r in dataGridView1.Rows)
{
    // If the cell with the parameter for the WHERE 
    // clause is invalid skip the update
    if(!r.IsNewRow && r.Cells[0].Value != null  
                   && r.Cells[0].Value.ToString() != "")
    {
       cmd.Parameters["@amt"].Value = Convert.ToInt32(r.Cells[1].Value);
       cmd.Parameters["@book"].Value = r.Cells[0].Value.ToString();
       command.ExecuteNonQuery();
    }

}
connection.Close();

最后的说明。每次需要时都应该创建一个连接对象。从您的代码中不清楚是否是这种情况。使用以下模式。 (Using Statement)

using(OleDbConnection connection = new OleDbConnection(....))
{
    ... code that uses the connection ....
} // <- here the connection is closed and disposed