2012-10-04 111 views
1

我正在使用9系列的db2jcc驅動程序修復包6。DB2 JDBC創建clob錯誤

我的代碼

public void setParamsPreparedStatement(PreparedStatement s, String[][] params) throws Exception { 
    ... 
    Clob myClob = s.getConnection().createClob(); 
    myClob.setString(1, params[i][0]); 

    s.setClob(i+1, myClob); 

在JBoss中5.1.0 GA它拋出的錯誤:

12:01:54,914 242266 ERROR [org.jboss.aspects.tx.TxPolicy] (ConsumerMessageQueue:(1):) javax.ejb.EJBTransactionRolledbackException: Unexpected Error 
java.lang.AbstractMethodError: org.jboss.resource.adapter.jdbc.jdk5.WrappedConnectionJDK5.createClob()Ljava/sql/Clob; 
    at database.Executer.setParamsPreparedStatement(Executer.java:761) 

在普通的Java它給人的錯誤:

Exception in thread "main" java.lang.AbstractMethodError: com.ibm.db2.jcc.b.b.createClob()Ljava/sql/Clob; 
    at TestClob.main(TestClob.java:20) 

的原因是什麼?

+0

您正在使用哪個版本的JBoss AS,以及您下載了哪個二進制文件? – Ami

+1

在JDBC 4.0/Java 6中添加了'createClob()',很可能您使用的是JDBC 3.0驅動程序。 –

回答

4

根據我的經驗,createClob()呼叫根本不需要。只要使用PreparedStatement.setCharacterStream()

PreparedStatement pstmt = conn.prepareStatement("insert into clob_table (id, clob_colum) values (?,?)"; 
String clobData = "...."; 
Reader reader = new StringReader(clobData); 
pstmt.setInt(1, 42); 
pstmt.setCharacterStream(2, reader, clobData.length()); 
pstmt.executeUpdate(); 

我已經發現這是唯一的跨DBMS/JDBC溶液來處理的CLOB(和BLOB的類似的方式)。