zoukankan      html  css  js  c++  java
  • 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;
    }
    

    }

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

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

  • 相关阅读:
    System.Diagnostics.Process.Start()
    Asp.Net 构架(HttpModule 介绍) Part.3
    Asp.Net 构架(Http Handler 介绍) Part.2
    Asp.Net构架(Http请求处理流程)
    Ruby 2.0 发布首个预览版
    Java基本数据类型及类型转换
    J2EE 1.4 APIs and Technologies
    java final 关键字
    Android获取通讯录
    Activity的四种加载模式(转载)
  • 原文地址:https://www.cnblogs.com/sunny3158/p/14736531.html
Copyright © 2011-2022 走看看