为什么 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 = ?
并且会知道使用严格的参数排序。基本上,它会起作用。
我使用了以下代码进行更新,但它不起作用。调用成功;也不例外。但是更新没有反映在数据库中。
我把@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 = ?
并且会知道使用严格的参数排序。基本上,它会起作用。