首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

以 ADO GetChunk/AppendChunk 存取 SQL Server 大型二進位影像資料

     編輯:關於SqlServer

SQL Server image 資料類型可儲存高達 2 GB 的二進位資料(BLOB),但單次 T-SQL 陳述式限制 8000 位元組。透過 ADO Field.GetChunk / AppendChunk 分塊讀寫,可突破限制,適用醫療影像、GIS、文件管理等系統。

SQL Server BLOB 儲存架構

  • <= 8000 bytes:直接儲存在資料列內(varbinary)。
  • > 8000 bytes:分配獨立資料頁(LOB 頁),資料列僅存 16 位元組指標指向 LOB 頁鏈。
  • image 類型最大 231-1 位元組,varbinary(max) (SQL 2005+) 取代之。

ADO 分塊讀寫核心邏輯

寫入 (AppendChunk)

' 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。

現代替代方案 (SQL 2005+)

  • varbinary(max) + FILESTREAM / FileTable:超過 2 GB、Win32 流式存取、備份整合。
  • ADO.NET SqlBytes / SqlBinary / FileStream 類別,支援非同步、大檔案流式處理。
  • Entity Framework Core 直接對應 byte[] 或 Stream。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved