Dapper with Access,更新语句部分不起作用

Dapper with Access, update statement partially not working

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

当我尝试根据 ProductNumber 更改 Description 时,它有效(updateStatement2)并且 Description 得到更新,但是当我尝试根据 Description (updateStatement1) 更改 ProductNumber 它不起作用并且 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 版。这是我的数据库截图

看起来 ADO 访问命令要求参数的出现顺序与它们在 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" }
);

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

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