Dynamicznie określania kolumn zwracana dla konsumenta

Makra PROVIDER_COLUMN_ENTRY zwykle obsłużyć wywołania IColumnsInfo::GetColumnsInfo . Ponieważ konsument może lub nie może wybrać opcję użyć zakładki, jednak dostawca musi mieć możliwość zmiany kolumn zwracana, zależnie od tego, czy konsument zwraca się do zakładki.

Aby obsłużyć wywołania IColumnsInfo::GetColumnsInfo , Usuń PROVIDER_COLUMN_MAP (która definiuje funkcję _GetColumnInfo ) z CAgentMan użytkownik rejestruje w MyProviderRS.h i zamień ją na własną definicję _GetColumnInfo funkcji

////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
Klasa C&AgentMan
{
publiczne:
   DWORD dwBookmark;
   TCHAR szCommand [256];
   TCHAR szText [256];
   TCHAR szCommand2 [256];
   TCHAR szText2 [256];

statyczne ATLCOLUMNINFO * _GetColumnInfo (void * pThis, ULONG * pcCols);
   bool operatorem == (const CAgentManamp, am)
   {
      Zwraca (lstrcmpi (szCommand, am.szCommand) == 0);
   }

}

Następnie wdrożenia _GetColumnInfo działać w MyProviderRS.cpp, jak pokazano w poniższym kodzie.

_GetColumnInfoSprawdza pierwszy zobacz, jeśli właściwość OLE DB jest ustawiona DBPROP_IRowsetLocate . Aby uzyskać właściwości _GetColumnInfo używa wskaźnika ( pRowset ) do obiektu zestawu wierszy. pThisWskaźnik reprezentuje klasę, który utworzył zestaw wierszy, (który jest klasa, w której przechowywany jest mapa właściwości). _GetColumnInfo typecasts pThis wskaźnik RMyProviderRowset wskaźnik.

Aby sprawdzić, czy właściwość DBPROP_IRowsetLocate _GetColumnInfo korzysta z interfejsu IRowsetInfo , które można uzyskać poprzez wywołanie metody QueryInterface w pRowset interfejsu. (Jako alternatywę można użyć ATL CComQIPtr zamiast.)

////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * CAgentMan::_GetColumnInfo(void* pThis, ULONG* pcCols)
{
   statyczne ATLCOLUMNINFO _rgColumns [5];
   ULONG ulCols = 0;
            
   / / Check Flaga właściwości zakładki, jeżeli jest ustawiony, ustawić zerową liczba porządkowa
   / wpis w kolumnie mapę z informacji o zakładkach.
   CAgentRowset * pRowset = CAgentRowset ** pThis;
   CComQIPtrlt; IRowsetInfo, & IID_IRowsetInfo > spRowsetProps = pRowset;

CDBPropIDSet set(DBPROPSET_ROWSET);
   zestaw.AddPropertyID(DBPROP_BOOKMARKS);
   DBPROPSET * pPropSet = NULL;
   ULONG ulPropSet = 0;
   HRESULT hr;

Jeżeli (spRowsetProps)
      hr = spRowsetProps - > GetProperties (1 & zestaw & ulPropSet i pPropSet);

Jeżeli (pPropSet)
   {
      CComVariant var = pPropSet - > rgProperties [0] .vvalue;
      CoTaskMemFree (pPropSet - > rgProperties);
      CoTaskMemFree(pPropSet);
      
      Jeżeli (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 ++;
      }
   }

/ / Następne ustawienie innych kolumn.
   ADD_COLUMN_ENTRY (ulCols, OLESTR("Command"), 1, 256, typem DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szCommand)
   ulCols ++;
   ADD_COLUMN_ENTRY (ulCols, OLESTR("Text"), 2, 256, typem DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szText)
   ulCols ++;

ADD_COLUMN_ENTRY (ulCols, OLESTR("Command2"), 3, 256, typem DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szCommand2)
   ulCols ++;
   ADD_COLUMN_ENTRY (ulCols, OLESTR("Text2"), 4, 256, typem DBTYPE_STR, 0xFF, 0xFF, GUID_NULL, CAgentMan, szText2)
   ulCols ++;

Jeżeli (pcCols! = NULL)
      * pcCols = ulCols;

Zwraca _rgColumns;
}

W tym przykładzie użyto tablicy statyczne musi zawierać informacje kolumny. Jeśli konsument nie ma kolumnę zakładki, jeden wpis w tablicy jest nieużywany. W celu obsługi informacji, należy utworzyć dwa makra tablicy, ADD_COLUMN_ENTRY i ADD_COLUMN_ENTRY_EX. ADD_COLUMN_ENTRY_EX przyjmuje jako dodatkowy parametr, flags , to jest potrzebna w przypadku wyznaczenia kolumnę zakładki.

////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.h

# define &ADD_COLUMN_ENTRY (ulCols, nazwa, porządkowych, colSize, typu, precyzji, skali, guid, dataClass, członek) \
   .pwszName _rgColumns [ulCols] = nazwa (LPOLESTR); \
   .pTypeInfo _rgColumns [ulCols] = ITypeInfo ** NULL; \
   .iOrdinal _rgColumns [ulCols] = liczba porządkowa (ULONG); \
   .dwFlags _rgColumns [ulCols] = 0; \
   .ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
   .wType _rgColumns [ulCols] = type (typ DBTYPE); \
   .bPrecision _rgColumns [ulCols] = precyzji (BAJT); \
   .bScale _rgColumns [ulCols] = skali (BAJT); \
   .cbOffset _rgColumns [ulCols] = offsetof (dataClass, członek);

# define ADD_COLUMN_ENTRY_EX (ulCols, nazwa, porządkowych, colSize, typu, precyzji, skali, guid, dataClass, członek, flagi) \
   .pwszName _rgColumns [ulCols] = nazwa (LPOLESTR); \
   .pTypeInfo _rgColumns [ulCols] = ITypeInfo ** NULL; \
   .iOrdinal _rgColumns [ulCols] = liczba porządkowa (ULONG); \
   .dwFlags _rgColumns [ulCols] = flagi; \
   .ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
   .wType _rgColumns [ulCols] = type (typ DBTYPE); \
   .bPrecision _rgColumns [ulCols] = precyzji (BAJT); \
   .bScale _rgColumns [ulCols] = skali (BAJT); \
   .cbOffset _rgColumns [ulCols] = offsetof (dataClass, członek); \
   memset(amp;(_rgColumns[ulCols].ColumnID), 0, sizeof(DBID)); \
   .columnid.uName.pwszName _rgColumns [ulCols] = nazwa (LPOLESTR)

W _GetColumnInfo funkcji makr zakładki jest używane jak poniżej:

ADD_COLUMN_ENTRY_EX (ulCols, OLESTR("Bookmark"), 0, sizeof(DWORD),
   DBTYPE_BYTES, 0, 0, GUID_NULL, CAgentMan, dwBookmark, DBCOLUMNFLAGS_ISBOOKMARK)

Można teraz skompilować i uruchomić rozszerzonego dostawcy. Aby przetestować dostawca, zmodyfikować konsumenta badania, zgodnie z opisem w Modyfikowanie konsumentów do użytku z rozszerzonego dostawcy. Uruchom konsumenta badania z dostawcą. Zweryfikuj, że konsument badania pobiera prawidłowe ciągi od dostawcy, po kliknięciu przycisku Uruchom w oknie dialogowym badania konsumenckie.

Wróć do wykonania dostawcą OLE DB szablonu

Index