Динамічно визначення стовпців повернувся до споживача

PROVIDER_COLUMN_ENTRY макроси зазвичай обробки викликів IColumnsInfo::GetColumnsInfo . Оскільки споживачі можуть або може не скористатися закладки, однак, постачальник повинен мати можливість змінення стовпців повернувся, залежно від того, чи не споживача запитує закладки.

Для обробки IColumnsInfo::GetColumnsInfo дзвінка, видалити PROVIDER_COLUMN_MAP (який визначає функції _GetColumnInfo ) від в CAgentMan користувача запису в MyProviderRS.h і замінити його визначення для власного _GetColumnInfo функції

////////////////////////////////////////////////////////////////////////
/ / MyProviderRS.H
клас C&AgentMan
{
готелю:
   DWORD dwBookmark;
   TCHAR szCommand [256];
   TCHAR szText [256];
   TCHAR szCommand2 [256];
   TCHAR szText2 [256];

статичний ATLCOLUMNINFO * _GetColumnInfo (void * pThis, ULONG * pcCols);
   bool оператор == (константа CAgentManamp; ранку)
   {
      повернення (lstrcmpi (szCommand, am.szCommand) = = 0);
   }

}

Далі, реалізувати на _GetColumnInfo функціонувати в MyProviderRS.cpp, як показано в нижче код.

_GetColumnInfoПеревіряє перший, щоб побачити, якщо властивість OLE DB DBPROP_IRowsetLocate встановлений. Отримати властивість, _GetColumnInfo використовує вказівник ( pRowset ) до об'єкта набір рядків. На pThis вказівник представляють класу, які створили набір рядків, (який є клас, де зберігаються властивості карти). _GetColumnInfo typecasts на pThis вказівник на RMyProviderRowset вказівник.

Щоб перевірити властивість DBPROP_IRowsetLocate _GetColumnInfo використовує IRowsetInfo інтерфейс, який можна отримати за номером QueryInterface на на pRowset інтерфейс. (Як альтернатива, ви можете використовувати в ATL CComQIPtr замість цього.)

////////////////////////////////////////////////////////////////////
/ / MyProviderRS.cpp
ATLCOLUMNINFO * 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 hr;

Якщо (spRowsetProps)
      hr = spRowsetProps - > GetProperties (1 та набір & ulPropSet та pPropSet);

Якщо (pPropSet)
   {
      CComVariant var = pPropSet - > .vvalue rgProperties [0];
      CoTaskMemFree (pPropSet - > rgProperties);
      CoTaskMemFree(pPropSet);
      
      Якщо (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 + +;
      }
   }

/ / Наступна настроїти інші стовпці.
   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 + +;

Якщо (pcCols! = NULL)
      * pcCols = ulCols;

повернення _rgColumns;
}

Цей приклад використовує статичний масив містити стовпці відомостей. Якщо споживач не стовпець закладки, один запис в масив, невикористані. Для обробки інформації, створення двох масивів макроси, ADD_COLUMN_ENTRY і ADD_COLUMN_ENTRY_EX. ADD_COLUMN_ENTRY_EX займає додатковий параметр, flags , що це необхідно, якщо ви призначити закладку стовпця.

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

# визначити &ADD_COLUMN_ENTRY (ulCols, ім'я, порядковий, colSize, тип, точність, масштаб, guid, dataClass, член) \
   .pwszName _rgColumns [ulCols] = ім'я (LPOLESTR); \
   .pTypeInfo _rgColumns [ulCols] = (ITypeInfo *) значення NULL; \
   .iOrdinal _rgColumns [ulCols] = порядкові (ULONG); \
   .dwFlags _rgColumns [ulCols] = 0; \
   .ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
   .wType _rgColumns [ulCols] = тип (DBTYPE); \
   .bPrecision _rgColumns [ulCols] = точності (БАЙТІВ); \
   .bScale _rgColumns [ulCols] = шкалою (БАЙТІВ); \
   .cbOffset _rgColumns [ulCols] = offsetof (dataClass, член);

# визначити ADD_COLUMN_ENTRY_EX (ulCols, ім'я, порядковий, colSize, тип, точність, масштаб, guid, dataClass, член, прапори) \
   .pwszName _rgColumns [ulCols] = ім'я (LPOLESTR); \
   .pTypeInfo _rgColumns [ulCols] = (ITypeInfo *) значення NULL; \
   .iOrdinal _rgColumns [ulCols] = порядкові (ULONG); \
   .dwFlags _rgColumns [ulCols] = позначки; \
   .ulColumnSize _rgColumns [ulCols] = colSize (ULONG); \
   .wType _rgColumns [ulCols] = тип (DBTYPE); \
   .bPrecision _rgColumns [ulCols] = точності (БАЙТІВ); \
   .bScale _rgColumns [ulCols] = шкалою (БАЙТІВ); \
   .cbOffset _rgColumns [ulCols] = offsetof (dataClass, член); \
   memset(amp;(_rgColumns[ulCols].columnid), 0, sizeof(DBID)); \
   .columnid.uName.pwszName _rgColumns [ulCols] = ім'я (LPOLESTR)

У на _GetColumnInfo функції, закладку макросу використовується як це:

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

Тепер можна скомпілювати і запустити розширений постачальника. Для перевірки провайдера, змінити випробування споживача, як описано в модифікації споживача для використання цього постачальника розширення. Запустити тест споживачів з провайдером. Переконайтеся, що споживчі тестування отримує належної рядків від постачальника, після натискання кнопки запустити тест споживачів у діалоговому вікні.

Назад до виконання постачальника OLE DB шаблон

Index