<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET Core 中使用 Dapper 操作 Oracle 存儲(chǔ)過程最佳實(shí)踐

          共 2083字,需瀏覽 5分鐘

           ·

          2019-05-23 06:50

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

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

          Dapper的DynamicParameters不支持游標(biāo)類型

          如果你用Dapper來進(jìn)行Oracle的存儲(chǔ)過程的操作,剛好這個(gè)存儲(chǔ)過程需要傳入一個(gè)游標(biāo)類型的輸出值,如下所示,你會(huì)發(fā)現(xiàn)在DbType中是不包含游標(biāo)類型的。

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

          自定義OracleDynamicParameters來支持游標(biāo)類型

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

          這篇文章是翻譯的,里面有一個(gè)OracleDynamicParameters的擴(kuò)展方法的代碼,具體的代碼大家可以點(diǎn)擊上面的鏈接進(jìn)行查看,使用這個(gè)OracleDynamicParameters進(jìn)行Oracle存儲(chǔ)過程的查詢是不會(huì)有問題的,而且也支持包含OracleDbType.RefCursor類型的存儲(chǔ)過程的執(zhí)行。因?yàn)樗贏dd參數(shù)的時(shí)候傳入的是數(shù)據(jù)類型是OracleDbType類型,如下所示:

          我1.png

          因此這里我們可以在添加參數(shù)的時(shí)候,傳入游標(biāo)類型了。如下所示:

          我2.png

          但是這時(shí)候,如果這個(gè)游標(biāo)類型是輸出參數(shù),這時(shí)候你如果通過下面這種方式來直接獲取的話,就會(huì)爆我們文章開頭的錯(cuò)誤了。

          我3.png

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

          解決異常問題

          既然知道了異常的問題,那么接下來我們就需要解決這個(gè)問題了。大概的解決思路也就是重新實(shí)現(xiàn)下Get方案,在獲取數(shù)據(jù)的時(shí)候執(zhí)行下OracleDataType到CLR類型的轉(zhuǎn)換。可能這個(gè)對(duì)大伙有點(diǎn)難度,但是別擔(dān)心,我們有GayHub,因此我在GayHub上果然找到了現(xiàn)成的實(shí)現(xiàn),具體的代碼可以點(diǎn)這里查看?這里實(shí)現(xiàn)的OracleDynamicParameters比我們實(shí)現(xiàn)的更強(qiáng)大,功能也更豐富。同時(shí)也實(shí)現(xiàn)了Get方法的轉(zhuǎn)換。如下圖所示:

          窩.png

          同時(shí),作者也發(fā)布了Nuget包,來讓你遠(yuǎn)離996.使用方式如下:

          我5.png

          然后在文件中引入Dapper.Oracle的明明空間就可以了。
          同時(shí)此項(xiàng)目的GitHub地址有必要貼一下:https://github.com/DIPSAS/Dapper.Oracle

          正如作者所說:此程序集添加了對(duì)編寫Oracle特定SQL的支持,該SQL支持Oracle托管提供程序?qū)?shù)使用的所有DbType,支持對(duì)命令設(shè)置各種屬性(lobfetchsize、arraybindcount、bindbyname),以及對(duì)參數(shù)設(shè)置collectiontype。使用此包,現(xiàn)在可以運(yùn)行返回refcursor的存儲(chǔ)過程,或者使用數(shù)組綁定計(jì)數(shù)來執(zhí)行帶有參數(shù)數(shù)組的SQL語句。

          最后

          今天給大家分享了一個(gè)我們.NET Core中使用Dapper操作Oracle存儲(chǔ)過程遇到的坑,同時(shí)給出了個(gè)人認(rèn)為是最佳實(shí)現(xiàn)的解決方法。希望對(duì)大家有所幫助。Dapper是一個(gè)好的工具,可以讓你編寫高性能的數(shù)據(jù)庫操作代碼。但是,有時(shí)在對(duì)Oracle的支持上,可能有一些欠缺,這時(shí)候就有一批樂于分享,甘于貢獻(xiàn)的編程愛好者來分享優(yōu)秀的擴(kuò)展來讓我們遠(yuǎn)離996.
          最后的最后也呼吁大家一起來分享,為.NET Core社區(qū)貢獻(xiàn)一份力。我是依樂祝,我為自己帶鹽!!!有興趣的小伙伴可以掃碼下方二維碼關(guān)注我的公眾號(hào),不定期分享.NET Core實(shí)戰(zhàn)技巧。



          作者:依樂祝(祝雷)

          出處:https://www.cnblogs.com/yilezhu

          原文鏈接:https://www.cnblogs.com/yilezhu/p/10791877.html

          本文轉(zhuǎn)自博客園網(wǎng),版權(quán)歸原作者所有。

          瀏覽 87
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人操人人| 97超碰站 | 在线视频亚洲无码 | 99热6在线观看 | 青草偷拍视频 |