Freigeben über


Dynamisches Binden von Spalten im Anbieter

Stellen Sie sicher, dass Sie wirklich dynamische Spaltenbindung benötigen. Möglicherweise benötigen Sie dies, weil:

  • Ihre Rowsetspalten werden zur Kompilierungszeit nicht definiert.

  • Sie unterstützen ein Element wie textmarken, das Spalten hinzufügt.

So implementieren Sie dynamische Spaltenbindung

  1. Entfernen Sie alle PROVIDER_COLUMN_MAPElemente aus Ihrem Code.

  2. Fügen Sie im Benutzerdatensatz (Struktur) die folgende Deklaration hinzu:

    static ATLCOLUMNINFO* GetColumnInfo(void* pThis, ULONG* pcCols);
    
  3. Implementieren Sie die GetColumnInfo Funktion. Diese Funktion legt fest, wie die Informationen gespeichert werden. Möglicherweise müssen Sie Eigenschaften oder andere Informationen für diese Funktion abrufen. Möglicherweise möchten Sie ein Makro erstellen, das dem COLUMN_ENTRY Makro ähnelt, um eigene Informationen hinzuzufügen.

    Das folgende Beispiel zeigt eine GetColumnInfo Funktion.

    // 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;
    }
    

Siehe auch

Arbeiten mit OLE DB-Anbietervorlagen