PreparedStatement.setBinaryStream 用于 informix JDBC 驱动程序

PreparedStatement.setBinaryStream for informix JDBC driver

我正在使用以下函数将二进制流值设置为准备好的语句。

void setBlobValue(String value, PreparedStatement prepStmt, int index) throws SQLException, IOException {
    if (value != null) {
        InputStream inputStream = new ByteArrayInputStream(CharacterEncoder.getSafeText(value).getBytes());
        if (inputStream != null) {
            prepStmt.setBinaryStream(index, inputStream, inputStream.available());
        } else {
            prepStmt.setBinaryStream(index, inputStream, 0);
        }
    } else {
        prepStmt.setBinaryStream(index, null, 0);
    }
}

我使用此函数为 H2、mysql、mssql、oracle、oracle_rac、DB2 和 informix 数据库设置准备好的语句。当使用 informix 并发送 null 作为值时,setBinaryStream 方法给出 NullPointerException,即使在其他数据库中它工作正常。

这是什么原因?我该如何解决这个问题?

我认为这是 Informix JDBC 驱动程序中的错误。

您已经检查过 inputStream 是否为 null 所以我认为最好使用 setNull() 而不是 setBinaryStream():

   if (inputStream != null) {
        prepStmt.setBinaryStream(index, inputStream, inputStream.available());
    } else {
        prepStmt.setNull(index);
    }

此问题已由

修复
prepStmt.setBinaryStream(index, new ByteArrayInputStream(CharacterEncoder.getSafeText("").getBytes()), 0);

这是当前informix驱动的一个bug。以下是另外两个解决方法。

setNULL(1,IfxTypes.IFX_TYPE_BLOB)

setObject(1,null)