名前付きパラメーターの問題の解決は、Oracle コマンドが BindByName プロパティを true に設定する必要があるためであることが判明しました。これを解決するには、SqlMapper 自体を微調整する必要がありました。この調整は移植性がないため (特定の Oracle コマンドの型チェックに依存するため)、これは少し厄介ですが、当面のニーズには合っています。この変更には、SetupCommand メソッドの更新が含まれます。接続オブジェクトからコマンドを作成した後、check を入力し、次のようにフラグを設定します (~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)
および ln 546 から:
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コマンドでdapperが問題なく動作しました