OutputStream到DB2数据库表的BLOB列

时间:2014-10-02 07:32:01

标签: java database jdbc db2 blob

在DB2数据库中,我有下表:

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

使用Java,我希望用新的blob数据更新此表中的现有行。我首选的方法是获取一个输出流到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 DB。

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

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

1 个答案:

答案 0 :(得分:2)

您可能已成功将数据写入Blob对象,但您需要对PreparedStatement和ResultSet执行更多操作才能实际更新数据库中的值。

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

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

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