为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为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存储过程最佳实践的更多相关文章

  1. NET Core中使用Dapper操作Oracle存储过程

    .NET Core中使用Dapper操作Oracle存储过程最佳实践   为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...

  2. DotNet Core中使用dapper

    我们都知道,ORM全称是,Object Relationship Mapper,即,对象关系映射.也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架叫做dappe ...

  3. Java 编程中关于异常处理的 10 个最佳实践

    异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...

  4. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah

    paip.提升性能--多核编程中的java .net php c++最佳实践  v2.0 cah 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax ...

  5. github中fork分支和pullrequest的最佳实践

    github中fork分支和pullrequest的最佳实践 */--> code {color: #FF0000} pre.src {background-color: #002b36; co ...

  6. 在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle数据库

    前言 虽然一直在说"去IOE化",但是在国企和政府,Oracle的历史包袱实在太重了,甚至很多业务逻辑都是写在Oracle的各种存储过程里面实现的-- 我们的系统主要的技术栈是Dj ...

  7. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  8. Java中处理异常的9个最佳实践

    Java中的异常处理不是一个简单的话题.初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常. 这就是为什么大多数开发团队都有自己的异常处理的规则和方法.如果你是一个团队 ...

  9. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

随机推荐

  1. 实现Quartz的动态增删改查

    1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...

  2. Spring框架之Bean的作用范围和生命周期的注解

    1. Bean的作用范围注解 * 注解为@Scope(value="prototype"),作用在类上.值如下: * singleton -- 单例,默认值 * prototype ...

  3. EXP-00056:遇到oracle错误12154

    执行命令如下: 引用 exp user/pwd@dbname file=d:text.dmp owner=(user) 碰到了错误: 引用 EXP-00056:遇到oracle错误12154 ORA- ...

  4. RPM包制作方法

    一.RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理:现在应为RPM Package M ...

  5. BZOJ1106[POI2007]立方体大作战tet - 树状数组

    描述 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编 ...

  6. Mysql 查看表结构的命令

    创建数据库create database abc; 显示数据库 show databases; 使用数据库 use 数据库名; 直接打开数据库 mysql -h localhost -u root - ...

  7. IE8以下支持css3 border-radius渲染方法

    这两天在做个集团网站,web前端妹子技术水平不咋样,写个web和wap 真够费劲的,对之前流行的H5和css3 响应式看来不太会用,扔给我一个半成品~~·非说各种canvas和border-radiu ...

  8. kafka系列 -- 基础概念

    kafka是一个分布式的.分区化.可复制提交的发布订阅消息系统 传统的消息传递方法包括两种: 排队:在队列中,一组用户可以从服务器中读取消息,每条消息都发送给其中一个人. 发布-订阅:在这个模型中,消 ...

  9. hdu-1121(差分法--数学问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1121 参考文章:https://blog.csdn.net/fengzhizi76506/articl ...

  10. 《C++ Primer (V4)》读书笔记

    第2章 变量和基本类型 1.(P56)如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private:如果使用struct关键字,那么这些成员都是public. 第7 ...