傳統「資料表 + 實體檔案」模式雖常見,但維護困難、備份不同步、安全性難控。本文探討將圖像直接儲存於 SQL Server 關聯表的策略、資料型別選擇、設計原則,並提供 VB6 實作範例架構。
| 型別 | 適用內容 | 最大長度 | 備註 |
|---|---|---|---|
image | 二進位圖片、文件(.jpg, .pdf, .bmp) | 2 GB | SQL 2000 主流選擇 |
varbinary(max) | 同 image,但支援大值型別語意 | 2 GB | SQL 2005+ 建議用此 |
text/ntext | 大量文字(已淘汰) | 2 GB | 新版改用 varchar(max)/nvarchar(max) |
.bak 即含所有影像,無「檔案遺失」風險FILESTREAM / FileTable 協助)DocumentBlob),主表僅存 PK + 中繼資料(檔名、MIME、大小、建立時間),避免掃描主表時讀入 LOB 頁面。ROW/PAGE 壓縮對 LOB 無效,但可壓縮主表中繼資料。' 寫入
Dim cmd As New ADODB.Command
cmd.ActiveConnection = cn
cmd.CommandText = "INSERT INTO Docs(MetaId, FileName, Content) VALUES (?, ?, ?)"
cmd.Parameters.Append cmd.CreateParameter("@MetaId", adInteger, adParamInput, , metaId)
cmd.Parameters.Append cmd.CreateParameter("@FileName", adVarWChar, adParamInput, 255, fileName)
cmd.Parameters.Append cmd.CreateParameter("@Content", adLongVarBinary, adParamInput, , fileBytes)
cmd.Execute
' 讀取 (串流避免記憶體暴增)
Dim rs As New ADODB.Recordset
rs.Open "SELECT Content FROM Docs WHERE MetaId = " & metaId, cn, adOpenForwardOnly, adLockReadOnly
If Not rs.EOF Then
Dim fs As New ADODB.Stream
fs.Type = adTypeBinary
fs.Open
fs.Write rs("Content").GetChunk(rs("Content").ActualSize)
fs.SaveToFile "C:\Temp\out.pdf", adSaveCreateOverWrite
End If
中小型系統、文件管理、醫療影像、合約存證等「資料完整性優先」場景,**直接存資料庫** 是最省維運、風險最低的選擇。配合垂直分割、Filestream、備份策略,可支撐 TB 級影像資料。唯有超大檔、高併發串流、雲原生架構才建議外部化儲存並僅存 URL/Token。