2014-10-02 39 views
2

在DB2数据库中的BLOB列,我有如下表:的OutputStream到DB2数据库表

CREATE TABLE MyTestTable 
( 
    MYPATH VARCHAR(512) NOT NULL, 
    MYDATA BLOB, 
    CONSTRAINT MYTESTTABLE_PK PRIMARY KEY (MYPATH) 
); 

使用Java,我想在这个表与新斑块数据来更新现有的行。我的首选方法是获取OutputStream到BLOB列&将我的数据写入OutputStream。

这里是我使用的测试代码:

Connection connection = null; 
PreparedStatement pStmnt = null; 
ResultSet rSet = null; 

try { 
    connection = ... // get db connection 
    String id = ... // set the MYPATH value 

    String sql = "SELECT MYDATA FROM MyTestTable WHERE MYPATH='"+id+"' FOR UPDATE"; 

    pStmnt = connection.prepareStatement(sql); 
    rSet = pStmnt.executeQuery(); 
    while (rSet.next()) { 
     Blob blobData = rSet.getBlob("MYDATA"); // this is a java.sql.Blob 

     OutputStream blobOutputStream = blobData.setBinaryStream(1); 
     blobOutputStream.write(data); 
     blobOutputStream.close(); 
     connection.commit(); 
    } 
} 
// close ResultSet/PreparedStatement/etc in the finally block 

上面的代码工作的Oracle数据库。

但是,在DB2中,调用setBinaryStream来获取OutputStream似乎不起作用。数据没有得到更新,我也没有收到任何错误消息。

问:如何获得OutputStream到DB2表的BLOB列?上面的代码中可能需要更改什么?

+0

如果没有看到您的代码,我会冒昧猜测您可能没有正确提交交易。 Connection.close()上的Oracle JDBC驱动程序默认提交正在进行的事务,而DB2驱动程序默认会将其回滚。 – mustaccio 2014-10-02 11:37:03

+0

您是否看过IBM提供的示例代码,了解如何执行此操作? http://www-01.ibm.com/support/knowledgecenter/#!/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.sample.doc/doc/java_jdbc/s-DtLob-java.html – 2014-10-02 15:52:22

+0

@ mustaccio ...我添加了我的测试代码。我正在做一个提交。但它似乎没有更新数据。 – Perihelion 2014-10-03 05:05:42

回答

2

您可能会成功将数据写入Blob对象,但您需要使用PreparedStatement和ResultSet做更多的事情才能实际更新数据库中的值。

首先,您的PreparedStatement必须使用version of Connection.prepareStatement() that takes a resultSetConcurrency parameter实例化,您必须将其设置为值ResultSet.CONCUR_UPDATABLE。 (我不知道SQL SELECT实际上需要指定FOR UPDATE子句 - 请参阅本答复末尾链接处的教程。)

其次,在关闭blobOutputStream之后,您需要更新结果集使用updateBlob(int columnIndex, Blob x)updateBlob(String columnLabel, Blob x),然后在执行Connection.commit()之前调用ResultSet.updateRow()

我还没有用这种方式更新Blob值,但它应该工作。如果遇到任何试图重用最初从ResultSet中读取的Blob的问题(如果您实际上没有使用原始数据,则可能不需要这样做),那么可以使用Connect.createBlob()作为空的开头。您可以从this tutorial了解有关更新ResultSet的更多信息。