UpdatePV サンプル : 更新可能な OLE DB プロバイダの実装
更新 : 2007 年 11 月
UpdatePV サンプルは、更新可能な読み取り/書き込みプロバイダの実装方法を示す OLE DB プロバイダ テンプレート サンプルです。具体的には、即時および遅延の挿入、更新、削除の実行方法を示します。また、一部のウィザードでのプロバイダとの対話を簡単にするスキーマ行セットの使い方も示します。UpdatePV では、MyProv と同様に IRowsetLocateImpl クラスも示します。
プロバイダでのデータの読み込みと保存に関するその他の技法については、「AdvancedPV サンプル : 高度なプロバイダ技法の例」を参照してください。
セキュリティに関するメモ : |
---|
このサンプル コードは概念を示す目的で提供されているものです。必ずしも最も安全なコーディング手法に従っているわけではないので、アプリケーションまたは Web サイトでは使用しないでください。Microsoft は、サンプル コードが意図しない目的で使用された場合に、付随的または間接的な損害について責任を負いません。 |
サンプルとそのインストール手順を取得するには
Visual Studio で、[ヘルプ] メニューの [サンプル] をクリックします。
詳細については、「サンプル ファイルの格納場所」を参照してください。
使用できるサンプルの最新バージョンと完全な一覧については、オンラインの Visual Studio 2008 Samples のページを参照してください。
サンプルは、コンピュータのハード ディスク上にもあります。既定では、サンプルおよび Readme ファイルは、\Program Files\Visual Studio 9.0\Samples\ の下のフォルダにコピーされます。Visual Studio Express Edition の場合、すべてのサンプルはオンライン上にあります。
サンプルのビルドと実行
このサンプルの機能を示すには、サンプルをビルドし、プロバイダのアクセサを使用してコンシューマ プロジェクトを作成し、データにアクセスしたり、データを出力したりするコンソール アプリケーションを作成します。
このサンプルをビルドして実行するには
ソリューション ファイル UpdatePV.sln を開きます。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
ATL プロジェクト ウィザードでコンシューマ プロジェクトを作成します。このプロジェクトは属性付き .dll にします。
[クラスの追加] の [ATL OLE DB コンシューマ] を選択し、OLE DB コンシューマをコンシューマ プロジェクトに追加します。
ATL OLE DB コンシューマ ウィザードで、[データ ソース] をクリックし、[データ リンク プロパティ] の [UpProv OLE DB Provider] を選択します。UpProv プロバイダは UpdatePV のビルド時に自動的に登録されますが、この一覧に表示されていない場合は、UpdatePV.dll で regsvr32.exe を実行してください。
[次へ] (Next) をクリックして [接続] タブに移動し、[使用する初期カタログを入力します] で、MyData.txt へのパス名が正しいことを確認します。
[OK] をクリックします。[データベース オブジェクトの選択] ダイアログ ボックスが表示されます。次に、[テーブル] を開きます。ここには、1 つのアイテムだけ (MyData.txt へのパス名) が表示されます。これを選択し、[OK] をクリックします。ATL OLE DB コンシューマ ウィザードに戻ります。
ATL OLE DB コンシューマ ウィザードで、[テーブル] を選択し、必要に応じてクラス名を CMyCons などの短い名前に変更し、[完了] をクリックします。
[OK] をクリックし、ポップアップ表示されるセキュリティの警告ダイアログ ボックスを閉じます。
次の行を 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 関数にブレークポイントを挿入します。これにより、コンソールが開いたままになるため、結果を参照できます。[開始] をクリックして、開発環境でコンソール アプリケーションを実行します。5 列のテキスト (インデックスが 1 列およびテキストが 4 列) が出力されます。
サンプルの動作
UpdatePV は、C ランタイム ファイル入出力関数の最上位に作成されます。これはデータ ストアを表します。具体的には、サンプルはデータ要素のペアで構成されるテキスト ファイルを取得し、それを行セットに変換します。サンプルには、データ要素のペアを含む MyData.txt というテキスト ファイルが付属しています。ただし、サンプルは任意のテキスト ファイルに対して実行できます。解析の結果、すべての要素は 2 語ずつ区切られます。
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 Programmer's Reference』の「Updating Data in Rowsets」を参照してください。
UpdatePV は、スキーマ行セットもサポートします。スキーマ行セットを使用すると、コンシューマでは行セットを開いたりコマンドを実行したりせずに、プロバイダの情報を検索できます。Visual C++ ウィザードでは、スキーマ行セットを使用してクライアント側のアクセサを生成します。主要な関数は、CUpdateSessionTRSchemaRowset::Execute、CUpdateSessionColSchemaRowset::Execute、および CUpdateSessionPTSchemaRowset::Execute です。3 つの関数はすべて、プロバイダがサポートするテーブル、テーブルの列、およびテーブルのデータ型に関する情報を返します。スキーマ行セットの詳細については、『OLE DB Programmer's Reference』の IDBSchemaRowset インターフェイスに関するトピックを参照してください。
キーワード
このサンプルでは次のインターフェイスを使用します。
IRowsetChange、IRowsetUpdateImpl
このサンプルでは、次のプロパティを使用します。
DBPROP_IRowsetChange、DBPROP_IRowsetUpdate