Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行

Posted

技术标签:

【中文标题】Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行【英文标题】:OleDb parameter query in Winforms (C#): no errors but no rows updated 【发布时间】:2015-06-09 14:50:22 【问题描述】:

我正在尝试更新 MS Access 中的表,但更新操作不起作用并且我没有收到错误消息。

rowsAffected 为 0,因此没有更新任何内容。

这是我的代码:

public bool UpdateAddress(AddressModel address)
    
        using (OleDbCommand dbCommand = new OleDbCommand())
        
            // Set the command object properties
            dbCommand.Connection = new OleDbConnection(this.ConnectionString);
            dbCommand.CommandType = CommandType.Text;
            dbCommand.CommandText = "Update Addresses " +
        " Set [Street] = @Street, [PostalCode] = @PostalCode, " +
        "  [City] = @City, [Contact] = @Contact"+
        " Where [Address_ID] = @Address_ID";

            // Add the input parameters to the parameter collection
            dbCommand.Parameters.AddWithValue("@Street", address.Street);
            dbCommand.Parameters.AddWithValue("@PostalCode", address.PostalCode);
            dbCommand.Parameters.AddWithValue("@City", address.City);
            dbCommand.Parameters.AddWithValue("@Address_ID", address.Address_ID);
            dbCommand.Parameters.AddWithValue("@Contact", address.Contact);

            // Open the connection, execute the query and close the connection
            dbCommand.Connection.Open();
            var rowsAffected = dbCommand.ExecuteNonQuery();
            dbCommand.Connection.Close();

            return rowsAffected > 0;
        
    
 AddressModel-Class:
  public class AddressModel

    public Int64 Address_ID  get; set; 

    public Int64 Customer_ID  get; set; 

    public string Street  get; set; 

    public string PostalCode  get; set; 

    public string City  get; set; 

    public string Contact  get; set; 

    public bool FirstAddress  get; set; 

可能是什么问题?

【问题讨论】:

数据库中可能不存在Address_ID?因此,没有任何内容与 WHERE 子句匹配,因此不会更新任何内容。我只是猜测,仅凭您提供的信息无法确定。但是如果没有错误,那么很可能查询正在成功执行,这意味着它没有按照您的预期进行,并且对于像这样的简单查询,那么 where 条件是最明显的罪魁祸首。在那里放一个断点,看看address.Address_ID在运行时是什么 这里是函数UpdateAddress的调试:地址是:Address_ID 4 long City "2222" string Contact "max" string Customer_ID 1 long FirstAddress false bool PostalCode " " string Street " " string跨度> 我确实有表中的最后一个 Adress_ID,即 4 在您正在更新的表中,是否有任何您未提供值的必填字段?另外,您能否在 dbCommand.CommandText 尝试更新表之前打印出它的值? 这里是:“更新地址集 [Street] = atStreet, [PostalCode] = atPostalCode, [City] = atCity, [Contact] = atContact Where [Address_ID] = atAddress_ID”。 at =@ 但是这里不允许使用这么多的@ 【参考方案1】:

对于System.Data.OleDb,参数是严格的位置。 OleDb 忽略参数 names 并且只注意参数占位符在 CommandText 中出现的顺序。因此,您需要以与它们在 CommandText 中出现的顺序完全相同的顺序来 .Add.AddWithValue 参数。

在您的情况下,您需要颠倒最后两个 dbCommand.Parameters.AddWithValue 语句的顺序:@Address_ID 必须是添加的最后一个参数,因为它的占位符最后出现在 CommandText 中。

【讨论】:

@Mohammad_N 如果 Gord 的回答解决了您的问题,您应该将其标记为答案。 没错 :)。我忘记了

以上是关于Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行的主要内容,如果未能解决你的问题,请参考以下文章

C# OleDb 插入带参数的整数

使用 Decimal 参数的数据类型不匹配 - OleDb、C#、Access

Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)

C# OleDb OUT 参数在调用 oracle 过程时失败

您如何解决此参数无效错误? (C#、VisualStudio、WinForms)

JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较