SQL Server - Query varbinary data to convert to file by Java OutputStream

在這個例子之中,主要是將原本INSERT進TABLE COLUMN內的varbinary格式資料(檔案)讀

取出來之後,準備轉換回原來的檔案,以此達到檔案存進TABLE COLUMN及讀取出來使用

的目的。

SQL語法使用環境為:SQL Server 2008 R2

Table Schema 如下:
  1. CREATE TABLE DocSave
  2. (
  3. Id int,
  4. Name varchar(50) ,
  5. Ext varchar(10),
  6. RawData varbinary(max)
  7. )

再來是,INSERT資料進TABLE內,語法如下:
  1. INSERT INTO dbo.DocSave (Id, Name, Ext, RawData)
  2. SELECT '1' ,'example','.doc', BulkColumn FROM Openrowset( Bulk 'C:\example.doc', Single_Blob) as doc;


OPENROWSET透過BULK來讀取檔案資料,並且設定參數為SINGLE_BLOB,將資料存成

varbinary(max) 類型的單一資料列。相關參考文件請見官網

接著將資料QUERY出來後,透過Java將檔案資料做OutputStream to File

相關程式碼如下:
  1. String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  2. String url = "jdbc:sqlserver://localhost:1433;DatabaseName=TestTable";
  3. String user = "sa";
  4. String password = "123";
  5. Connection m_conn = null;
  6. OutputStream outputStream = null;
  7. InputStream rawData = null;
  8. try{
  9. Class.forName(driver);
  10. m_conn = DriverManager.getConnection(url, user, password);
  11. PreparedStatement getDoc = m_conn.prepareStatement("select * from DocSave");
  12. ResultSet rs = getDoc.executeQuery();
  13. int read = 0;
  14. while(rs.next()){
  15. outputStream = new FileOutputStream(new File("C://temp"+rs.getString("Ext")));
  16. rawData = rs.getAsciiStream("RawData");
  17. byte[] buffer = new byte[1024];
  18. while((read = rawData.read(buffer)) != -1){
  19. outputStream.write(buffer, 0, read);
  20. }
  21. outputStream.close();
  22. outputStream = null;
  23. rawData.close();
  24. rawData = null;
  25. }
  26. } catch(Exception e){
  27. e.printStackTrace();
  28. } finally{
  29. try {
  30. if(readBinary != null)readBinary.close();
  31. if(outputStream != null)outputStream.close();
  32. m_conn.close();
  33. } catch (SQLException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. }



留言