日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core中使用Dapper操作Oracle存储过程最佳实践

發布時間:2023/12/4 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core中使用Dapper操作Oracle存储过程最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


為什么說是最佳實踐呢?因為在實際開發中踩坑了,而且發現網上大多數文章給出的解決方法都不能很好地解決問題。尤其是在獲取類型為OracleDbType.RefCursor,輸出為:ParameterDirection.Output數據的時候。網上千篇一律的說寫一個OracleDynamicParameters的擴展。但是給出的代碼?OracleDynamicParameters中對于Get方法都沒有貼出代碼或者Get方法的書寫存在一定的問題。這就導致了,如果你執行一個Oracle存儲過程并且獲取OracleDbType.RefCursor類型的輸出值的時候就會爆“OracleDbType無法轉換成CLR類型”的問題。具體的異常提示這里就不截圖了,大致就是需要進行一下OracleDbType?到CLR類型的一個轉換。

作者:依樂祝
原文鏈接:https://www.cnblogs.com/yilezhu/p/10791877.html

Dapper的DynamicParameters不支持游標類型

如果你用Dapper來進行Oracle的存儲過程的操作,剛好這個存儲過程需要傳入一個游標類型的輸出值,如下所示,你會發現在DbType中是不包含游標類型的。

var p = new DynamicParameters();
p.Add("foo", "bar");
p.Add("baz_cursor", dbType: DbType.?(沒有游標類型) , direction: ParameterDirection.Output);

自定義OracleDynamicParameters來支持游標類型

不知道大家還有咩有印象,我在2018年的時候曾經翻譯了一篇關于在.NET Core中使用Dapper操作Oracle的文章,沒有印象的可以點擊鏈接查看下[譯]ASP.NET Core Web API 中使用Oracle數據庫和Dapper看這篇就夠了。

這篇文章是翻譯的,里面有一個OracleDynamicParameters的擴展方法的代碼,具體的代碼大家可以點擊上面的鏈接進行查看,使用這個OracleDynamicParameters進行Oracle存儲過程的查詢是不會有問題的,而且也支持包含OracleDbType.RefCursor類型的存儲過程的執行。因為它在Add參數的時候傳入的是數據類型是OracleDbType類型,如下所示:

因此這里我們可以在添加參數的時候,傳入游標類型了。如下所示:

但是這時候,如果這個游標類型是輸出參數,這時候你如果通過下面這種方式來直接獲取的話,就會爆我們文章開頭的錯誤了。

異常的大概意思就是“返回的是OracleDbType類型,沒法直接轉換成CLR類型,如上面的int類型”。

解決異常問題

既然知道了異常的問題,那么接下來我們就需要解決這個問題了。大概的解決思路也就是重新實現下Get<T>方案,在獲取數據的時候執行下OracleDataType到CLR類型的轉換。可能這個對大伙有點難度,但是別擔心,我們有GayHub,因此我在GayHub上果然找到了現成的實現,具體的代碼可以點這里查看?這里實現的OracleDynamicParameters比我們實現的更強大,功能也更豐富。同時也實現了Get<T>方法的轉換。如下圖所示:

同時,作者也發布了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實戰技巧。


創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的.NET Core中使用Dapper操作Oracle存储过程最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。