OracleでDapperを使用する

c# dapper oracle

質問

私たちはデータベースプロバイダとしてOracleを使用し、下層のDapperを使用して、データアクセス層の一部(保守が難しく、XSDをマージするのが難しい)をより安全なリポジトリベースのパターンに置き換えました。しかし、oracleで使用する際には、いくつかの問題が発生しています。

  • 名前付きパラメータ:これらは無視されているように見えますが、問合せで使用されるときはいつでも、Oracleはそれらを任意の順序で解釈するようです。 SqlMapperは正しく名前付きのパラメータを返しますが、Oracleでは正しく解釈されません

  • 変数の "@"命名規則は、oracleという名前の付いたパラメータと互換性がありません。どのパラメータの前にも ":"が表示されることが期待されます

誰か以前にこれに遭遇したことがあり、回避策がありますか?

受け入れられた回答

IMO、ここで正しいアプローチは(ように、データベース固有のパラメータのプレフィックスを使用しないように(受け入れ答えあたりなど)される@ 、SQLサーバー用: Oracle用) -ではなく、むしろ: まったく接頭辞を使用していません。だから最終的にこれは:

il.Emit(OpCodes.Ldstr, prop.Name);

(等)

特に、 AppDomainごとに1つのベンダに制限されるため、 staticプロパティは悪いでしょう。

この変更によりDapperが更新されました。また、 BindByNameを動的に検出し、それに応じて設定します(すべてOracleCommandへの参照を必要としません)。


人気のある回答

OracleコマンドでBindByNameプロパティをtrueに設定する必要があるため、指定されたパラメータの問題が解決されています。これを解決するには、SqlMapper自体を調整する必要があります。これはちょっと変わっていません(特定のOracleコマンドの型チェックに依存しています)が、私たちのニーズに応えます。変更にはSetupコマンドを更新する必要があります。コマンドフォームを作成した後、タイプした接続オブジェクトをチェックしてフラグをso(〜ln 635)に設定します。

var cmd = cnn.CreateCommand();
if (cmd is OracleCommand)
{
    ((OracleCommand)cmd).BindByName = true; // Oracle Command Only
}

最後に、CreateParamInfoGeneratorメソッドを変更することに伴うパラメータ名の "@"から ":"問題の問題を解決しました。私は静的な文字列を追加しました - DefaultParameterCharacterの値を ":"に設定し、次にln 530を以下から変更しました:

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [c

il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [command] [name] (Changed @ to : for oracle)

そしてln546は:

il.Emit(OpCodes.Ldstr, "@" + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)

に:

il.Emit(OpCodes.Ldstr, DefaultParameterCharacter + prop.Name); // stack is now [parameters] [parameters] [parameter] [parameter] [name] (Changed @ to : for oracle)

これにより、Oracleのコマンドで完璧な作業ができました



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ