動的に決定する列をコンシューマーに返される

PROVIDER_COLUMN_ENTRYマクロは通常、 IColumnsInfo::GetColumnsInfo呼び出しを処理します。消費者またはブックマークを使用することをしないことがあります。 ので、ただし、プロバイダーによってかどうかは、消費者がブックマークを要求時に返される列を変更する必要があります。

PROVIDER_COLUMN_MAP IColumnsInfo::GetColumnsInfo呼び出しを処理するには、削除 (関数を定義 _GetColumnInfo ) から、 CAgentMan ユーザー記録 MyProviderRS.h と、独自の定義を置き換えます _GetColumnInfo 関数

//////////////////////////////////////////////////////////////////////////MyProviderRS.Hクラス CAgentMan{パブリック。DWORD dwBookmark;TCHAR szCommand [256];TCHAR szText [256];TCHAR szCommand2 [256];TCHAR szText2 [256];静的 ATLCOLUMNINFO ※ _GetColumnInfo (void ※ pThis、ULONG ※ pcCols);ブール値演算子 = = (const CAgentManamp; 日){返す (lstrcmpi (szCommand、am.szCommand) = = 0);}}(&A)

次に、実装、 _GetColumnInfo 機能 MyProviderRS.cpp には、次のコードに示すように。

_GetColumnInfo最初の OLE DB プロパティDBPROP_IRowsetLocateに設定されているかどうかを参照してくださいにチェックします。プロパティを取得する _GetColumnInfo ポインターを使用して ( pRowset )、行セット オブジェクトに。pThis(これは、クラスは、プロパティ マップの格納場所です)、行セットを作成するクラスのポインターを表します。_GetColumnInfo渡す、 pThis へのポインター、 RMyProviderRowset ポインター。

DBPROP_IRowsetLocateプロパティについてを確認するには _GetColumnInfo の呼び出しQueryInterfaceを取得することができます、 IRowsetInfoインターフェイスを使用して、 pRowset インターフェイス。(代替方法として、あなたに ATL CComQIPtr代わりに使用できます。)

//////////////////////////////////////////////////////////////////////MyProviderRS.cppATLCOLUMNINFO ※ CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols){静的の ATLCOLUMNINFO _rgColumns [5];ULONG ulCols = 0;・それなら、ゼロの序数を設定ブックマークのプロパティ フラグのチェック・ エントリは列にマップ、ブックマーク情報を。CAgentRowset ※ pRowset (CAgentRowset ※) pThis; =CComQIPtrlt; IRowsetInfo、& IID_IRowsetInfo > spRowsetProps pRowset; =CDBPropIDSet set(DBPROPSET_ROWSET);設定します。AddPropertyID(DBPROP_BOOKMARKS);DBPROPSET ※ pPropSet = NULL;ULONG ulPropSet = 0;HRESULT の時間;場合 (spRowsetProps)hr = spRowsetProps - > GetProperties (1、& セット、ulPropSet、& pPropSet);場合 (pPropSet){CComVariant var = pPropSet - > rgProperties [0] .vvalue;CoTaskMemFree (pPropSet - > rgProperties);CoTaskMemFree(pPropSet);場合 (SUCCEEDED(hr) & & (var.boolVal VARIANT_TRUE を = =)){ADD_COLUMN_ENTRY_EX (ulCols、OLESTR("Bookmark")、0、数がわかります、DBTYPE_BYTES、0、0、GUID_、CAgentMan、dwBookmark、DBCOLUMNFLAGS_ISBOOKMARK)ulCols + +;}}//次に、他の列を設定します。ADD_COLUMN_ENTRY (ulCols、OLESTR("Command")、1、256、DBTYPE_STR、0 xff、0 xff、GUID_、CAgentMan、szCommand)ulCols + +;ADD_COLUMN_ENTRY (ulCols、OLESTR("Text")、2、256、DBTYPE_STR、0 xff、0 xff、GUID_、CAgentMan szText)ulCols + +;ADD_COLUMN_ENTRY (ulCols、OLESTR("Command2")、3、256、DBTYPE_STR、0 xff、0 xff、GUID_、CAgentMan、szCommand2)ulCols + +;ADD_COLUMN_ENTRY (ulCols、OLESTR("Text2")、4、256、DBTYPE_STR、0 xff、0 xff、GUID_、CAgentMan、szText2)ulCols + +;場合 (pcCols! = NULL)※ pcCols = ulCols;_rgColumns を返す;}

この例では、静的配列を使用して、列の情報を格納します。コンシューマーがブックマーク列を要求しない場合は、配列内の 1 つのエントリは使用されません。情報を処理するには、2 つの配列のマクロは、 ADD_COLUMN_ENTRYおよびADD_COLUMN_ENTRY_EXを作成します。ADD_COLUMN_ENTRY_EXかかる余分なパラメーター flags には、ブックマーク列を指定する場合に必要な。

//////////////////////////////////////////////////////////////////////////MyProviderRS.h#define ADD_COLUMN_ENTRY (ulCols、名、序数、colSize、型、精度、スケール、guid、dataClass、メンバー) \_rgColumns [ulCols] .pwszname = (LPOLESTR) の名前。\_rgColumns [ulCols] .ptypeinfo = ITypeInfo ※ NULL;\_rgColumns [ulCols] .iordinal (ULONG) 序数; =\_rgColumns [ulCols] .dwflags = 0;\_rgColumns [ulCols] .ulcolumnsize (ULONG) colSize; =\_rgColumns [ulCols] .wtype = (DBTYPE) 種類;\_rgColumns [ulCols] .bprecision (バイト) 精度; =\_rgColumns [ulCols] .bscale (バイト) の縮尺; =\_rgColumns [ulCols] .cboffset = offsetof dataClass ・ メンバー);#define ADD_COLUMN_ENTRY_EX (ulCols、名、序数、colSize、型、精度、スケール、guid、dataClass、メンバー、フラグ) \_rgColumns [ulCols] .pwszname = (LPOLESTR) の名前。\_rgColumns [ulCols] .ptypeinfo = ITypeInfo ※ NULL;\_rgColumns [ulCols] .iordinal (ULONG) 序数; =\_rgColumns [ulCols] .dwflags = フラグ;\_rgColumns [ulCols] .ulcolumnsize (ULONG) colSize; =\_rgColumns [ulCols] .wtype = (DBTYPE) 種類;\_rgColumns [ulCols] .bprecision (バイト) 精度; =\_rgColumns [ulCols] .bscale (バイト) の縮尺; =\_rgColumns [ulCols] .cboffset = offsetof dataClass ・ メンバー);\memset(amp;(_rgColumns[ulCols].columnid)、0、sizeof(DBID));\_rgColumns [ulCols].columnid.uName.pwszName = (LPOLESTR) の名前(&A)

_GetColumnInfo関数、ブックマーク マクロは次のようなを使用:

ADD_COLUMN_ENTRY_EX (ulCols、OLESTR("Bookmark")、0、数がわかります、DBTYPE_BYTES、0、0、GUID_、CAgentMan、dwBookmark、DBCOLUMNFLAGS_ISBOOKMARK)

コンパイルして、拡張されたプロバイダーを実行できます。プロバイダーをテストするには、消費者の Enhanced Provider で使用するための変更で説明されているようにテスト コンシューマーを変更します。テスト コンシューマーは、プロバイダーに実行します。[テスト コンシューマー] ダイアログ ボックスの実行ボタンをクリックすると、テスト コンシューマーが適切な文字列をプロバイダーから取得することを確認します。

戻る、OLE DB テンプレート プロバイダを実装するには

Index