2013-07-24 40 views
6

Tôi đang sử dụng công cụ lập bản đồ để thực hiện một số truy cập oracle. Tôi có một kịch bản mà tôi phải có một tham số đầu ra với một loại OracleDbType.Clob. Như tôi đang sử dụng dapper và do đó bằng cách sử dụng các DbType cơ sở liệt kê tôi đang sử dụng Enb DbType.Object như đề nghị ở đây http://docs.oracle.com/html/B14164_01/featOraCommand.htm để đứng trong cho OracleDbType.Clob.Dapper & Oracle Clob type

Tuy nhiên, điều này đặt tham số lệnh (sâu xuống trong dapper) là đối tượng DbType và loại orb Blob (như nhà cung cấp DbConnection là OracleParameter cụ thể). Vấn đề là Oracle proc này chỉ hoạt động nếu tham số này thuộc loại Clob chứ không phải Blob.

Mã ADO thuần túy hoạt động như một nét duyên dáng (Sử dụng OracleParameter và OracleConnection, v.v.) nhưng dường như không có cách nào để đặt loại hoặc móc cụ thể vào quá trình tạo DbParameter này trong trình đơn để thay đổi OracleType này trên CommandParameter được trả về?

này hoạt động:

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

này thất bại:

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

Bất kỳ ý tưởng ??

Cảm ơn,

Jon

Trả lời

3

Tôi biết bạn hỏi này một thời gian dài trước đây. Tuy nhiên tôi đã gặp phải vấn đề tương tự với một loại cơ sở dữ liệu khác nhau.

Về cơ bản, bạn đang gặp phải một trong các vấn đề với Dapper. Đó là một micro-orm, thats hơi có ý kiến ​​về cách mọi thứ nên làm việc. Nó dường như đã được viết chủ yếu với MS SQL Server trong tâm trí, mặc dù nó tuyên bố nó hoạt động với bất kỳ loại cơ sở dữ liệu. Mà đối với hầu hết các phần là đúng, tuy nhiên khi bạn bắt đầu để có được nhiều loại dữ liệu bí truyền như Clob, Blob, Geospatial, vv những thứ bắt đầu phá vỡ như bạn đã thấy.

Cách duy nhất xung quanh việc này là tạo thông số truy vấn tùy chỉnh. Bạn có thể nhìn vào nguồn ICustomQueryParameter cho một ví dụ ở đây: https://github.com/SamSaffron/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

Go xuống dòng này:

sealed partial class DbString : Dapper.SqlMapper.ICustomQueryParameter 

Bạn sẽ cơ bản viết riêng của bạn có sử dụng OracleDbType.Clob và sau đó sử dụng nó như thế này:

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

tôi thấy điều này vijaysg/OracleDynamicParameters.cs

Nó tạo ra OracleDynamicParameters lớp im plements IDynamicParameters giao diện.

Here là làm thế nào để sử dụng nó

mẫu:

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

và làm thế nào để gọi nó với đoan trang

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

Đối với kiểu CLOB, chỉ cần chỉ định OracleDbType.Clob khi thêm tham số.

+0

Có vẻ tuyệt vời! Tốt đẹp. –

+0

@MarcGravell khi nào người ta chọn tạo/sử dụng triển khai IDynamicParameters tùy chỉnh trên ICustomQueryParameter? – Damian

+0

@Damian chính xác một lần so với 0-to-nhiều, về cơ bản là –

Các vấn đề liên quan