前置作業:建立含 Image 欄位的資料表
-- SQL Server
CREATE TABLE userphoto (id INT IDENTITY, username VARCHAR(50), age INT, photo IMAGE);
-- Access:設計檢視將 photo 設為 OLE 物件
BLOB 寫入:AppendChunk
// 假設 m_pBmpBuffer 指向長度 m_nLen 的 BMP 檔案資料
m_rs->AddNew();
m_rs->PutCollect("username", "小李");
m_rs->PutCollect("age", 28L);
VARIANT var; SAFEARRAYBOUND bound = {0, m_nLen};
SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, &bound);
for (long i=0; iFields->GetItem("photo")->AppendChunk(var);
m_rs->Update();
BLOB 讀取:GetChunk
long len = m_rs->Fields->GetItem("photo")->ActualSize;
if (len > 0) {
_variant_t var = m_rs->Fields->GetItem("photo")->GetChunk(len);
if (var.vt == (VT_ARRAY | VT_UI1)) {
char* pBuf; SafeArrayAccessData(var.parray, (void**)&pBuf);
// pBuf 指向完整 BMP 資料,可建立 CBitmap 顯示
// 範例:CBitmap bmp; bmp.Attach((HBITMAP)LoadImage(...))
SafeArrayUnaccessData(var.parray);
}
}
完整範例專案功能
- 從檔案載入 BMP → 存入資料庫
- 從資料庫讀取 → 重建 HBITMAP → 畫面顯示
- 支援瀏覽、修改、刪除記錄
關鍵提示
SafeArrayCreate(VT_UI1, ...) 對應位元組陣列
AppendChunk/GetChunk 可分塊處理超大物件
- 讀取後
SafeArrayAccessData 取得指標,用畢必呼叫 SafeArrayUnaccessData