在用mariadb jdbc驱动程序1.1.5替换mysql jdbc驱动程序5.1并测试了与MySQL Server 5.0和MariaDB Server 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。
有关如何解决这种情况的任何建议?
答案 0 :(得分:0)
查看票证updating blob with updateBinaryStream,该票据在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数据库。
答案 1 :(得分:0)
更简单的解决方法是使用二进制文字(如X' 2a4b54')和连接(UPDATE表格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();
}