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

这个异常源自于oracle驱动面对一个数值型的返回字段时,在得到指定的字段小数点右边的数值数量时(Gets the designated column's number of digits to right of the decimal point.这个是原文),居然会返回-127,而oracle本身的cacheRowSet实现不允许这种情况出现,于是就会报标题所说的异常。

对于一般的做法,需要修改很多地方,包括ResultSet的decorate类,还有Spring的SqlRowSetResultSetExtractor

所谓头痛医头,脚痛医脚,这里提供一种方法直接从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就可以了...
不要搞得这么复杂...

只有注册用户登录后才能发表评论。


网站导航: