2012-03-20 36 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"); 

更新:修正方法名