UpdatePV 範例:實作可更新的 OLE DB 提供者
更新:2007 年 11 月
UpdatePV 範例是一個「OLE DB 提供者樣板」範例,示範如何實作一個可更新的 (讀取/寫入) 提供者。明確地說,它會示範如何執行立即和延後的插入、更新和刪除。UpdatePV 也會示範如何使用結構描述資料列集 (它可以讓一些精靈更輕鬆地與提供者互動)。UpdatePV 也會示範 IRowsetLocateImpl 類別,就像 MyProv 一樣。
如需使用提供者載入和儲存資料的其他技術說明,請參閱 AdvancedPV 範例。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要示範範例所要達到的功能,請建置本範例,建立具有提供者存取子的消費者專案,並建立一個主控台應用程式來存取和輸出資料。
若要建置和執行這個範例
開啟方案檔 UpdatePV.sln。
在 [建置] 功能表中,按一下 [建置方案]。
使用 ATL 專案精靈來建立消費者專案 (讓它成為使用屬性的 .dll)。
在消費者專案中加入 OLE DB 消費者 (從 [加入類別] 中選取 [ATL OLE DB 消費者])。
在 [ATL OLE DB 消費者] 精靈中按一下 [資料來源] 按鈕,並在 [資料連結屬性] 中選取 [UpProv OLE DB 提供者] (在您建置 UpdatePV 時,UpProv 提供者應該會自動註冊,但是如果它沒有列在這個位置,請針對 UpdatePV.dll 執行 regsvr32.exe)。
按一下 Next 以移至 [連接] 索引標籤,接著在 [輸入要使用的初始目錄] 下確認 MyData.txt 的路徑名稱正確無誤。
按一下 [確定]。[選取資料庫物件] 對話方塊隨即出現,然後開啟 [資料表],裡面只有一個項目:MyData.txt 的路徑名稱。請選取這個項目,然後按一下 [確定]。您會返回到 ATL OLE DB 消費者精靈。
在 [ATL OLE DB 消費者] 精靈中選取 [資料表],將類別重新命名為較短的名稱 (如有必要),例如 CMyCons,然後按一下 [完成]。
按下 [確定],關閉出現的安全性警告對話方塊。
從 CMyCons.h 中移除這行程式碼:
#error Security Issue: The connection string may contain a password
這行程式碼會造成無法編譯的情況,但插入此行是要警示您 (在現實情況中) 應該要保護機密的資訊。
在 [方案總管] 中,以滑鼠右鍵按一下專案的節點,然後按一下 [建置],建置消費者專案。
建立新的主控台應用程式。在 .cpp 檔中包含消費者標頭並修改程式碼,如下所示:
#include "stdafx.h" #include <atldbcli.h> #include "..\consumer\cmycons.h" int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = CoInitialize(NULL); CMyCons c; hr = c.OpenAll(); ATLASSERT( SUCCEEDED( hr ) ); hr = c.MoveFirst(); while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { printf( "%d %s %s %s %s\n", c.m_Fixed, c.m_Command, c.m_Text, c.m_Command2, c.m_Text2 ); hr = c.MoveNext(); } c.CloseAll(); CoUninitialize(); return 0; }
將中斷點置於 CoUninitialize 函式上,這會讓主控台維持開啟的狀態,方便您檢視結果。按一下 [開始] 按鈕,從程式開發環境中執行主控台應用程式。您應該會看到列印出五行文字 (一行是索引,四行是文字)。
範例如何操作
UpdatePV 是建置在 C 執行階段檔案 I/O 函式的最上層。這表示一個資料儲存。明確地說,此範例會使用一個包含一對資料項目的文字檔,並將它轉成資料列集。範例中包含一個內含一對資料項目的文字檔 MyData.txt。但是,您可以針對任何文字檔來執行它 (它只會將所有的資料剖析成許多雙字組)。
UpdatePV 會以 RUpdateRowset::Execute (rowset.h) 來執行其讀取作業。寫入作業是以 RUpdateRowset::FlushData (rowset.h) 來處理。這些都是由「OLE DB 提供者樣板」所呼叫的函式,可做為一般提供者作業的一部分。此範例使用「OLE DB 提供者樣板」IRowsetChangeImpl 和 IRowsetUpdateImpl 類別。IRowsetChangeImpl 類別支援立即插入、更新和刪除。IRowsetUpdateImpl 類別可支援延後的插入、更新和刪除。IRowsetUpdateImpl 類別是繼承自 IRowsetChangeImpl。如需取得或設定資料的詳細資訊,請參閱 Visual C++ 文件內的建立可更新的提供者,以及 Windows SDK 文件之<OLE DB 程式設計人員參考>中的更新資料列集中的資料。
UpdatePV 也會提供結構描述資料列集的支援。這些結構描述資料列集可以讓消費者找出提供者的相關資訊,而不需開啟資料列集或執行命令。Visual C++ 精靈會使用結構描述資料列集來產生用戶端的存取子。主要的函式為 CUpdateSessionTRSchemaRowset::Execute、CUpdateSessionColSchemaRowset::Execute 和 CUpdateSessionPTSchemaRowset::Execute。這三個函式都會傳回提供者支援的資料表、資料表中的資料行、資料表中的資料型別等資訊。如需結構描述資料列集的詳細資訊,請參閱《OLE DB 程式設計人員參考》中的 IDBSchemaRowset 介面。
關鍵字
本範例為您示範下列介面:
IRowsetChange, IRowsetUpdateImpl
本範例為您示範下列屬性:
DBPROP_IRowsetChange, DBPROP_IRowsetUpdate