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> && obj instanceof BigDecimal){
<span class="hljs-keyword">if</span> (obj.toString().indexOf(<span class="hljs-string">"."</span>) > -<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)) > <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;
}
}
虽然这样处理不是最好的办法,但是目前来说,这是改动最小的方式了,如果有其他更好的方法,也欢迎探讨,感谢分享!
-- 记第一篇博客,还是不要太懒了,工作之余留一点记录。