没有为一个或多个必需参数提供值。 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
我有一个 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