AdvancedPV サンプル : 高度なプロバイダ技法の例
更新 : 2007 年 11 月
AdvancedPV サンプルでは、UpdatePV とよく似ていますが、いくらか高度な技法を示します。
通常、OLE DB テンプレートを使用して作成されたプロバイダでは、データの格納に CAtlArray を使用します。OLE DB プロバイダ テンプレートは、ユーザーが指定した Execute メソッドを呼び出して、配列に値を代入します。たとえば、データ ファイルから配列にすべての行を読み込みます。ユーザーが指定した別のメソッドである FlushData は、配列の内容の保存 (たとえば、配列の内容をデータ ファイルに戻すため) に使用されます。この方法の問題点は、Execute では行セット内のすべての行を読み込む必要があり、FlushData ではすべての行を同時に保存する必要があるということです。行セット内に大量の行がある場合は、すべてのデータを CAtlArray オブジェクトのメモリに格納する必要があります。
AdvancedPV では、既定の CAtlArray 配列の代わりに特殊な配列クラスを使用して、必要に応じてプロバイダで行の読み込みと保存を行う方法を示します。行は、特別に実装された operator[] を通じて、実際に要求されたときだけデータ ファイルから読み込まれ、配列の内容が変更されると、変更内容がすぐにファイルに書き戻されます。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
このサンプルをビルドして実行するには
ソリューション ファイル AdvancedPV.sln を開きます。
[ビルド] メニューの [ビルド] をクリックします。
Win32 プロジェクト ウィザードで、Win32 コンソール アプリケーションを作成します。作成したアプリケーションに ATL サポートを追加します。
[クラスの追加] の [ATL OLE DB コンシューマ] を選択し、OLE DB コンシューマをプロジェクトに追加します。
ATL OLE DB コンシューマ ウィザードで、[データ ソース] をクリックし、[データ リンク プロパティ] の [AdvancedProv Provider] を選択します。AdvancedProv プロバイダは AdvancedPV のビルド時に自動的に登録されますが、この一覧に表示されていない場合は、AdvancedPV.dll で regsvr32.exe を実行してください。
Next をクリックして [接続] タブに移動し、[使用する初期カタログを入力します] で、使用する初期カタログ (DataFile.dat へのパス) を指定します。
[データベース オブジェクトの選択] で、[テーブル] を開きます。ここにあるアイテムは 1 つだけ (DataFile.dat へのパス) です。このアイテムを選択し、[OK] をクリックします。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 関数にブレークポイントを挿入します。これにより、コンソールが開いたままになるため、結果を参照できます。[開始] をクリックするか、または [デバッグ] メニューの [デバッグなしで開始] をクリックして、アプリケーションを実行します。5 列のテキスト (インデックスが 1 列およびテキストが 4 列) が出力されます。
キーワード
このサンプルでは、次のインターフェイスを使用します。
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