0

mysql jdbc ドライバー 5.1 を mariadb jdbc ドライバー 1.1.5 に置き換え、MySQL サーバー 5.0 および MariaDB サーバー 5.2 に接続された既存のコード ベースをテストしたblob後、テーブル内のフィールドを更新するための JDBC 呼び出しを除いて、すべて正常に動作しました。

blob フィールドには XML 構成ファイルが含まれます。読み込んで、xml に変換し、いくつかの値を挿入することができます。

次に、それを ByteArrayInputStream オブジェクトに変換し、メソッドを呼び出します

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

ただし、例外がスローされます。

間違った SQL 構文を使用している可能性がありますか? java.sql.SQLFeatureNotSupportedException: 更新は org.mariadb.jdbc.internal.SQLExceptionMapper.getFeatureNotSupportedException(SQLExceptionMapper.java:165) でサポートされていません org.mariadb.jdbc.MySQLResultSet.updateBinaryStream(MySQLResultSet.java:1642) で org.apache .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では、サポートされていないと記載されています。

回避策は、2 つの SQL ステートメントを使用することです。1 つはデータの選択に使用され、もう 1 つはデータの更新に使用されます。このようなもの:

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 に答える