Dapper with Access,更新声明部分无法正常工作

时间:2016-09-06 01:40:40

标签: dapper micro-orm

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

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

enter image description here

1 个答案:

答案 0 :(得分: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

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