SQL Server image 資料類型可儲存高達 2 GB 的二進位資料(BLOB),但單次 T-SQL 陳述式限制 8000 位元組。透過 ADO Field.GetChunk / AppendChunk 分塊讀寫,可突破限制,適用醫療影像、GIS、文件管理等系統。
<= 8000 bytes:直接儲存在資料列內(varbinary)。> 8000 bytes:分配獨立資料頁(LOB 頁),資料列僅存 16 位元組指標指向 LOB 頁鏈。image 類型最大 231-1 位元組,varbinary(max) (SQL 2005+) 取代之。' VB6 / VBA 範例
Dim rs As ADODB.Recordset, chunkSize As Long, fileNum As Long
chunkSize = 8192 ' 8KB 每塊
Set rs = New ADODB.Recordset
rs.Open "SELECT ImageData FROM MedicalImages WHERE PatientID = 'P001'", cn, adOpenKeyset, adLockOptimistic
rs.AddNew
fileNum = FreeFile
Open "C:\XRay.dcm" For Binary Access Read As #fileNum
Do While Not EOF(fileNum)
Dim buffer() As Byte
ReDim buffer(chunkSize - 1)
Get #fileNum, , buffer
rs("ImageData").AppendChunk buffer
Loop
Close #fileNum
rs.Update
rs.Close
rs.Open "SELECT ImageData FROM MedicalImages WHERE PatientID = 'P001'", cn, adOpenStatic, adLockReadOnly
If Not rs.EOF Then
Dim totalSize As Long, offset As Long, chunk() As Byte
totalSize = rs("ImageData").ActualSize
offset = 0
Open "C:\Output.dcm" For Binary Access Write As #1
Do While offset < totalSize
chunk = rs("ImageData").GetChunk(chunkSize)
Put #1, , chunk
offset = offset + UBound(chunk) + 1
Loop
Close #1
End If
| 屬性/方法 | 說明 |
|---|---|
ActualSize | 欄位實際資料大小(位元組),讀取迴圈終止條件。 |
GetChunk(size) | 從目前位移讀取指定位元組,回傳 Byte 陣列。 |
AppendChunk(data) | 將 Byte 陣列附加至欄位末尾,需搭配 AddNew/Edit + Update。 |
| 游標類型 | 寫入需 adOpenKeyset + adLockOptimistic;讀取建議 adOpenStatic + adLockReadOnly。 |
varbinary(max) + FILESTREAM / FileTable:超過 2 GB、Win32 流式存取、備份整合。SqlBytes / SqlBinary / FileStream 類別,支援非同步、大檔案流式處理。byte[] 或 Stream。