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

时间:2018-01-08 04:11:36

标签: sql ms-access dapper

我使用以下代码进行更新,但它无法正常工作。通话成功;没有例外。但更新并未反映在数据库中。

当我将@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);

2 个答案:

答案 0 :(得分:1)

使用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, .....);

答案 1 :(得分:1)

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

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

UPDATE testmyy SET namemy = ? WHERE ID = ?

但添加@ID然后@namemy。这基本上反转参数顺序。

现在,如何解决这个问题。 Dapper支持伪位置参数,预期用于甚至假装以支持命名参数的提供商。访问假装,但不是很好。所以:要触发dapper的伪位置参数处理,请使用:

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

Dapper将此视为:

UPDATE testmyy SET namemy = ? WHERE ID = ?

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