为何说是最佳实践呢?由于在实际开发中踩坑了,并且发现网上大多数文章给出的解决方法都不能很好地解决问题。尤为是在获取类型为OracleDbType.RefCursor
,输出为:ParameterDirection.Output
数据的时候。网上千篇一概的说写一个OracleDynamicParameters
的扩展。可是给出的代码 OracleDynamicParameters
中对于Get
方法都没有贴出代码或者Get
方法的书写存在必定的问题。这就致使了,若是你执行一个Oracle存储过程而且获取OracleDbType.RefCursor
类型的输出值的时候就会爆“OracleDbType没法转换成CLR类型”的问题。具体的异常提示这里就不截图了,大体就是须要进行一下OracleDbType
到CLR类型的一个转换。html
做者:依乐祝
原文连接:http://www.javashuo.com/article/p-pykbabbz-ne.htmlgit
若是你用Dapper来进行Oracle的存储过程的操做,恰好这个存储过程须要传入一个游标类型的输出值,以下所示,你会发如今DbType
中是不包含游标类型的。github
var p = new DynamicParameters(); p.Add("foo", "bar"); p.Add("baz_cursor", dbType: DbType.?(没有游标类型) , direction: ParameterDirection.Output);
不知道你们还有咩有印象,我在2018年的时候曾经翻译了一篇关于在.NET Core中使用Dapper操做Oracle的文章,没有印象的能够点击连接查看下[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了。数据库
这篇文章是翻译的,里面有一个OracleDynamicParameters
的扩展方法的代码,具体的代码你们能够点击上面的连接进行查看,使用这个OracleDynamicParameters
进行Oracle存储过程的查询是不会有问题的,并且也支持包含OracleDbType.RefCursor
类型的存储过程的执行。由于它在Add
参数的时候传入的是数据类型是OracleDbType
类型,以下所示:编程
所以这里咱们能够在添加参数的时候,传入游标类型了。以下所示:c#
可是这时候,若是这个游标类型是输出参数,这时候你若是经过下面这种方式来直接获取的话,就会爆咱们文章开头的错误了。数组
异常的大概意思就是“返回的是OracleDbType类型,无法直接转换成CLR类型,如上面的int类型”。oracle
既然知道了异常的问题,那么接下来咱们就须要解决这个问题了。大概的解决思路也就是从新实现下Get<T>
方案,在获取数据的时候执行下OracleDataType到CLR类型的转换。可能这个对大伙有点难度,可是别担忧,咱们有GayHub,所以我在GayHub上果真找到了现成的实现,具体的代码能够点这里查看 这里实现的OracleDynamicParameters
比咱们实现的更强大,功能也更丰富。同时也实现了Get<T>
方法的转换。以下图所示:app
同时,做者也发布了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实战技巧。