【问题标题】:Dapper and Oracle CRUD issues, how to?Dapper 和 Oracle CRUD 问题,如何解决?
【发布时间】:2012-04-05 02:14:27
【问题描述】:

如何让 Dapper.NET 对我的 Oracle 数据库进行 CRUD?

我有一个表名为:PLAYER_LOG 它的身份是由触发器完成的,这里是 sql

SELECT SQ_MASTER_SEQUENCE.NEXTVAL INTO tmpVar FROM dual;
:NEW.ID := tmpVar;

我的模特是:

public class PlayerLogStorage : IEntity //-> here is the identity
{       
    public string Cli { get; set; }
    public string PlayerAnswer { get; set; }
    public DateTime InsertDate { get; set; }
}

这是我的插入:

 using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
 {
            ctx.Query<PlayerLogStorage>("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate)", new
            {
                Cli = model.Cli,
                PlayerAnswer = model.PlayerAnswer,
                InsertDate = model.InsertDate
            });
 }

这里是个例外:

ORA-01008: not all variables bound

【问题讨论】:

    标签: c#-4.0 crud dapper


    【解决方案1】:

    我遇到了一些类似的事情,但是使用了返回语句。我发现的技巧是使用 DynamicParameters 对象。在我使用的系统中,插入语句必须在序列上调用 NextVal,它不在触发器中。

    var param = new DynamicParameters();
    
    param.Add(name: "Cli", value: model.Cli, direction: ParameterDirection.Input);
    param.Add(name: "PlayerAnswer", value: model.PlayerAnswer, direction: ParameterDirection.Input);
    param.Add(name: "InsertDate", value: model.InsertDate, direction: ParameterDirection.Input);
    param.Add(name: "Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
    
    using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
    {
        ctx.Execute("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate) returning Id into :Id", paramList);
    }
    
    var Id = param.get<int>("Id");
    

    【讨论】:

    • 谢谢,我会检查一下,你有更多使用 Oracle 的例子吗?
    • 我一直在尝试将 Dapper 和 Oracle 一起使用一段时间,并找到了解决一些怪癖的方法……如果您有特定的问题,我非常乐意回答。
    • 很好的答案@bwalk2895 :) 帮助我很多 :) 我目前正在使用 dapper 和 oracle :)
    • @bwalk2895 你是如何将字符串插入 clob 类型的?我使用 OracleDynamicParameter 并遇到了这个问题stackoverflow.com/questions/23145558你有什么想法吗?
    • @Timeless 对不起,我一年多前换了工作,从那以后就没有使用过 Oracle。我为使 oracle 与 Dapper.NET 一起工作而编写的所有代码都是我以前的工作。我记得的一件事是尝试创建一个接受 varchar 的 proc / 包,并让该 proc / 包将其转换为 CLOB。
    【解决方案2】:

    除了bwalk2895的回答,你也可以将你的模型对象传入DynamicParameters的构造函数,然后你只需要添加输出参数即可。节省几行代码,特别是对于具有许多属性的对象。示例:

    var param = new DynamicParameters(model);
    
    param.Add(name: "Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
    
    using (IDbConnection ctx = DbConnectionProvider.Instance.Connection)
    {
        ctx.Execute("INSERT INTO PLAYER_LOG (CLI, ANSWER, INSERT_DATE) VALUES (:Cli, :PlayerAnswer, :InsertDate) returning Id into :Id", param);
    }
    
    var Id = param.Get<int>("Id");
    

    更新:更正方法名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2011-01-31
      • 1970-01-01
      • 2010-09-11
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多