爲何說是最佳實踐呢?由於在實際開發中踩坑了,並且發現網上大多數文章給出的解決方法都不能很好地解決問題。尤爲是在獲取類型爲OracleDbType.RefCursor
,輸出爲:ParameterDirection.Output
數據的時候。網上千篇一概的說寫一個OracleDynamicParameters
的擴展。可是給出的代碼 OracleDynamicParameters
中對於Get
方法都沒有貼出代碼或者Get
方法的書寫存在必定的問題。這就致使了,若是你執行一個Oracle存儲過程而且獲取OracleDbType.RefCursor
類型的輸出值的時候就會爆「OracleDbType沒法轉換成CLR類型」的問題。具體的異常提示這裏就不截圖了,大體就是須要進行一下OracleDbType
到CLR類型的一個轉換。html
做者:依樂祝
原文連接:http://www.javashuo.com/article/p-pykbabbz-ne.htmlgit
若是你用Dapper來進行Oracle的存儲過程的操做,恰好這個存儲過程須要傳入一個遊標類型的輸出值,以下所示,你會發如今DbType
中是不包含遊標類型的。github
var p = new DynamicParameters(); p.Add("foo", "bar"); p.Add("baz_cursor", dbType: DbType.?(沒有遊標類型) , direction: ParameterDirection.Output);
不知道你們還有咩有印象,我在2018年的時候曾經翻譯了一篇關於在.NET Core中使用Dapper操做Oracle的文章,沒有印象的能夠點擊連接查看下[譯]ASP.NET Core Web API 中使用Oracle數據庫和Dapper看這篇就夠了。數據庫
這篇文章是翻譯的,裏面有一個OracleDynamicParameters
的擴展方法的代碼,具體的代碼你們能夠點擊上面的連接進行查看,使用這個OracleDynamicParameters
進行Oracle存儲過程的查詢是不會有問題的,並且也支持包含OracleDbType.RefCursor
類型的存儲過程的執行。由於它在Add
參數的時候傳入的是數據類型是OracleDbType
類型,以下所示:編程
所以這裏咱們能夠在添加參數的時候,傳入遊標類型了。以下所示:c#
可是這時候,若是這個遊標類型是輸出參數,這時候你若是經過下面這種方式來直接獲取的話,就會爆咱們文章開頭的錯誤了。數組
異常的大概意思就是「返回的是OracleDbType類型,無法直接轉換成CLR類型,如上面的int類型」。oracle
既然知道了異常的問題,那麼接下來咱們就須要解決這個問題了。大概的解決思路也就是從新實現下Get<T>
方案,在獲取數據的時候執行下OracleDataType到CLR類型的轉換。可能這個對大夥有點難度,可是別擔憂,咱們有GayHub,所以我在GayHub上果真找到了現成的實現,具體的代碼能夠點這裏查看 這裏實現的OracleDynamicParameters
比咱們實現的更強大,功能也更豐富。同時也實現了Get<T>
方法的轉換。以下圖所示:app
同時,做者也發佈了Nuget包,來讓你遠離996.使用方式以下:工具
而後在文件中引入Dapper.Oracle
的明明空間就能夠了。
同時此項目的GitHub地址有必要貼一下:https://github.com/DIPSAS/Dapper.Oracle
正如做者所說:此程序集添加了對編寫Oracle特定SQL的支持,該SQL支持Oracle託管提供程序對參數使用的全部DbType,支持對命令設置各類屬性(lobfetchsize、arraybindcount、bindbyname),以及對參數設置collectiontype。使用此包,如今能夠運行返回refcursor的存儲過程,或者使用數組綁定計數來執行帶有參數數組的SQL語句。
今天給你們分享了一個咱們.NET Core中使用Dapper操做Oracle存儲過程遇到的坑,同時給出了我的認爲是最佳實現的解決方法。但願對你們有所幫助。Dapper是一個好的工具,可讓你編寫高性能的數據庫操做代碼。可是,有時在對Oracle的支持上,可能有一些欠缺,這時候就有一批樂於分享,甘於貢獻的編程愛好者來分享優秀的擴展來讓咱們遠離996. 最後的最後也呼籲你們一塊兒來分享,爲.NET Core社區貢獻一份力。我是依樂祝,我爲本身帶鹽!!!有興趣的小夥伴能夠掃碼下方二維碼關注個人公衆號,不按期分享.NET Core實戰技巧。