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

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

          對于一般的做法,需要修改很多地方,包括ResultSet的decorate類,還有Spring的SqlRowSetResultSetExtractor

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

          package oracle.jdbc.driver;

          public class OracleResultSetMetaData


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

          使用javassist編寫一段代碼:
           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置換原來的class,大功告成!

          這個所謂的精度,一般來說,修改了應該沒有多大問題的

          Feedback

          # re: 修改驅動解決SqlRowSet的Invalid scale size. Cannot be less than zero異常的處理辦法[未登錄]  回復  更多評論   

          2009-11-11 18:57 by jack
          cacheRowSet不行
          但改用resultSet就可以了...
          不要搞得這么復雜...
          主站蜘蛛池模板: 鹤岗市| 紫云| 南漳县| 乌鲁木齐市| 噶尔县| 中西区| 略阳县| 彩票| 昆山市| 建平县| 垣曲县| 英吉沙县| 宜君县| 松潘县| 美姑县| 辉县市| 司法| 宜阳县| 朝阳区| 伊宁市| 安陆市| 弥渡县| 辽中县| 澄迈县| 扬州市| 新余市| 甘肃省| 阿克陶县| 金坛市| 苍梧县| 永寿县| 麻栗坡县| 静海县| 乌恰县| 军事| 永仁县| 龙陵县| 资源县| 磐安县| 吉水县| 东港市|