AdvancedPV 範例:示範進階的提供者技術
更新:2007 年 11 月
AdvancedPV 範例和 UpdatePV 非常類似,但是它會示範一些進階技術。
一般而言,以 OLE DB 樣板撰寫的提供者都會使用 CAtlArray 做為資料儲存區。OLE DB 提供者樣板會呼叫使用者提供的 Execute 方法來填入陣列 (例如,將所有資料列從資料檔案載入陣列)。另一個使用者提供的方法 FlushData 則是用來儲存陣列的內容 (例如,將陣列內容寫回資料檔案內)。這個方法的問題在於您必須在 Execute 中載入資料列集 (Rowset) 內的所有資料列,而在 FlushData 中則必須同時儲存所有的資料列。如果資料列集內有大量的資料列,所有資料都必須儲存於記憶體之中 (在 CAtlArray 物件內)。
AdvancedPV 示範如何使用特殊的陣列類別來取代預設的 CAtlArray 陣列,讓提供者依需要載入和儲存資料列。只會在確實要求資料列時,才會從資料檔中載入資料列 (經由特別實作的 operator[]),而在陣列內容有所變更時,會立刻將變更寫回檔案。
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置和執行這個範例
開啟方案檔 AdvancedPV.sln。
從 [建置] 功能表中,按一下 [建置]。
以 Win32 專案精靈建立 Win32 主控台應用程式,讓它能夠支援 ATL。
在專案中加入 OLE DB 消費者 (從 [加入類別] 中選取 [ATL OLE DB 消費者])。
在 ATL OLE DB 消費者精靈中按一下 [資料來源] 按鈕,然後在 [資料連結屬性] 中選取 [AdvancedProv 提供者] (在您建置 AdvancedPV 時,AdvancedProv 提供者應會自動登錄,但是如果您未在此處看到它的登錄時,請針對 AdvancedPV.dll 執行 regsvr32.exe)。
按一下 [下一步] 移至 [連接] 索引標籤,接著在 [輸入要使用的初始目錄] 下指定要使用的初始資料庫目錄 (即 DataFile.dat 的路徑)。
在 [選取資料庫物件] 下開啟 [資料表];裡面只有一個項目 (即 DataFile.dat 的路徑)。選取它,然後按一下 [確定]。當您回到 ATL OLE DB 消費者精靈時,選取 [資料表],將類別重新命名為較短的名稱 (如果需要的話),例如 CMyCons,然後按一下 [完成]。建置該消費者專案。
將下列程式碼加入專案的主程式碼中:
#include "MyCons.h" int main( int argc, char* argv[] ) { // Add this code HRESULT hr = CoInitialize(NULL); CMyCons rs; hr = rs.OpenAll(); ATLASSERT( SUCCEEDED(hr)); hr = rs.MoveFirst(); while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) { printf( "%d %s %s %s %s\n", rs.m_Fixed, rs.m_Command, rs.m_Text, rs.m_Command2, rs.m_Text2 ); hr = rs.MoveNext(); } rs.CloseAll(); CoUninitialize(); return 0; }
將中斷點置於 CoUninitialize 函式,這會讓主控台保持在開啟的狀態,方便您檢視結果。按一下 [開始] 按鈕 (或按一下 [偵錯] 功能表的 [啟動但不偵錯]) 來執行應用程式。此時,您應該會看到五行文字出現,一行是索引,四行是文字。
關鍵字
本範例使用下列介面:
IRowsetLocateImpl, IRowsetScroll, IRowsetScrollImpl, IRowsetUpdateImpl, IConnectionPointContainerImpl, IRowsetNotifyCP, IDBCreateSessionImpl, IDBInitializeImpl, IDBPropertiesImpl, IPersistImpl, IInternalConnectionImpl, IGetDataSourceImpl, IOpenRowsetImpl, ISessionPropertiesImpl, IObjectWithSiteSessionImpl, IDBSchemaRowsetImpl, IDBCreateCommandImpl, IAccessorImpl, ICommandTextImpl, ICommandPropertiesImpl, IObjectWithSiteImpl, IConvertTypeImpl, IColumnsInfoImpl, IInternalCommandConnectionImpl
本範例示範下列類別:
CSchemaRowsetImpl, CComObjectRootEx, CComObjectRootEx, CRowsetImpl, CFileArray, CSimpleRow
本範例示範下列巨集:
COM_INTERFACE_ENTRY, PROPERTY_INFO_ENTRY