OleDbCommand,未给出任何值

本文关键字:任何值 OleDbCommand | 更新日期: 2023-09-27 18:34:03

带有一个访问表(客户)和两个字段(客户ID,客户名称):

string queryString = "INSERT INTO Customers (CustomerID, CompanyName)  VALUES (qqq, xyz)";
OleDbCommand command = new OleDbCommand(queryString, connection);
command.ExecuteNonQuery();

导致错误:

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

两个字段都具有文本数据类型

OleDbCommand,未给出任何值

我强烈怀疑,既然您使用了没有单引号的qqqxyzOleDbCommand将它们视为参数。这就是为什么它需要两者的一些参数值。

因为如果它们是字符串,它们将与单引号一起使用,例如;

INSERT INTO Customers (CustomerID, CompanyName)  VALUES ('qqq', 'xyz')

如果它们是一些变量,并且想要将它们添加到命令中,则应始终使用参数化查询来防止 SQL 注入攻击。

using(OleDbConnection connection = new OleDbConnection(conString))
using(OleDbCommand command = _connection.CreateCommand())
{
    command.CommandText = "INSERT INTO Customers(CustomerID, CompanyName) VALUES(?, ?)";
    command.Parameters.Add("@p1", OleDbType.VarChar).Value = qqq;
    command.Parameters.Add("@p2", OleDbType.VarChar).Value = xyz;
    connection.Open();
    command.ExecuteNonQuery();
}

对于字符列来说,CustomerID是一个非常糟糕的名称,因为作为用于数值的一般ID部分。

应使用参数化查询将值传递给数据库引擎

string queryString = "INSERT INTO Customers (CustomerID, CompanyName)  VALUES (?,?)";
OleDbCommand command = new OleDbCommand(queryString, connection);
command.Parameters.AddWithValue("@p1", valueForCustomerIDFIeld)
command.Parameters.AddWithValue("@p2", valueForComapnyNameFIeld)
command.ExecuteNonQuery();

其实我不知道qqqxyz是什么。但是将它们嵌入到 sql 字符串中会导致它们被视为参数占位符,因此引擎会请求两个参数。