欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-08 23:54:09
为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为 ,输出为: 数据的时候。网上千篇一律的说写一个 的扩展。但是给出的代码 中对于 方法都没有贴出代码或者 方法的书写存在一定的问题。这就导致了,如果你执行一个Oracle存储过程 ......

为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤其是在获取类型为oracledbtype.refcursor,输出为:parameterdirection.output数据的时候。网上千篇一律的说写一个oracledynamicparameters的扩展。但是给出的代码 oracledynamicparameters中对于get方法都没有贴出代码或者get方法的书写存在一定的问题。这就导致了,如果你执行一个oracle存储过程并且获取oracledbtype.refcursor类型的输出值的时候就会爆“oracledbtype无法转换成clr类型”的问题。具体的异常提示这里就不截图了,大致就是需要进行一下oracledbtype 到clr类型的一个转换。

作者:依乐祝
原文链接:

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类型,如下所示:

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

因此这里我们可以在添加参数的时候,传入游标类型了。如下所示:

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

但是这时候,如果这个游标类型是输出参数,这时候你如果通过下面这种方式来直接获取的话,就会爆我们文章开头的错误了。

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

异常的大概意思就是“返回的是oracledbtype类型,没法直接转换成clr类型,如上面的int类型”。

解决异常问题

既然知道了异常的问题,那么接下来我们就需要解决这个问题了。大概的解决思路也就是重新实现下get<t>方案,在获取数据的时候执行下oracledatatype到clr类型的转换。可能这个对大伙有点难度,但是别担心,我们有gayhub,因此我在gayhub上果然找到了现成的实现,具体的代码可以点这里查看 这里实现的oracledynamicparameters比我们实现的更强大,功能也更丰富。同时也实现了get<t>方法的转换。如下图所示:

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

同时,作者也发布了nuget包,来让你远离996.使用方式如下:

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

然后在文件中引入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实战技巧。