0

在我用 mariadb jdbc 驱动程序 1.1.5 替换了 mysql jdbc 驱动程序 5.1 并测试了与 MySQL Server 5.0 和 MariaDB Server 5.2 连接的现有代码库之后,除了 JDBC 调用来更新blob表中的字段外,一切正常。

blob 字段包含 XML 配置文件。它可以被读出,并转换为 xml 并插入一些值。

然后将其转换为 ByteArrayInputStream 对象,并调用方法

statement.updateBinaryStream(columnLabel, the ByteArrayInputStream object, its length) 

但抛出异常:

也许您有一些不正确的 SQL 语法?java.sql.SQLFeatureNotSupportedException:org.mariadb.jdbc.MySQLResultSet.updateBinaryStream(MySQLResultSet.java:1642) 的 org.mariadb.jdbc.internal.SQLExceptionMapper.getFeatureNotSupportedException(SQLExceptionMapper.java:165) 不支持更新.commons.dbcp.DelegatingResultSet.updateBinaryStream(DelegatingResultSet.java:511)

我尝试了 updateBlob 方法,抛出了同样的异常。

该代码适用于 mysql jdbc 驱动程序 5.1。

关于如何解决这种情况的任何建议?

4

2 回答 2

0

一个更简单的解决方法是使用二进制文字(如 X'2a4b54')和连接(UPDATE table SET blobcol = blobcol || X'2a4b54'),如下所示:

int iBUFSIZ = 4096;
byte[] buf = new byte[iBUFSIZ];
int iLength = 0;
int iUpdated = 1;
for (int iRead = stream.read(buf, 0, iBUFSIZ);
     (iUpdated == 1) && (iRead != -1) && (iLength < iTotalLength);
     iRead = stream.read(buf, 0, iBUFSIZ))
{
    String sValue = "X'" + toHex(buf,0,iRead) + "'";
    if (iLength > 0)
        sValue = sBlobColumn + " || " + sValue;
    String sSql = "UPDATE "+sTable+" SET "+sBlobColumn+"= "+sValue;
    Statement stmt = connection.createStatement();
    iUpdated = stmt.executeUpdate(sSql);
    stmt.close();
}
于 2014-11-06T10:57:27.473 回答
0

请参阅带有 updateBinaryStream 的票证更新 blob,在 commnet 中声明它不受支持。

一种解决方法是使用两个 SQL 语句。一种用于选择数据,另一种用于更新数据。像这样的东西:

final Statement select = connection.createStatement();
try {
    final PreparedStatement update = connection.prepareStatement( "UPDATE table SET blobColumn=? WHERE idColumn=?" );
    try {
        final ResultSet selectSet = select.executeQuery( "SELECT idColumn,blobColumn FROM table" );
        try {
            final int id = selectSet.getInt( "idColumn" );

            final InputStream stream = workWithSTreamAndRetrunANew( selectSet.getBinaryStream( "blobColumn" ) ) );

            update.setBinaryStream( 1,stream );
            update.setInt( 2,id );
            update.execute();
        }
        finally {
            if( selectSet != null )
                selectSet.close();
        }
    }
    finally {
        if( update != null )
            update.close();
    }
}
finally {
    if( select != null )
        select.close();
}

但请注意,您需要一些关于如何唯一标识表条目的信息,在此示例中,列idColumn用于此目的。此外,您是否在数据库中存储了空流,您可能会收到SQLException

于 2013-11-21T07:33:19.913 回答