Поделиться через


Проверка на совместимость с OLE DB

Пакет Data Access SDK содержит набор тестов на совместимость с OLE DB, который позволяет сделать поставщик более гибким. Эти тесты проверяют все аспекты поставщика и дают аргументированный ответ, правильно ли он функционирует. Тесты на совместимость с OLE DB можно найти в пакете Microsoft Data Access SDK. В этом подразделе описываются действия, которые нужно выполнить для проверки на совместимость. Сведения о выполнении тестов на совместимость с OLE DB см. в документации к пакету SDK.

Выполнение тестов на совместимость

В Visual C++ 6.0 в шаблоны поставщиков OLE DB добавлен ряд функций привязки, которые позволяют проверять значения и свойства. Большинство из этих функций были добавлены по результатам тестов на совместимость.

Примечание

Чтобы выполнить проверку на совместимость, необходимо добавить несколько функций проверки для данного поставщика.

Для этого поставщика требуется две программы проверки. Первая программа, CRowsetImpl::ValidateCommandID, является частью класса набора строк. Она вызывается во время создания набора строк шаблонами поставщика. В этом примере данная программа используется для информирования потребителей о том, что индексы не поддерживаются. Сначала вызывается программа CRowsetImpl::ValidateCommandID (обратите внимание, что поставщик использует определение типа класса _RowsetBaseClass, добавленное в схему интерфейса для набора CMyProviderRowset в разделе Поддержка закладок поставщиками, поэтому отпадает необходимость ввода длинной строки аргументов шаблона). Далее возвращается значение DB_E_NOINDEX, если параметр индекса не равен NULL (это означает, что потребитель будет использовать индекс). Дополнительные сведения об идентификаторах команд см. в спецификации OLE DB в разделе по IOpenRowset::OpenRowset.

Представленный ниже код является программой проверки ValidateCommandID.

/////////////////////////////////////////////////////////////////////
// MyProviderRS.H
// Class: CMyProviderRowset 

HRESULT ValidateCommandID(DBID* pTableID, DBID* pIndexID)
{
   HRESULT hr = _RowsetBaseClass::ValidateCommandID(pTableID, pIndexID);
   if (hr != S_OK)
      return hr;

   if (pIndexID != NULL)
      return DB_E_NOINDEX;    // Doesn't support indexes

   return S_OK;
}

Шаблоны поставщика вызывают метод OnPropertyChanged всякий раз при изменении свойства в группе DBPROPSET_ROWSET. Если необходимо обрабатывать свойства для других групп, нужно добавить эти группы в соответствующий объект (то есть DBPROPSET_SESSION выполняет проверку в классе CMyProviderSession).

Код сначала проверяет, связано ли свойство с другим свойством. Если свойство соединяется в цепочку с другими свойствами, он присваивает свойству DBPROP_BOOKMARKS значение True. Сведения об этих свойствах содержатся в приложении C спецификации OLE DB. Также в нем имеется информация о том, как узнать, является ли свойство частью цепочки.

В код также можно добавить программу IsValidValue. Шаблоны вызывают программу IsValidValue при попытке задать свойство. При необходимости дополнительной обработки при задании значения свойства этот метод нужно переопределить. Для каждого набора свойств может иметься один из этих методов.

Проблемы потока

По умолчанию мастер поставщиков OLE DB в мастере поставщиков ATL OLE DB создает код для запуска поставщика в замкнутой модели. При попытке запуска этого кода с помощью тестов на совместимость первоначально происходит сбой. Это связано с тем, что средство Ltm.exe, используемое для выполнения тестов, по умолчанию является свободнопотоковым. Код мастера поставщиков OLE DB по умолчанию использует замкнутую модель и весьма прост в использовании.

Чтобы устранить эту проблему, нужно изменить либо LTM, либо поставщик.

Изменение LTM для запуска в замкнутопотоковом режиме

  1. В главном меню LTM выберите пункт Сервис, а затем — Параметры.

  2. На вкладке Общие измените потоковую модель со свободнопотоковой на замкнутопотоковую.

Изменение поставщика для запуска в свободнопотоковом режиме

  • Найдите в проекте поставщика все экземпляры модели CComSingleThreadModel и замените их моделью CComMultiThreadModel, которая должна присутствовать в источнике данных, сеансе и заголовках наборов строк.

  • В RGS-файле измените потоковую модель с замкнутой на обе.

  • Для свободнопотокового программирования (запрет записи) используйте соответствующие правила.

См. также

Основные понятия

Дополнительные способы использования поставщика