在早期的 Java 開發環境中,操作 SQL Server 2000 常透過 JDBC-ODBC 橋接器(sun.jdbc.odbc.JdbcOdbcDriver)配合系統 DSN 來完成。本文示範如何將圖片檔案以二進位資料型態(BLOB)寫入資料表,並從資料庫讀取還原成檔案,完整呈現「寫入→讀取」的閉環流程。
範例採用兩個類別協作:
insert() 與 getCover() 兩大核心方法。// 1. 載入驅動並取得連線
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:LW");
// 2. 準備 PreparedStatement 與二進位輸入串流
String sql = "INSERT INTO Ss (id, data) VALUES ('0012', ?)";
PreparedStatement stm = con.prepareStatement(sql);
File file = new File("D:\\test1.jpg");
InputStream fin = new FileInputStream(file);
stm.setBinaryStream(1, fin, (int) file.length());
// 3. 執行並關閉資源
stm.execute();
stm.close();
con.close();
關鍵在於 setBinaryStream(int parameterIndex, InputStream x, int length),可直接將檔案串流傳給資料庫,避免將整張圖片載入記憶體再轉 byte[],節省堆疊空間。
PreparedStatement pst = cn.prepareStatement("SELECT data FROM Ss WHERE ID = '0012'");
ResultSet rs = pst.executeQuery();
while (rs.next()) {
InputStream in = rs.getBinaryStream("data");
byte[] buf = new byte[50000];
int size;
DataOutputStream output = new DataOutputStream(new FileOutputStream("D:\\test2.jpg"));
while ((size = in.read(buf, 0, buf.length)) != -1) {
output.write(buf, 0, size);
}
output.close();
}
讀取端同樣採用串流分塊寫入,防止大檔案導致 OOM。實務上建議將緩衝區大小調整為 8KB~64KB,並搭配 try-with-resources 自動關閉資源(JDK 7+)。
com.microsoft.sqlserver.jdbc.SQLServerDriver)。PreparedStatement,可防 SQL Injection,請繼續保持。varbinary(max) 搭配 FILESTREAM 或 FileTable,獲得更佳效能與管理彈性。原始碼包含 Db、ThreadUseExtends 兩個類別,已在上方片段展示關鍵邏輯。完整版本可參考原始輸入內容,包含例外處理、執行緒啟動與資源釋出細節。