Share via


プロバイダでの列の動的な連結

更新 : 2007 年 11 月

動的な列連結が本当に必要かどうかを確認します。動的な列バインディングが必要な場合は以下のとおりです。

  • 行セット列がコンパイル時に定義されていない。

  • 列を追加する要素 (ブックマークなど) をサポートする。

動的な列連結を実装するには

  1. コードからすべての PROVIDER_COLUMN_MAP を削除します。

  2. ユーザー レコード (構造体) で次の宣言を追加します。

    static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
    
  3. GetColumnInfo 関数を実装します。この関数は、情報の格納方法を設定します。この関数のプロパティなどの情報が必要な場合があります。COLUMN_ENTRY マクロと同じようなマクロを作成して、独自の情報を追加できます。

    次のコードは GetColumnInfo 関数の例です。

    // Check the property flag for bookmarks, if it is set, set the zero
    // ordinal entry in the column map with the bookmark information.
    CAgentRowset* pRowset = (CAgentRowset*) pThis;
    CComQIPtr<IRowsetInfo, &IID_IRowsetInfo> spRowsetProps = pRowset;
    
    CDBPropIDSet set(DBPROPSET_ROWSET);
    set.AddPropertyID(DBPROP_BOOKMARKS);
    DBPROPSET* pPropSet = NULL;
    ULONG ulPropSet = 0;
    HRESULT hr;
    
    if (spRowsetProps)
       hr = spRowsetProps->GetProperties(1, &set, &ulPropSet, &pPropSet);
    
    if (pPropSet)
    {
       CComVariant var = pPropSet->rgProperties[0].vValue;
       CoTaskMemFree(pPropSet->rgProperties);
       CoTaskMemFree(pPropSet);
    
       if (SUCCEEDED(hr) && (var.boolVal == VARIANT_TRUE))
       {
          ADD_COLUMN_ENTRY_EX(ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD), DBTYPE_BYTES, 
             0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)
          ulCols++;
       }
    }
    
    // Next, set up the other columns.
    ADD_COLUMN_ENTRY(ulCols, OLESTR("Command"), 1, 256, DBTYPE_STR, 0xFF, 0xFF, 
       GUID_NULL, CAgentMan, szCommand)
    ulCols++;
    ADD_COLUMN_ENTRY(ulCols, OLESTR("Text"), 2, 256, DBTYPE_STR, 0xFF, 0xFF, 
       GUID_NULL, CAgentMan, szText)
    ulCols++;
    
    ADD_COLUMN_ENTRY(ulCols, OLESTR("Command2"), 3, 256, DBTYPE_STR, 0xFF, 0xFF, 
       GUID_NULL, CAgentMan, szCommand2)
    ulCols++;
    ADD_COLUMN_ENTRY(ulCols, OLESTR("Text2"), 4, 256, DBTYPE_STR, 0xFF, 0xFF, 
       GUID_NULL, CAgentMan, szText2)
    ulCols++;
    
    
    if (pcCols != NULL)
       *pcCols = ulCols;
    
    return _rgColumns;
    }
    

参照

概念

OLE DB プロバイダ テンプレートの操作