0

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

当我尝试根据ProductNumber更改描述时,它可以工作(updateStatement2)并且描述得到更新,但是当我尝试 根据 描述(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 版。这是我的数据库截图

在此处输入图像描述

4

1 回答 1

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 ://stackoverflow.com/a/11424444/3813189

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

于 2016-09-06T13:59:20.773 回答