使用 Dapper 接收 Oracle Ref Cursor

沒實際遇到,但接連兩次被問到使用 Dapper 如何從 Ref Cursor 讀取結果,看來上天已強烈暗示我沒 PO 文分享,趕緊補上以免逆天遭譴。

爬文找到的做法都是靠自訂 OracleDynamicParameter 處理 Ref Cursor 對應轉換,循著 Stackoverlow 討論找到一個 Gist 分享的現成版本,將 OracleDynamicParameter.cs 加入專案,便可使用 OracleDynamicParameters 物件 .Add("cursor_name", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output) 宣告 Ref Cursor 接收查詢結果。Ref Cursor 可用於 PL/SQL Script 或 Stored Procedure,記得改用 QueryMultiple().Read() 讀取結果,如果是 Stored Procedure,QueryMultiple() 時需指定 commandType: CommandType.StoredProcedure 參數。

註:上述的 Gist 版 OracleDynamicParameter 配合 Dapper 新版使用時,第 163 列需加上第三個參數 false:appender = SqlMapper.CreateParamInfoGenerator(newIdent, false, false);

測試成功!

附上完成範例:

        static void Main(string[] args)
        {
            using (var cn = new OracleConnection(cs))
            {
                var p = new OracleDynamicParameters();
                p.Add("n", 1234, OracleDbType.Decimal);
                p.Add("rc", 
                    dbType: OracleDbType.RefCursor,
                    direction: ParameterDirection.Output);
                
                //使用 T-SQL Script 測試 Ref Cursor
                var cmd = @"
declare 
begin 
open :rc for select :n as n, sysdate as d from dual;
end;";
                var m = cn.QueryMultiple(cmd, p);
                var data = m.Read();
                Console.WriteLine(JsonConvert.SerializeObject(data));
 
                /*
                --假設 Stored Procedure 如下
                create or replace procedure MyProc(
                 n NUMBER,
                 rc OUT SYS_REFCURSOR 
                )
                as
                begin
                  open rc
                   for select n as N, sysdate as D
                         from dual;
                end;
                 */
 
                //Stored Procedure記得指定commandType
                m = cn.QueryMultiple("MyProc", p, commandType: CommandType.StoredProcedure);
                data = m.Read();
                Console.WriteLine(JsonConvert.SerializeObject(data));
 
            }
            Console.Read();
        }
 
歡迎推文分享:
Published 17 April 2017 10:05 PM 由 Jeffrey
Filed under: ,
Views: 2,568



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2017>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication