.NET Core中使用Dapper操作Oracle存儲過程最佳實踐

来源:https://www.cnblogs.com/yilezhu/archive/2019/04/30/10791877.html
-Advertisement-
Play Games

為什麼說是最佳實踐呢?因為在實際開發中踩坑了,而且發現網上大多數文章給出的解決方法都不能很好地解決問題。尤其是在獲取類型為 ,輸出為: 數據的時候。網上千篇一律的說寫一個 的擴展。但是給出的代碼 中對於 方法都沒有貼出代碼或者 方法的書寫存在一定的問題。這就導致了,如果你執行一個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類型,如下所示:

1556529039421

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

1556529227768

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

1556529480329

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

解決異常問題

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

1556530050145

同時,作者也發佈了Nuget包,來讓你遠離996.使用方式如下:

1556530157817

然後在文件中引入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實戰技巧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 串口掃描槍的簡單實現 基於串口通訊的掃描槍的實現,主要藉助SerialPort類,表示串列埠資源。實現很簡單: 工具:usb轉RS232轉接頭/個,掃描槍/套, 掃描槍串口接入轉接頭,轉接頭插電腦 接下來具體代碼實現 1 using System; 2 using System.Collectio ...
  • 如下圖,在憑證編輯窗體中,有的單元格不需要數字,但如果錄入數字後再刪除,會觸發數字驗證,單元格顯示紅色框線,導致不能執行其他操作。 Xaml代碼如下: 解決思路是用轉換器Converter代替StringFormat: Xmal主要代碼: C#主要代碼: ...
  • DataGrid中數據顯示如下圖,數據格式比較雜亂。希望達到以下要求:(1)所有數據保留兩位小數;(2)超過1000的數字顯示千分位;(3)如果數據為0,不顯示。 首先想到用StringFormat進行格式化: 效果如下圖,希望實現的要求(1)和(2)達到了,但(3)如果數據為0,不顯示的要求沒有達 ...
  • 在前面大致講了設計模式六大原則及三大模型(行為型、創建型、結構型)23種設模式;本文講模版方法屬於行為型模式; 模版方法:簡單講是定了一個演算法骨架,將可變的部分延遲到了子類,由子類來實現,封裝不可變的,也是一種多態的實現; 有這樣的一個場景:需要對數據進行CURD操作,且能支持不同的資料庫操作,我們 ...
  • 1. 獲取瀏覽器信息 2. IE 瀏覽器訪問頁面時 3. FireFox 瀏覽器訪問頁面時 ...
  • .Net平臺下相容.NET Standard 2.0,一個實現以Lambda表達式轉轉換標準SQL語句,支持MySQL、SQL Server資料庫方言,使用強類型操作數據的輕量級ORM工具,在減少魔法字串同時,通過靈活的Lambda表達式組合,實現業務數據查詢的多樣性。 如果想找到替代EF方案,Sq... ...
  • 本篇是對EFCore 進行下封裝並實現基本的增刪改查的同步非同步方法及針對不同資料庫的批量插入、sql語句直接操作資料庫; 一、 先定義基礎倉儲介面IRepository 二、實現IRepository介面 三、BaseRepository是個抽象類,有些比較複雜的sql語句通過EF來處理比較麻煩,還 ...
  • 項目開始設計的是運行在windows下,所以一開始採用的是windows服務模式來獲取多媒體文件信息,後來要求調整為可以在Linux下運行,經過這兩天的資料查找,實現了Linux下通過.NET來獲取多媒體文件信息的功能。詳情如下: 1、運行環境是CentOS 7 2、編譯環境是VS2017+.NET ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...