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


    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;
    }
    

    }

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

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

  • 相关阅读:
    python2.7之打飞机(文末附素材链接)
    python画小猪佩奇
    什么叫递归
    DIV居中的几种方法
    什么是控制反转
    上传图片及时预览
    MVC与三层的区别
    From表单提交刷新页面?
    文件上传之form表单篇
    文件上传之伪Ajax篇
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14736531.html
Copyright © 2020-2023  润新知