您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

c#中使用oledb读取oracle的number字段返回的是"decimal"类型

bubuko 2022/1/25 19:08:47 dotnet 字数 3396 阅读 988 来源 http://www.bubuko.com/infolist-5-1.html

https://bbs.csdn.net/topics/60463341 用oledb连接sqlserver编写的代码,现在想改成oracle实现,但是从oracle中读出的number型字段都是c#中的decimal型变量,而本来的程序都是int型,这样我的代码就要进行大量的转换才行.请问有没有办 ...

https://bbs.csdn.net/topics/60463341

用oledb连接sqlserver编写的代码,现在想改成oracle实现,但是从oracle中读出的number型字段都是c#中的decimal型变量,而本来的程序都是int型,这样我的代码就要进行大量的转换才行.请问有没有办法让number字段读出来就是int型?(包括OleDbDataReader,OleDbDataAdapter,ExecuteScale等取出的数据.)

把数据读出来转化一下:
int.Parse(string s); 把string 转为 int。需要保证 s为 string,字符串。 如果为 decimal需要先转为 string ,再转为 int。或者使用Convet.ToInt32(object o);

https://my.oschina.net/u/4485772/blog/3207362

oracle数据库number类型查询后转decimal处理

最近忙于项目迁移,数据库由MySQL迁移到Oracle数据库,由此诞生了很多底层难题。

比如在MySQL中数据类型int,bigint,double,floort,decimal类型,dba在迁移库时统统转成了number类型,祖传代码原因,mybatis查询的返回结果集是一个继承HashMap的基类Map,结果集中对number类型的数据,对应的javaType就是BigDecimal类型。而项目的祖传代码中有大量类似,(Long)map.get("***"),(Double)map.get("***"),或者是if条件里用get("***").equals(1)这一类的代码,在mysql中这一类的不报错的代码,换了数据库后大量报错,如果需要解决,所有这些类似的get代码都要更改,工作量大,代码也很难看。

(ps:项目架构的设计真的无法吐槽)

于是想统一解决这一类问题,最开始的思路是重写mybatis相应的TypeHandler类,拦截decimal的返回字段,处理完毕后再作返回,但是经过了几个小时的研究,发现并不是那么容易,jdbcType为Number类型的对应的java类型到底是哪个处理类拦截,拦截后的处理,卡了挺长时间,最终暂时搁置,决定用一种更简单的方案处理。

由于返回的结果集都是继承了HashMap的基类,而项目中有众多get(key)的代码导致报错,于是我决定重写子类的get方法,把Decimal根据规则转成Decimal、Long,或者Integer,代码如下:

public Object get(String key){
	Object obj = super.get(key);
<span class="hljs-keyword">if</span>(obj != <span class="hljs-literal">null</span> &amp;&amp; obj instanceof BigDecimal){
	<span class="hljs-keyword">if</span> (obj.toString().indexOf(<span class="hljs-string">"."</span>)  &gt; -<span class="hljs-number">1</span>){
		<span class="hljs-keyword">return</span> obj;
	} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (((BigDecimal) obj).compareTo(new BigDecimal(Integer.MAX_VALUE)) &gt; <span class="hljs-number">0</span>){
		<span class="hljs-keyword">return</span> ((BigDecimal) obj).longValue();
	} <span class="hljs-keyword">else</span> {
		<span class="hljs-keyword">return</span> ((BigDecimal) obj).intValue();
	}
}<span class="hljs-keyword">else</span>{
	<span class="hljs-keyword">return</span> obj;
}

}

虽然这样处理不是最好的办法,但是目前来说,这是改动最小的方式了,如果有其他更好的方法,也欢迎探讨,感谢分享!

 

-- 记第一篇博客,还是不要太懒了,工作之余留一点记录。

 

c#中使用oledb读取oracle的number字段返回的是"decimal"类型

原文:https://www.cnblogs.com/sunny3158/p/14736531.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶