在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列?在上面的代码中可能需要更改什么?
答案 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的更多信息。