2012-03-20 3 views
4

Dapper.NETをOracle DBにCRUDするにはどうすればよいですか?Dapperと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

私は少し似たようなものに遭遇しましたが、return文を使用しました。私が見つけたトリックは、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"); 
+0

おかげで、あなたのOracleで使用するのより多くの例がありますか? – IamStalker

+0

私は今DapperとOracleを一緒に使って実験してきましたが、いくつかの癖のある方法を見つけました...特定の質問があれば、私は答えて喜んでいます。 – bwalk2895

+0

素晴らしい答え@ bwalk2895 :) helpme alot :)私は現在oracleでdapperを使っています:) –

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

アップデート:修正メソッド名、私はそれをチェックアウトします