代码之家  ›  专栏  ›  技术社区  ›  dongdong

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

  •  3
  • dongdong  · 技术社区  · 6 年前

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

    当我改变时 @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 回复  |  直到 6 年前
        1
  •  2
  •   Marc Gravell    6 年前

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

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

    UPDATE testmyy SET namemy = ? WHERE ID = ?
    

    但正在添加 @ID 然后 @namemy . 这本质上 反转 参数顺序。


    现在,如何解决这个问题。Dapper支持伪位置参数, 预定的 对于那些 假装 支持命名参数。Access假装是,但不是很擅长。So:要触发dapper的伪位置参数处理,请使用:

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

    Dapper将其视为:

    更新testmyy SET namemy=?其中ID=?
    

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

        2
  •  1
  •   Amit Joshi user8575948    6 年前

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