次の方法で共有


AdvancedPV サンプル:高度なプロバイダー手法を示します

AdvancedPV サンプルでは、UpdatePV とよく似ていますが、いくらか高度な技法を示します。

通常、OLE DB テンプレートを使用して作成されたプロバイダーでは、データの格納に CAtlArray を使用します。 OLE DB プロバイダー テンプレートは、ユーザーが指定した Execute メソッドを呼び出して、配列に値を代入します。たとえば、データ ファイルから配列にすべての行を読み込みます。 ユーザーが指定した別のメソッドである FlushData は、配列の内容の保存 (たとえば、配列の内容をデータ ファイルに戻すため) に使用されます。この方法の問題点は、Execute では行セット内のすべての行を読み込む必要があり、FlushData ではすべての行を同時に保存する必要があるということです。 行セット内に大量の行がある場合は、すべてのデータを CAtlArray オブジェクトのメモリに格納する必要があります。

AdvancedPV では、既定の CAtlArray 配列の代わりに特殊な配列クラスを使用して、必要に応じてプロバイダーで行の読み込みと保存を行う方法を示します。 行は、特別に実装された operator[] を通じて、実際に要求されたときだけデータ ファイルから読み込まれ、配列の内容が変更されると、変更内容がすぐにファイルに書き戻されます。

セキュリティに関するメモセキュリティに関するメモ

このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。

サンプルとそのインストール手順を取得するには

Visual Studio のサンプルにアクセスするには

  • [ヘルプ] メニューの [サンプル] をクリックします。

    既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。

  • このサンプルの最新版および他のサンプルの一覧については、MSDN Web サイト上で Visual Studio サンプル 」を参照してください。

サンプルのビルドと実行

このサンプルをビルドして実行するには

  1. ソリューション ファイル AdvancedPV.sln を開きます。

  2. [ビルド] メニューの [ビルド] をクリックします。

  3. Win32 プロジェクト ウィザードで、Win32 コンソール アプリケーションを作成します。 作成したアプリケーションに ATL サポートを追加します。

  4. OLE DB コンシューマーをプロジェクトに (からクラスの追加、ATL OLE DB コンシューマーの選択 ) を追加します。

  5. ATL OLE DB コンシューマー ウィザードで、データ ソースの ボタンをクリックし、AdvancedProv プロバイダー のデータ リンク プロパティ] オンにします。 AdvancedProv プロバイダーは AdvancedPV のビルド時に自動的に登録されますが、この一覧に表示されていない場合は、AdvancedPV.dll で regsvr32.exe を実行してください。

  6. Next を 接続 タブ、 を使用するには、初期カタログ (DataFile.dat へのパス) を使用する指定は、初期カタログを入力] に移動します] をクリックします。

  7. で [データベース オブジェクトの選択 テーブル; を開く項目 (DataFile.dat へのパス) を 1 つだけです。 このアイテムを選択し、[OK] をクリックします。 選択 テーブルは、ATL OLE DB コンシューマー ウィザードに戻ったら、クラスに何か短い (必要な場合) CMyConsなど、名前を変更し、完了の の] をクリックします。 コンシューマー プロジェクトをビルドします。

  8. プロジェクトのメイン コードに次のコードを追加します。

                                #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;
    }
    
  9. CoUninitialize 関数では、ブレークポイントを配置します。これにより、コンソールの結果を表示するために開いたままになります。 スタート をクリックして、アプリケーションを実行します (または デバッグ メニューから [デバッグなしで開始] をクリックします)。 5 列のテキスト (インデックスが 1 列およびテキストが 4 列) が出力されます。

Keywords

このサンプルでは、次のインターフェイスを使用します。

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

参照

その他の技術情報

ATL サンプル