dapper 处理oracle Number数据类型时出错
今天在用dapper处理返回的List<model>时,发现model中的一个字段返回始终是null(如下图所示;model中此属性声明为了string)
但不使用dapper返回的datatable在第11列(即上图中的TAL_REJECT_PERCENT)是完全正常的,非常疑惑。
用sql在plSql中执行没有任何问题,返回null的列是能正常区获取到相应数据的,但是为何通过dapper后就为null呢?
使用plSql查看了下表的中所有字段的类型,其为Number(5,2)……这也许就是产生问题的根源。
一番百度与bing搜索后,发现dapper在处理oracle的Number时是会导致一些问题……但按百度与bing上推荐的处理办法,并未解决小子的问题,很是失望。
另尝试将model中此属性声明为double或float或decimal(但其他人反馈用decimal是可行的)时,无论查询到的数据是啥,数据类型为double或float或decimal查询到到的值都为默认值0.也就是说直接改model中相应属性的数据类型是不能解决问题的。
后续在用data reader读取的时候时,进行相应的监控,其类型确为decimal,然在model中将其改为decimal确是不可以的……大哭!
现记之以备忘,后续解决后再补全解决办法。
2023年1月4日——解决办法
可能原因:由于使用的是C#提供的 System.Data.OracleClient,其MS已经停止维护,可能导致后续与oracle有冲突所致……
解决办法:使用由oracle提供的Oracle.ManagedDataAccess(Nuget安装相应包即可,使用方法与System.Data.OracleClient一样)替代System.Data.OracleClient,即可解决问题。只是使用时需要注意其 connectionString需要跟oracle数据库要求一致,下为示例(最好参考oracle安装文件夹下的,network文件夹下的admin文件夹中的tnsnames.ora文件夹内的配置进行相应的设置)……
<connectionStrings> <add name="ConnectOracle" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=主机名)(PORT=1521)) (CONNECT_DATA=(SERVER = server名)(SERVICE_NAME=服务名)));User ID=用户名;Password=密码;" providerName="System.Data.OracleClient" /> </connectionStrings>