posts - 33, comments - 46, trackbacks - 0, articles - 2
          參考:http://blog.csdn.net/horsefaced/archive/2007/08/16/1746888.aspx

          這個(gè)異常源自于oracle驅(qū)動(dòng)面對(duì)一個(gè)數(shù)值型的返回字段時(shí),在得到指定的字段小數(shù)點(diǎn)右邊的數(shù)值數(shù)量時(shí)(Gets the designated column's number of digits to right of the decimal point.這個(gè)是原文),居然會(huì)返回-127,而oracle本身的cacheRowSet實(shí)現(xiàn)不允許這種情況出現(xiàn),于是就會(huì)報(bào)標(biāo)題所說(shuō)的異常。

          對(duì)于一般的做法,需要修改很多地方,包括ResultSet的decorate類(lèi),還有Spring的SqlRowSetResultSetExtractor

          所謂頭痛醫(yī)頭,腳痛醫(yī)腳,這里提供一種方法直接從oracle jdbc驅(qū)動(dòng)入手,徹底從源頭上修改掉該問(wèn)題:
          反編譯ojdbc14.jar(Oracle 9i驅(qū)動(dòng)為例)

          package oracle.jdbc.driver;

          public class OracleResultSetMetaData


          目標(biāo)方法:
          public int getScale(int paramInt)
              throws SQLException
            {
              int i = getValidColumnIndex(paramInt);
              return this.statement.getDBDescription()[i].scale;
            }

          使用javassist編寫(xiě)一段代碼:
           public  void crackOracleDriver() {
                  ClassPool pool 
          = ClassPool.getDefault();
                  
          try {
                      pool.insertClassPath(
          "E:\\allproject\\bpmtrans\\lib\\ojdbc14.jar");
                      CtClass cc 
          = pool.get("oracle.jdbc.driver.OracleResultSetMetaData");
                      System.out.println(cc);
                      CtClass[] param 
          = new CtClass[1] ;
                      param[
          0]=pool.get("int");
                      CtMethod a 
          = cc.getDeclaredMethod("getScale",param);
                      System.out.println(a);
                      a.setBody(
          "{int i = getValidColumnIndex($1);\n" +
                              
          "    int res=statement.getDBDescription()[i].scale;\n" +
                              
          "return res<0?0:res; }");
                      cc.writeFile(
          "c:\\");

                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }

          將生成的class置換原來(lái)的class,大功告成!

          這個(gè)所謂的精度,一般來(lái)說(shuō),修改了應(yīng)該沒(méi)有多大問(wèn)題的

          Feedback

          # re: 修改驅(qū)動(dòng)解決SqlRowSet的Invalid scale size. Cannot be less than zero異常的處理辦法[未登錄](méi)  回復(fù)  更多評(píng)論   

          2009-11-11 18:57 by jack
          cacheRowSet不行
          但改用resultSet就可以了...
          不要搞得這么復(fù)雜...
          主站蜘蛛池模板: 洞口县| 永福县| 临邑县| 肃北| 东港市| 房产| 双牌县| 沧州市| 来安县| 临泽县| 磐石市| 江北区| 斗六市| 望都县| 唐河县| 江口县| 锦屏县| 石屏县| 邵阳市| 桓台县| 山西省| 灵丘县| 绥江县| 开封市| 通州市| 故城县| 靖边县| 思南县| 如东县| 岑巩县| 根河市| 壤塘县| 呼图壁县| 革吉县| 满洲里市| 修武县| 五华县| 玛沁县| 绍兴县| 磐安县| 烟台市|