带有 Access 的 Dapper,更新语句部分不起作用

Posted

技术标签:

【中文标题】带有 Access 的 Dapper,更新语句部分不起作用【英文标题】:Dapper with Access, update statement partially not working 【发布时间】:2016-09-06 01:40:40 【问题描述】:

我有一个产品类并尝试使用 Access 数据库评估 Dapper。选择、删除和插入操作工作正常,但更新操作有问题。它以一种方式工作,只有下面的代码)

当我尝试根据 ProductNumber 更改 Description 时,它可以工作(updateStatement2)并且描述会更新,但是当我尝试更改 ProductNumber em> 基于 Description (updateStatement1) 它不起作用并且 ProductNumber 没有得到更新。这对我来说有点奇怪。这是一个错误还是我错过了什么?我的数据库只是一个基本的,没有设置主键。我在下面附上了截图

(有关更多信息,请参阅下面的代码)

public class Products

    public string ProductNumber  get; set; 
    public string Description  get; set; 


static void Main(string[] args)
            
    using (var con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"))
    
        Products product2 = new Products();
        product2.ProductNumber = "P2";
        product2.Description = "TestProduct2Changed";
        var updateStatement2 = @"Update Products Set Description = @Description Where ProductNumber = @ProductNumber";
        int outp2 = con.Execute(updateStatement2, product2);


        Products product1 = new Products();
        product1.ProductNumber = "P3Changed";
        product1.Description = "TestProduct3";
        var updateStatement1 = @"Update Products Set ProductNumber = @ProductNumber Where Description = @Description";
        int outp1 = con.Execute(updateStatement1, product1);
    

我正在使用 Dapper 版本 1.50.2。这是我的数据库截图

【问题讨论】:

存储的值中是否有空格(描述)? 如果我们传递动态参数,它就可以工作。我认为 Dapper 的问题很少。 con.Execute(updateStatement2, new ProductNumber = "P3Changed", Description = "TestProduct3"); 【参考方案1】:

看起来 ADO Access 命令要求参数的出现顺序与它们在 SQL 查询中出现的顺序相同。

在您的原始代码中,对于有效的查询,参数按字母顺序出现在查询字符串中 -

Update Products Set Description = @Description Where ProductNumber = @ProductNumber

之所以有效,是因为属性是按字母顺序从“product2”中获取的。这可能不是设计使然,可能只是反射列出它们的顺序。

在失败的查询中,参数按字母倒序显示 -

Update Products Set ProductNumber = @ProductNumber Where Description = @Description

.. 这失败了,因为在 Access 中错误分配了参数值。

您应该能够通过更改动态参数替代中的参数顺序来确认这一点。我尝试使用动态参数,当参数的顺序与它们在 SQL 查询中出现的顺序相同时,它会起作用,但如果不是,则会失败。我使用的数据库和你的不太一样,但下面应该说明我在说什么:

// Doesn't work (parameter order is incorrect)
con.Execute(
    "Update People Set PersonName = @PersonName Where Notes = @Notes",
    new  Notes = "NotesChanged", PersonName = "New Name" 
);

// DOES work (parameter order is correct)
con.Execute(
    "Update People Set PersonName = @PersonName Where Notes = @Notes",
    new  PersonName = "New Name", Notes = "NotesChanged" 
);

在尝试查找有关此的更多信息时,我遇到了这个答案,不幸的是它似乎证实了这个问题:https://***.com/a/11424444/3813189

我想您在其他问题之一中提到的custom SQL generator 可能会做一些魔术来解析查询并按照参数必须出现的顺序检索参数,然后确保以正确的顺序提供它们。如果有人正在维护 DapperExtensions 的 Access 连接器,那么可能值得提出一个问题。因为,目前,我认为您是正确的,这是图书馆的问题。

【讨论】:

以上是关于带有 Access 的 Dapper,更新语句部分不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有内部联接和子查询的 Microsoft Access 更新语句

使用列表参数批量插入/更新调用到 Dapper 中对数据库的单个操作/请求

在 JAVA 中使用带有 MS Access 2010 数据库的 Update 语句

MS Access - 带有组合框和文本框的 If 语句

带有 SQL Server 后端更新的 MS Access 失败且没有错误

使用子查询更新语句