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

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  2. 集群应用服务器环境中会话管理(复制)的Oracle Coherence最佳实践

    Oracle Coherence是一种内存中数据网格产品,也广泛用于跨应用程序服务器节点集群的会话复制. 它支持各种应用程序服务器,例如WebLogic,WebSphere,Tomcat,JBoss等 ...

  3. RAC 和 Oracle Clusterware 最佳实践和初学者指南 (Solaris) (文档 ID 1526517.1)

      RAC 和 Oracle Clusterware 最佳实践和初学者指南 (Solaris) (文档 ID 1526517.1) 转到底部 文档内容 用途   适用范围   详细信息   RAC 和 ...

  4. RAC 和 Oracle Clusterware 最佳实践和初学者指南(平台无关部分) (文档 ID 1526083.1)

      RAC 和 Oracle Clusterware 最佳实践和初学者指南(平台无关部分) (文档 ID 1526083.1) 转到底部 文档内容 用途   适用范围   详细信息   RAC 平台特 ...

  5. [vue] 实际工作中,你总结的vue最佳实践有哪些?

    [vue] 实际工作中,你总结的vue最佳实践有哪些? .babelrc 是目前 babel-polyfill 的最佳实践 { "presets": [ [ "@babe ...

  6. java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

    java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...

  7. 如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

    原文来自互联网,由长沙DotNET技术社区编译. 本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-ne ...

  8. wpf绑定treeview 带查找_如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

    本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/ 从事大型企 ...

  9. jumbo 安装mysql,RAC 和 Oracle Clusterware 最佳实践和初学者指南「ID 1526083.1」

    In this Document Applies to: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.3 [Re ...

最新文章

  1. nginx try_files的理解
  2. 【Python基础】Python 函数使用总结
  3. Android JNI开发流程介绍
  4. 查询数据库 收集 (如某个字段不是中文)
  5. 按照c语言规首字母只能是,C语言--指针 - osc_nbqoh20k的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. LeetCode(136)——只出现一次的数字(JavaScript)
  7. java取得泛型,Java取得泛型类型
  8. 标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
  9. 测试工程师的福利!各远程移动测试平台对比分析
  10. 初识SpringCache
  11. 转手动档汽车的换挡技巧
  12. ubuntu20.04修改用户名【保留文件】
  13. Altium Designer Pcb 快捷键
  14. 要做研发高手,就是必须能看英文、写英文
  15. 文华财经是C语言编程吗,各位大神们,帮我把这指标改下,文华财经里不能用...
  16. electron-vue-element从零搭建项目(二)
  17. 国际化姿态迎接G20 浙江建设智慧城市
  18. 喝豆浆,也能美白肌肤?
  19. 关于线性插值的一点理解
  20. 【Vegas原创】用指令批量添加修改AD用户

热门文章

  1. 从Firefox控制您喜欢的音乐播放器
  2. #HTTP协议学习# (七)cookie
  3. WebService学习笔记---CXF入门
  4. AVL树----java
  5. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
  6. C#使用Objects Comparer进行对象比较
  7. .NET6之MiniAPI(二十三):Refit
  8. C#基础:理解装箱与拆箱
  9. 基于 registry 搭建 Docker 私有镜像仓库
  10. WPF 用装饰器制作抽屉效果