文章編號: 190958 - 上次校閱: 2005年3月2日 - 版次: 2.4

範例: AOTBLOB 讀取/寫入 BLOB 使用 OLE DB 消費者樣板

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

AOTBLOB 範例示範讀取和寫入長二進位資料 (BLOB) 欄位使用 ATL OLE DB 消費者樣板類別。這個範例包含程式碼載入,並將點陣圖檔儲存和載入並將點陣圖影像儲存至資料庫表格。

本範例也示範如何提示使用者選取資料來源使用 Microsoft 資料連結] 對話方塊,以做為瀏覽相同的方式連接到 ODBC 中。

注意: 的範例自動建立名為 BLOB1234 目標資料來源上插入和擷取 BLOB 欄位的資料表。

範例程式碼已用下列的 OLE DB 提供者進行測試:
Microsoft Jet 3.51 OLE DB 提供者 (Msjtor35.dll 3.52.1527.4)
Oracle (Msdaora.dll 02.00.3002.15) 的 Microsoft OLE DB 提供者
SQL Server (Sqloledb.dll 07.00.0502) 的 Microsoft OLE DB 提供者
ODBC 驅動程式 (Msdasql.dll 02.00.3002.11) 的 Microsoft OLE DB 提供者
範例也已測試的下列 ODBC 驅動程式透過 Microsoft OLE DB 提供者存取的 ODBC 驅動程式:
驅動 Microsoft SQL Server ODBC 程式 (Sqlsrv32.dll 3.60.0319)。
Oracle (Msora32.dll 2.573.292700) 的 [Microsoft ODBC 驅動程式]。
Microsoft Access 驅動程式 (Odbcjt32.dll 3.51.1713)

其他相關資訊

從 「 Microsoft 下載中心 」 下載下列檔案有:


Aotblob.exe (http://download.microsoft.com/download/vc60ent/sample3/1/win98/en-us/aotblob.exe)

如需有關如何下載 Microsoft 支援檔案的詳細資訊,按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
119591? (http://support.microsoft.com/kb/119591/EN-US/ ) 如何從線上服務取得 Microsoft 支援檔案
Microsoft 已掃描這個檔案有無病毒。Microsoft 使用已張貼檔案的日期中的 [可用的最新病毒偵測軟體。檔案儲存在安全性強化的伺服器上,以避免任何未經授權的更改至檔案。

讀取 BLOB 資料使用 ATL OLE DB 消費者樣板

ATL OLE DB 消費者樣板精靈建立一個功能完整讀取-唯一類別會讀取長二進位 (BLOB) 資料庫欄位。如果您想要寫入長二進位欄位,您必須讓精靈-產生類別的修改。

在精靈產生 OLE DB 消費者類別,提供者會自動填入與目前的資料列的 ISequentialStream 指標任何 BLOB 欄位成員變數。從 [BLOB 欄位讀取資料,您呼叫 ISequentialStream 介面在迴圈中的讀取方法,直到沒有更多的資料由 OLE DB 提供者傳送。請注意大部份的提供者沒有提供的資料之前先讀取該資料,這樣您就必須建置以動態方式來存放資料,當您閱讀緩衝區的總長度。

寫入 BLOB 資料使用 ATL OLE DB 消費者樣板

要寫入 BLOB 欄位,您必須釋放 ISequentialStream 指標由 OLE DB 提供者提供給您,並且取代您實作一個 ISequentialStream 指標。提供者接著會呼叫 ISequentialStream::Read 介面指標上直到傳回更多的位元組。此內容的一種方法會反轉消費者和提供者的角色。取用者提供 ISequentialStream] 指標,並提供者呼叫 ISequentialStream::Read。請注意,某些 OLE DB 提供者會要求您指出事先多少位元組是 BLOB 欄位中,當您撰寫 BLOB 資料。若要盡可能使用多個提供者,範例會提供長度資訊給在每一種情況下提供者。

若要簡化讀取及寫入 BLOB 資料與 OLE DB,AOTBLOB 範例會有 Helper 類別,稱為 CISSHelper。CISSHelper 類別會實作整個 ISequentialStream 介面。類別也有用來儲存及擷取 BLOB 資料一個內建緩衝區。請注意 [CISSHelper 不會終結本身時其發行計數會降到零類似於一般的 COM 介面。AddRef 和發行會留在讓提供者可以呼叫它們,但是這個範例使用堆疊,配置物件,並依賴 C + + 解構函式,以清理物件。

您必須能夠寫入 BLOB 欄位修改 ATL OLE DB 消費者精靈產生的繫結巨集,並將欄位長度和狀態指示器的支援加入如下:
   // Before:

   BEGIN_COLUMN_MAP(...)
   // Various fields..
      BLOB_ENTRY(2, IID_ISequentialStream,STGM_READ, m_BLOBDATA)
   // Various fields...
   END_COLUMN_MAP()

   // After:
   ULONG m_BLOBDATA_LENGTH;
   ULONG m_BLOBDATA_STATUS;

   BEGIN_COLUMN_MAP(...)
   // Various fields...
      BLOB_ENTRY_LENGTH_STATUS(2, IID_ISequentialStream, \ 
                               STGM_READ, m_BLOBDATA, \ 
                m_BLOBDATA_LENGTH, m_BLOBDATA_STATUS)
   // Various fields...
   END_COLUMN_MAP()
				
的長度指標需要以 OLE DB 提供者提供 BLOB 資料的長度,當您將寫入 [BLOB。請注意 BLOB_ENTRY_LENGTH_STATUS 巨集的定義包含在 AOTBLOB 範例專案中--不包含在 ATL OLE DB 消費者類別的 ATL 標頭檔。

精靈產生的範本沒有額外的修改所需。

若要從使用一個修改過的 BLOB 欄位讀取 (長度和狀態加入) 消費者樣板類別,請依照下列這個基本公式:

  1. 開啟修改過的 ATL OLE DB 消費者類別。
  2. 移到您想要的記錄。
  3. 檢查 BLOB 欄位的狀態。如果 BLOB 欄位狀態指標不設為 DBSTATUS_S_OK,您可能必須 null 的 BLOB 欄位。請勿使用提供者建立 ISequentialStream 指標,如果 [狀態] 欄位不設定成 [DBSTATUS_S_OK ; 它可能不是有效的指標。
  4. 讀取循環播放,並呼叫 ISequentialStream::Read 區塊直到傳回的位元組讀取參數中指示的所有資料。您可以處理連入的資料,在迴圈中的區塊中,或將區塊組合成一個大型的緩衝區,以供稍後使用。
  5. 在樣板類別,以釋放所有欄位緩衝區上呼叫 FreeRecordMemory()。
  6. 移至下一筆資料、 關閉該資料錄集等等。
若要寫入 BLOB 欄位,請依照下列一般步驟執行:

  1. 開啟修改過的 ATL OLE DB 消費者類別。
  2. 移到您想要的記錄。
  3. 檢查 BLOB 欄位的狀態。如果 BLOB 欄位狀態指標不設為 DBSTATUS_S_OK,您可能必須 null 的 BLOB 欄位。如果狀態是 DBSTATUS_S_OK,您必須在 [IsequentialStream 上呼叫發行提供者所提供給您的指標。
  4. 您想要插入到插入一個 CISSHelper BLOB 欄位將的資料複製類別物件。物件會實作 ISequentialStream::Write 方法,以協助您在這裡。
  5. 將設 [CISSHelper 中資料的長度長度指標類別物件。
  6. 設定 DBSTATUS_S_OK 狀態指示器。
  7. 設定 BLOB 成員欄位 (ISequentialStream 指標) 來指向 CISSHelper 物件。
  8. 觸發更新消費者類別上呼叫 SetData 方法。在此時提供者呼叫上 [CISSHelper ISequentialStream::Read 類別的所有資料會載入。
  9. 消費者類別中,以釋放所有欄位緩衝區上呼叫 FreeRecordMemory()。
  10. 移至下一個記錄、 關閉資料錄集,等等。
請注意,如果您想要加入新資料錄,而不是修改現有的記錄只是變更步驟 7 上述呼叫 Insert(),而不是 SetData()。

這篇文章中的資訊適用於:
  • Microsoft OLE DB 2.7?應用於:
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbdownload kbconsumer kbdatabase kbdtl kbfile kbhowto KB190958 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:190958? (http://support.microsoft.com/kb/190958/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。