使用 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] 有关=] 其 .ParameterName
是 Description
。
在第一种情况下,当列 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 });
今天,当我使用 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] 有关=] 其 .ParameterName
是 Description
。
在第一种情况下,当列 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 });