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();
导致错误:
没有为一个或多个必需参数提供值
两个字段都具有文本数据类型
我强烈怀疑,既然您使用了没有单引号的qqq
和xyz
,OleDbCommand
将它们视为参数。这就是为什么它需要两者的一些参数值。
因为如果它们是字符串,它们将与单引号一起使用,例如;
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();
其实我不知道qqq
和xyz
是什么。但是将它们嵌入到 sql 字符串中会导致它们被视为参数占位符,因此引擎会请求两个参数。