DapperおよびOracle Clob型

ado.net dapper oracle

質問

私はいくつかのOracleアクセスを行うためにdapperを使用しています。私はOracleDbType.Clobのタイプで出力パラメータを持つ必要があるシナリオを持っています。私はdapperを使用しているので、基底のDbType列挙を使用しているので、私はDbType.Object列挙型を使用しています。http: //docs.oracle.com/html/B14164_01/featOraCommand.htmでOracleDbType.Clobを使用しています。

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

純粋なADOコードは、(OracleParameterとOracleConnectionを使用して)魅力的に機能しますが、返されたCommandParameterでこのOracleTypeを変更するために、このDbParameter作成プロセスに具体的なタイプまたはフックを設定する方法はありません。

これは動作します:

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

何か案は??

ありがとう、

ジョン

受け入れられた回答

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

基本的に、あなたはDapperの問題の1つに走っています。それは物事がどのように働くべきかについて多少意見があります。それは主にMS SQL Serverを念頭に置いて書かれているようですが、どのデータベースタイプでも動作すると主張しています。ほとんどの部分が真実ですが、Clob、Blob、Geospatialなどのより難解なデータ型に慣れ始めると、あなたが見たように事態が悪化し始めます。

この問題を回避するには、カスタムQueryパラメータを作成するしかありません。ここでは、 ICustomQueryParameterソースを見てみることができます: https : //github.com/SamSaffron/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

この行に行く:

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter

基本的には、 OracleDbType.Clobを使用して独自に作成し、次のように使用しOracleDbType.Clob

Query<Thing>("select * from Thing where Name = @Name", new { Name = new OracleClob { Value = "abcde" } });

人気のある回答

このvijaysg / OracleDynamicParameters.csが見つかりました

OracleDynamicParametersクラスを作成し、 IDynamicParametersインタフェースを実装します。

使用方法は次のとおりです

サンプル:

PROCEDURE GetUserDetailsForPIDM (i_id    IN   NUMBER,
                o_user           OUT SYS_REFCURSOR,
                o_roles          OUT SYS_REFCURSOR);

それをdapperと呼ぶ方法

public static User GetUserDetailsByID( int ID ) {
    User u = null;
    using ( OracleConnection cnn = new OracleConnection( ConnectionString ) ) {
        cnn.Open( );
        var p = new OracleDynamicParameters( );
        p.Add( "i_id", ID );
        p.Add( "o_user", dbType:OracleDbType.RefCursor, direction: ParameterDirection.Output );
        p.Add( "o_roles", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output );

        using ( var multi = cnn.QueryMultiple( "PKG_USERS.GetUserDetailsForID", param: p, commandType: CommandType.StoredProcedure ) ) {
            u = multi.Read<User>( ).Single( );
            u.Roles = multi.Read<UserRole>.ToList( );
        }
    }
    return u;
}

Clob型の場合は、パラメータを追加するときにOracleDbType.Clobを指定します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow