2012-03-20 38 views
4

如何让Dapper.NET能够删除我的Oracle数据库?小巧玲珑和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 

回答

9

我遇到了一些类似的问题,但使用了返回语句。我发现的技巧是使用DynamicParameters对象。在我使用的系统中,insert语句必须在序列上调用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"); 
+0

感谢,我将检查出来,你与Oracle使用的更多的例子? – IamStalker 2012-06-09 08:19:03

+0

我一直在尝试使用Dapper和Oracle一段时间,并且已经找到了一些怪癖的方法......如果你有一个特定的问题,我很乐意回答。 – bwalk2895 2012-06-13 20:29:00

+0

很好的回答@ bwalk2895 :) helpme很多:)我目前正在使用精灵与甲骨文:) – 2013-06-11 08:29:15

6

除了bwalk2895的回答,您还可以通过在你的模型对象DynamicParameters的构造函数,然后你只需要添加输出PARAMATERS。保存几行代码,特别是对于具有多个属性的对象。例如:

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"); 

更新:修正方法名