为什么 Dapper 即使没有例外也不更新数据到 MS Access?

Why Dapper does not UPDATE data to MS Access even though no exception?

我使用了以下代码进行更新,但它不起作用。调用成功;也不例外。但是更新没有反映在数据库中。

我把@id改成2就成功了

OpenSqlConnection();

tm = new testmyy();
tm.ID = 2;
tm.namemy = "1233";

// update fails
string query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = @ID";  

// update successful
// query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = 2";   

int i = conn.Execute(query2, tm);

使用DynamicParameters。修改您的代码如下:

var param = new DynamicParameters();
param.Add("@ID", 2);
param.Add("@namemy", 1233);
string query2 = "UPDATE testmyy SET namemy = @namemy WHERE ID = @ID";
int i = conn.Execute(query2, param, .....);

这里的问题是"access"(来自github链)。 access ADO.NET 提供程序有点损坏 - 它允许命名参数,但 access 本身不允许 - 它只支持 ? 占位符。更多:它添加占位符的顺序不是基于找到命名参数的顺序。所以基本上:访问对参数顺序非常 严格,这在使用命名参数时并不重要。我认为您的情况是访问提供商正在发生变化:

UPDATE testmyy SET namemy = @namemy WHERE ID = @ID

UPDATE testmyy SET namemy = ? WHERE ID = ?

但添加 @ID 然后 @namemy。这基本上 颠倒了 参数顺序。


现在,如何解决这个问题。 Dapper 支持伪位置参数,intended 对于甚至 pretend 不支持命名参数的提供者。 Access 假装是,但不是很擅长。所以:要触发 dapper 的伪位置参数处理,请使用:

UPDATE testmyy SET namemy = ?namemy? WHERE ID = ?ID?

Dapper 会将其视为:

UPDATE testmyy SET namemy = ? WHERE ID = ?

并且会知道使用严格的参数排序。基本上,它会起作用。