2013-07-24 8 views
6

Używam dapper, aby uzyskać dostęp do Oracle. Mam scenariusz, w którym muszę mieć parametr wyjściowy z typem OracleDbType.Clob. Ponieważ używam wyrafinowanego, a więc używającego podstawowego wyliczenia DbType, używam wyliczenia DbType.Object zgodnie z sugestią tutaj http://docs.oracle.com/html/B14164_01/featOraCommand.htm, aby stać na OracleDbType.Clob.Dapper i Oracle Clob typ

Jednak ustawia parametr polecenia (w głąb dappera) na obiekt DbType i Blob typu oracle (jako dostawca DbConnection konkretny OracleParameter). Problem polegający na tym procencie Oracle działa tylko wtedy, gdy parametr ten ma typ Clob not Blob.

Czysty kod ADO działa jak zaklęcie (używając OracleParameter i OracleConnection itp.), Ale wydaje się, że nie ma sposobu, aby ustawić konkretny typ lub przechwycić w tym procesie tworzenia DbParameter w eleganckim, aby zmienić ten OracleType na zwróconym CommandParameter?

to działa:

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; 
} 

ta zawodzi:

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

Wszelkie pomysły ??

Dzięki,

Jon

Odpowiedz

3

wiem pytasz to dawno temu. Jednak napotkałem ten sam problem z innym typem bazy danych.

Zasadniczo napotkasz jeden z problemów z Dapper. To mikro-orszak, który w pewnym stopniu opowiadał o tym, jak rzeczy powinny działać. Wydaje się, że został napisany głównie z myślą o MS SQL Server, mimo że twierdzi, że działa z dowolnym typem bazy danych. Co w większej części jest prawdą, jednak gdy zaczniesz docierać do bardziej ezoterycznych typów danych, takich jak Clob's, Blob's, Geospatial, itd., Wszystko zaczyna się załamywać, jak już wiesz.

Jedynym sposobem obejścia tego problemu jest utworzenie niestandardowego parametru zapytania. Można spojrzeć na źródła ICustomQueryParameter na przykład tutaj: https://github.com/SamSaffron/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

zejść do tej linii:

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter 

Można by w zasadzie napisać własny, który wykorzystuje OracleDbType.Clob a następnie wykorzystać go tak:

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

Znalazłem to vijaysg/OracleDynamicParameters.cs

tworzy OracleDynamicParameters klasy iM interfejs Plementy IDynamicParameters.

Here jest jak z niego korzystać

próbkę:

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

i jak nazywają go Wytworny

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; 
} 

dla typu CLOB, wystarczy określić OracleDbType.Clob podczas dodawania parametru.

+0

Wygląda świetnie! Miły. –

+0

@MarcGravell, kiedy można wybrać tworzenie/używanie niestandardowej implementacji IDynamicParameters za pomocą ICustomQueryParameter? – Damian

+0

@Damian dokładnie jeden vs 0-do-wielu, w zasadzie –

Powiązane problemy