2013-10-02 63 views
0

我用mariadb jdbc驅動程序1.1.5替換mysql jdbc驅動程序5.1並測試了與MySQL Server 5.0和MariaDB Server 5.2連接的現有代碼庫後,除JDBC調用更新外,一切正常表中的blob字段。mariadb jdbc驅動程序blob更新不支持

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,它在通訊中聲明它不受支持。

解決方法是使用兩條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(); 
} 
相關問題