7

dapper を使用して oracle アクセスを行っています。OracleDbType.Clob 型の出力パラメーターが必要なシナリオがあります。私はdapperを使用しているため、ベースDbType列挙を使用しているため、ここで提案されているようにDbType.Object列挙を使用していますhttp://docs.oracle.com/html/B14164_01/featOraCommand.htm OracleDbType.Clobの代わりになります。

ただし、これにより、コマンド パラメータ (dapper の詳細) が DbType オブジェクトおよび Oracle タイプの Blob に設定されます (DbConnection プロバイダが具体的な OracleParameter であるため)。この Oracle proc の問題は、このパラメーターが Blob ではなく Clob 型である場合にのみ機能します。

純粋な ADO コードは (OracleParameter や OracleConnection などを使用して) 魔法のように機能しますが、具体的な型を設定したり、この DbParameter 作成プロセスにフックして、返された CommandParameter でこの OracleType を変更したりする方法はないようです。

これは機能します:

using (OracleConnection conn = new OracleConnection("some connection string"))
{
      conn.Open();
      var cmd = new OracleCommand("ProcName", conn);
      cmd.CommandType = CommandType.StoredProcedure;
      var paramOne = new OracleParameter("ReturnValue", OracleDbType.Clob, int.MaxValue, null, ParameterDirection.Output);
      cmd.Parameters.Add(paramOne);
      cmd.ExecuteNonQuery();
      var value1 = paramOne.Value;
 }

これは失敗します:

DynamicParameters dyanmicParameters = new DynamicParameters();
dyanmicParameters.Add("ReturnValue", null, DbType.Object, ParameterDirection.Output);
connection.Execute("ProcName", dyanmicParameters, commandType: CommandType.StoredProcedure);
var val = dynamicParameters.Get<object>("ReturnValue");

何か案は??

ありがとう、

ジョン

4

2 に答える 2

3

私はあなたがずっと前にこれを尋ねたことを知っています。ただし、別のデータベース タイプでも同じ問題が発生しました。

基本的に、Dapper に関する問題の 1 つに遭遇します。それはマイクロオームであり、物事がどのように機能するかについてやや意見が分かれています。どのデータベース タイプでも動作すると主張しているにもかかわらず、主に MS SQL Server を念頭に置いて作成されているようです。これはほとんどの場合真実ですが、Clob、Blob、Geospatial などのより難解なデータ型に到達し始めると、これまで見てきたように物事が崩壊し始めます。

これを回避する唯一の方法は、カスタム クエリ パラメータを作成することです。ICustomQueryParameterここで例のソースを見ることができます: https://github.com/SamSaffron/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

次の行に移動します。

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter

基本的に、を使用する独自のコードを作成し、次のOracleDbType.Clobように使用します。

Query<Thing>("select * from Thing where Name = @Name", new { Name = new OracleClob { Value = "abcde" } });
于 2014-04-14T20:39:05.750 に答える