【问题标题】:OutputStream to the BLOB column of a DB2 database tableOutputStream 到 DB2 数据库表的 BLOB 列
【发布时间】:2014-11-27 04:01:20
【问题描述】:

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

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

使用 Java,我希望用新的 blob 数据更新此表中的现有行。我的首选方法是获取 BLOB 列的 OutputStream 并将我的数据写入 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 似乎不起作用。数据没有更新,我也没有收到任何错误消息。

问:我怎样才能得到一个输出流到 DB2 表的 BLOB 列?上述代码中可能需要更改什么?

【问题讨论】:

  • 如果没有看到您的代码,我冒昧地猜测您可能没有正确提交事务。 Connection.close() 上的 Oracle JDBC 驱动程序隐式提交一个正在进行的事务,而默认情况下 DB2 驱动程序会将其回滚。
  • 您是否查看过 IBM 提供的有关如何执行此操作的示例代码? www-01.ibm.com/support/knowledgecenter/#!/SSEPGG_10.5.0/…
  • @mustaccio ...我已经添加了我的测试代码。我正在做一个提交。但它似乎没有更新数据。
  • @IanBjorhovde ...感谢您的链接。但是,该链接没有提供任何有关使用 OutputStream 的示例,这正是我正在寻找的
  • 更新表行的标准方法是使用UPDATE 语句。如果出于某种原因您更喜欢可更新结果集的抽象,您需要在prepareStatement() 调用中指定适当的参数,并使用必要的方法来更新列。 The manual explains how to do that.

标签: java database jdbc db2 blob


【解决方案1】:

您可能已成功将数据写入 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) 更新ResultSet 中的值,然后调用ResultSet.updateRow(),然后再执行Connection.commit()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2022-01-19
    • 2019-01-29
    相关资源
    最近更新 更多