只在vc 下面搞过,不太一样。

解决方案 »

  1.   

    回复人: caiqh(郊区菜农) ( ) 信誉:100  2002-09-23 15:27:33Z  得分:10 
     
     
      
    [说明:这篇文章四天前已经在chinajavaworld,cn-java论坛上发表过,当时因为好像javaren上不去,只好仍到其他地方了。这几天又不再北京,没有上网,今天才得以发出来]  现在才发觉,原来 getBLOB is not supported by the Weblogic JDBC Drivers 。这几天在操纵oracle的CLOB字段时候,使用连接池所报的错误。  使用直接连接的情况下,oracle.jdbc.OracleResultSet ors = (oracle.jdbc.OracleResultSet)rs 是可以正常转换的。
      在使用连接池,数据库连接池的数据库驱动采用Oracle thin driver (oracle.jdbc.driver.OracleDriver)用实际上连接池内部是涉及到weblogic jdbc driver的)。这个时候,就会报:
      java.io.Exception :weblogic.jdbc.rmi.SerialResultSet
      java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet
      如果再细化追踪错误,会报出
      SQLException :getBLOB is not supported by the Weblogic JDBC Drivers
      java.sql.SQLException: getBLOB is not supported by the Weblogic JDBC Drivers
           at weblogic.jdbc.vendor.oracle.OracleUtils.createUnsupportedException(OracleUtils.java:40)
           at weblogic.jdbc.rmi.SerialResultSet.getBLOB(SerialResultSet.java:1603)  这样,在操纵oracle的BLOB/CLOB类型数据的时候(主要是添加和更新,如果仅仅是读取,那么只需要一般的java.sql.Statement和java.sql.ResultSet.getBlob()就可以读取),就需要使用weblogic.jdbc.vendor.oracle.OracleThinBlob和weblogic.jdbc.vendor.oracle.OracleThinClob类。 
    例如下面的一段代码,未使用weblogic连接池情况下,是可以这样操作的(往oracle数据中增加一条BLOB类型数据)
           
           // stmt是java.sql.Statement对象
           // tmpbyte是byte数组
           // 代码仅供参考
           String sqlstr = "select blob_code form testtable where blob_key=1 for update ";
           oracle.sql.OracleResultSet ors = (oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr);
           oracle.sql.BLOB blob = RS_forms.getBLOB("blob_code");
           OutputStream os = blob.getBinaryOutputStream();
           os.write(tmpbyte);
           os.close();
           stmt.close();但是如果,将这段程序移植到使用weblogic连接池获取connection对象中,就会报错:java.lang.ClassCastException: weblogic.jdbc.rmi.SerialResultSet。出错的地方就是在
    (oracle.sql.OracleResultSet)stmt.executeQuery(sqlstr)这段代码。
    所以,以上代码,需要改成如下(部分省略),可能够适用连接池的情况:         String sqlstr = "select blob_code form testtable where blob_key=1 for update ";
             java.sql.ResultSet rs = stmt.executeQuery(sqlstr);
             java.sql.Blob blob = rs.getBlob("blob_code");
             OutputStream os = ((weblogic.jdbc.vendor.oracle.OracleThinBlob)blob).getBinaryOutputStream();
             os.write(tmpbyte);
             os.close();
             rs.close();
             stmt.close();
    ============================>>>>>
    /**
    * Author : zhaobing , 银狐999  
    * Date :  2002月8月9日
    * 说明:此问题的最初发现和解决者,是 zhaobing ,特此感谢。
    * 如有什么疑问,请留言,或发邮件:[email protected] 
    */   
    原来两年前就有人解决了,谢谢这位菜农兄,也谢谢楼上的兄弟关注!
    谢谢!