使用 Access 的 Dapper ORM 删除功能

Dapper ORM Delete functionality with Access

今天,当我使用 Access 时,我尝试通过更改 Access 中的 table 名称之一来进行一项测试,但不更新代码并尝试观察行为

比如我的代码是

Product product = new Product();                                                                                                 //Delete Works well
product.ProductNumber = "P1";
product.Description = "TestProduct1";

var deleteStatement = @"Delete from Product Where Description = @Description";
int outp = con.Execute(deleteStatement, new { Description = product.Description });

而我的产品 table 在数据库中是

在将 'Description' 更改为 'Descr' 之前一切正常。但是当我 运行 代码更改它之后(代码中没有更改任何内容),它会删除整个 table。我很迷惑。因为这是实际的,有人不小心更改了 table 名称并且没有在代码中更新。为什么会出现这个问题?以及如何对此进行有效性检查?

我个人认为,如果该字段不在 Access 数据库中,它应该 return 异常或什么都不做

更新

目前正在检查通过后删除

con.Query<Products>("select ProductNumber, Description from products")

如果正确的字段名称不在所需 table 中,这将生成异常。但这不能成为这个问题的答案。我期待某人的正确回答

我能够重现你的问题,这似乎与原始字段名称是 Description 和参数声明 @Description 导致 Dapper 创建一个 [=16] 有关=] 其 .ParameterNameDescription

在第一种情况下,当列 Description 实际存在时,Access 数据库引擎识别此

var deleteStatement = @"Delete from Product Where Description = @Description";
//                                                ^^^^^^^^^^^

作为有效的列名并且 DELETE 按预期工作

列重命名为 Descr 后,Access 数据库引擎不再将 Description 识别为字段名称(因为它不是),因此它成为另一个参数占位符。 似乎结果是被评估为

的语句
Delete from Product Where Description = Description

并且由于参数与自身的比较 Description = Description 将始终是 TRUE 那么它实际上与

相同
Delete from Product Where TRUE

所有行都被删除。

可以通过确保我们提供给 Dapper 的参数名称与字段名称不匹配来避免这种情况。例如,以下代码在 Description 字段重命名为 Descr.

后会抛出异常
var deleteStatement = @"Delete from Product Where Description = @d";
int outp = con.Execute(deleteStatement, new { d = product.Description });