Dapper 및 Oracle Clob 유형

ado.net dapper oracle

문제

일부 신탁 액세스를 위해 dapper를 사용하고 있습니다. 시나리오 유형이 OracleDbType.Clob 인 출력 매개 변수가 있어야합니다. 내가 dapper를 사용하고 기본 DbType 열거 형을 사용함에 따라 DbType.Object 열거 형을 사용하여 http://docs.oracle.com/html/B14164_01/featOraCommand.htm 에서 OracleDbType.Clob을 대신 사용하도록 제안했습니다.

그러나이 명령 매개 변수는 DbType 개체와 오라클 유형 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와 관련된 문제 중 하나에 부딪 히고 있습니다. 그것은 마이크로 옴 (micro-orm)입니다. 모든 데이터베이스 유형에서 작동한다고하지만 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 을 사용하는 자체 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);

그리고 그것을 더럽혀지는 방법

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
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.