2011-10-12 13 views
0

我試圖在HSQLDB中添加一個圖像作爲BLOB。但是在表格中,我發現類似「:hsqll:jdbc:client @ f3t5h」。我的Java代碼下面有什麼問題嗎?在HSQLDB中添加圖像作爲BLOB,但像「:hsqll:jdbc:client @ f3t5h」結果在表中

我的檢索代碼就像我通常爲其他數據庫所做的那樣。爲什麼它不適用於HSQLDB?

Statement stmt = conn.createStatement(); 

    ResultSet results =stmt.executeQuery("SELECT * from productdetails"); 


    while (results.next()) { 
       String code = (String) results.getObject(1); 
       String name = (String) results.getObjeenter code herect(2); 

       String price = Double.toString((Double) results.getObject(3)); 
       int quantity = (Integer) results.getObject(4); 
       Boolean featured = (Boolean) results.getObject(5); 
       String desc = (String) results.getObject(6); 
       String imgPath = (String) results.getObject(7); 
       Blob aBlob = (Blob) results.getBlob(10); 
       byte[] allBytesInBlob = aBlob.getBytes(1, (int) aBlob.length()); 

       try { 
        FileOutputStream fis = 
       (FileOutputStream) getOutputStream(allBytesInBlob); 

       } catch (IOException ex) { 
        Logger.getLogger(Helper.class.getName()).log(Level.SEVERE, null, ex); 
       } 
} 

public OutputStream getOutputStream(byte[] _data) throws IOException 
       { 
      OutputStream out = new ByteArrayOutputStream(); 
      out.write(_data); 
      return out; 
       } 

這是我的插入代碼。

Connection conn = db.getConnection(); 
PreparedStatement pstmt; 
String sql = "INSERT INTO PRODUCTDETAILS" 
(PRODUCTCODE, NAME, PRICE, QUANTITY, FEATURED, DESCRPTION, IMAGEPATH,IMAGE) 
       VALUES (?, ?,? ,? ,? , ?, ?,?)"; 
pstmt = conn.prepareStatement(sql); 
     FileInputStream fis; 


     File image = new File(values.getImgPath()); 
     fis = new FileInputStream(image); 
     pstmt.setBinaryStream(8, (InputStream) fis, (int) (image.length())); 
     pstmt.execute(); 

image列是BLOB類型的,很明顯。

+0

爲什麼你不添加圖像的位置,而不是圖像的數據庫? – kinkajou

+0

雖然在回顧blob我得到以下錯誤:線程「主」java.lang.ClassCastException異常:org.hsqldb.jdbc.JDBCBlobClient不能轉換爲com.mysql.jdbc.Blob –

+0

我看到你的驅動程序是不同的組織。 hsqldb.jdbc.JDBCBlobClient和com.mysql.jdbc.Blob是不同的。看到你的連接參數。所以你使用相同的hsql數據庫的驅動程序。 – kinkajou

回答

2

您的Java代碼對於HSQLDB 2.2.x是正確的。該blob似乎被插入。看來你用來檢索blob的代碼是不正確的。您尚未報告此代碼,但顯然您未使用java.sql.Blob方法來訪問返回的blob(org.hsqldb.jdbcJDBCBLOBClient對象)。發佈檢索代碼進行更正。

如果您查看HSQLDB DatabaseManager或其他工具中的表數據,它可能會將blob顯示爲對象的地址,而不是顯示二進制內容。

1

您致電aBlob.getBytes(10, aBlob.length())

但是,Blob.getBytes()的第一個參數是第一個字節的索引以檢索(基於1,因爲JDBC中的所有索引都是)。所以你忽略(即不讀取)Blob的前9個字節。改爲傳入1

如果輸出結果實際上與您所顯示的一樣,那麼還有其他錯誤(可能是您插入Blob的方式),但那肯定是您應該修復的第一個問題。

+0

我糾正了,但沒有改變..有什麼有用的鏈接或教程,以找出如何實際Blob處理HSqldb ...?特別插入和重試...... –

+0

@NavinRajPandey:我不知道需要什麼特別的處理HSQLDB中的BLOB,它在這方面很符合JDBC。由於您修復了破損的檢索代碼,因此可能是時候向我們展示*如何將BLOB存儲在首位。 –

+0

@NavinRaj請添加插入和檢索代碼並添加用於檢索的SELECT語句。 – fredt

0

Joachim:10是列索引,而不是字節[索引]。

你得到的是標準Object.toString()。 「顯然,圖像列是BLOB類型的。」是的,在分貝。你的桌子怎麼樣? 您的模型是否爲此列返回通用String.class?如果是這樣,你就檢查對象本身, 你的數據是在裏面(和對象不關心,如果它是你的母親在低圖片或文字)。 不錯的投給byteoutputstream到fileoutputstream,在我的java沒有工作