问题描述
我有一个 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 无法将您的查询的某些部分识别为基础表(或表本身)的对象。
使用参数可以避免这个问题和一个更严重的称为 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