【问题标题】:OleDbCommand, UPDATEOleDbCommand,更新
【发布时间】:2014-12-12 23:05:38
【问题描述】:

带有一个 Access 表 (CustomersTable) 和两个字段 (CustomerID, CustomerName):

command.CommandText = "UPDATE CustomersTable   SET CompanyName =  @p2   WHERE CompanyName =  @p1";
command.Parameters.Clear();
command.Parameters.Add("@p1", OleDbType.VarChar).Value = "xyz3";
command.Parameters.Add("@p2", OleDbType.VarChar).Value = "xyz4";
command.ExecuteNonQuery();

不会更改 CompanyName 字段。

【问题讨论】:

  • Ole Db 参数是位置未命名的。至少 JET 引用 @p2@p1 的顺序将引用您添加的第一个参数,然后是第二个参数。 IIRC JET 有一些准命名参数支持,其中引用 @p2@p1@p2 将引用第一个、第二个和第一个参数(所以虽然它们是位置的,但它有点像每个参数的第一个实例参数名称用于确定位置)。 TL;DR 不要使用 JET 或 ACE。

标签: c# oledb


【解决方案1】:

OleDbCommand 不支持命名参数。

来自OleDbCommand.Parameters property

OLE DB .NET 提供程序不支持传递命名参数 SQL 语句或存储过程的参数 当CommandType 设置为Text 时,OleDbCommand。在这种情况下, 必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameter 对象添加到 OleDbParameterCollection必须直接对应的位置 命令文本中参数的问号占位符

实际上,? 不是必须的,但它是一个命令。

也可以使用using statement 来处理您的数据库连接和对象。

using(OleDbConnection con = new OleDbConnection(conString))
using(OleDbCommand command = con.CreateCommand())
{
    command.CommandText = "UPDATE CustomersTable SET CompanyName = ? WHERE CompanyName = ?";
    command.Parameters.Add("@p1", OleDbType.VarChar).Value = "xyz3";
    command.Parameters.Add("@p2", OleDbType.VarChar).Value = "xyz4";
    con.Open();
    command.ExecuteNonQuery();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-05-03
    • 2023-03-14
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多