没有为一个或多个必需参数指定值 C#

如何解决没有为一个或多个必需参数指定值 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 无法将您的查询的某些部分识别为基础表(或表本身)的对象。
使用参数可以避免这个问题和一个更严重的称为 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?