2013-10-02 4 views
0

После того, как я заменил драйвер mysql jdbc 5.1 с помощью драйвера mariadb jdbc 1.1.5 и протестировал существующую базу кода, связанную с MySQL Server 5.0 и MariaDB Server 5.2, все работает отлично, за исключением вызова JDBC для обновления a blob Поле в таблице.mariadb jdbc драйвер blob update не поддерживается

Поле 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

См. Билет 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.

0

Более простая работа вокруг используют двоичные литералы (например, X'2a4b54 ') и конкатенации (UPDATE таблицы 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(); 
} 
Смежные вопросы