我使用以下代码进行更新,但它无法正常工作。通话成功;没有例外。但更新并未反映在数据库中。
当我将@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);
答案 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 = ?
并且将知道使用严格的参数排序。基本上,它会起作用。