Динамический набор

Обновлен: Ноябрь 2007

В этом разделе описываются динамические подмножества данных и их доступность.

ka47a5az.alert_note(ru-ru,VS.90).gifПримечание.

Данный раздел применим к классам MFC ODBC, включая класс CRecordset. Дополнительные сведения о динамических подмножествах данных в классах DAO см. в разделе CDaoRecordset. С помощью DAO можно открывать наборы записей с типом динамического подмножества.

Динамическое подмножество данных — это набор записей с динамическими свойствами. В течение всего времени существования объект набора записей в режиме динамического подмножества (обычно называемый динамическим подмножеством данных) остается синхронизированным с источником данных следующим образом. В многопользовательской среде другие пользователи могут редактировать или удалять записи, которые находятся в вашем динамическом подмножестве, либо добавлять записи в таблицу, которую представляет ваше динамическое подмножество. Записи, которые ваше приложение добавляет или удаляет из набора записей, отражаются в вашем динамическом подмножестве. Записи, которые другие пользователи добавляют к таблице, не будут отражены в вашем динамическом подмножестве до тех пор, пока вы вновь не построите динамическое подмножество путем вызова функции-члена Requery. Когда другие пользователи удаляют записи, код MFC пропускает эти удаления в вашем наборе строк. Изменения существующих записей, внесенные другими пользователями, отражаются в вашем динамическом подмножестве только тогда, когда вы переходите к этим записям.

Аналогично, вносимые вами изменения в записях динамического подмножества отражаются в динамических подмножествах, используемых другими пользователями. Записи, которые вы добавляете, не будут отражены в динамических подмножествах других пользователей до тех пор, пока они не выполнят повторный запрос своего динамического подмножества. Удаляемые вами записи помечаются как "удаленные" в наборах записей других пользователей. При наличии нескольких подключений к одной базе данных (нескольких объектов CDatabase) наборы записей, связанные с этими подключениями, имеют то же состояние, что и наборы записей других пользователей.

Динамические подмножества наиболее полезны, когда данные должны быть динамическими, как, к примеру, в системе бронирования авиабилетов.

ka47a5az.alert_note(ru-ru,VS.90).gifПримечание.

Чтобы использовать динамические подмножества, для источника данных требуется драйвер ODBC, который поддерживает динамические подмножества, при этом не должна быть загружена библиотека курсоров ODBC. Дополнительные сведения см. в подразделе Доступность динамических подмножеств данных.

Чтобы указать, что набор строк является динамическим подмножеством, передайте функции-члену Open объекта набора записей в качестве первого параметра значение CRecordset::dynaset.

ka47a5az.alert_note(ru-ru,VS.90).gifПримечание.

Для обновляемых динамических подмножеств драйвер ODBC должен поддерживать либо операторы позиционного обновления, либо функцию интерфейса API ODBC ::SQLSetPos. Если драйвер поддерживает обе функции, MFC использует ::SQLSetPos для повышения эффективности работы.

Доступность динамических подмножеств данных

Классы MFC для работы с базами данных поддерживают динамические подмножества, если выполняются следующие условия:

  • Библиотека DLL курсоров ODBC не должна использоваться для этого источника данных.

    Если библиотека курсоров все же используется, то она скрывает некоторую функциональность базового драйвера ODBC, необходимую для поддержки динамических подмножеств данных. Если требуется использовать динамические подмножества данных (и драйвер ODBC имеет функциональность, необходимую для поддержки динамических подмножеств, как описывается ниже в этом разделе), можно заставить MFC не загружать библиотеку курсоров при создании объекта CDatabase. Дополнительные сведения см. в разделе ODBC, а также в разделах OpenEx и Open (это функции-члены класса CDatabase).

    Динамические подмножества и моментальные снимки, согласно терминологии ODBC, относятся к курсорам. Курсор — это механизм, который используется для отслеживания позиции в наборе записей. Дополнительные сведения о курсорах см. в Справочнике программиста ODBC.

  • Драйвер ODBC для источника данных должен поддерживать курсоры, управляемые набором ключей.

    Курсоры, управляемые набором ключей, работают с данными в таблице путем получения и сохранения набора ключей. Ключи используются для получения текущих данных из таблицы, когда пользователь перемещается к определенной записи. Чтобы определить, обеспечивает ли драйвер такую поддержку, вызовите функцию интерфейса API ODBC ::SQLGetInfo с параметром SQL_SCROLL_OPTIONS.

    При попытке открыть динамическое подмножество без поддержки драйвером набора ключей возникнет исключение CDBException с кодом возврата AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED.

  • Драйвер ODBC для источника данных должен поддерживать расширенную выборку.

    Расширенная выборка — это возможность перемещаться как назад, так и вперед по результирующим записям SQL-запроса. Чтобы определить, обеспечивает ли драйвер такую поддержку, вызовите функцию интерфейса API ODBC ::SQLGetFunctions с параметром SQL_API_SQLEXTENDEDFETCH.

Если требуется использовать обновляемые динамические подмножества (или моментальные снимки), драйвер ODBC должен также поддерживать функцию интерфейса API ODBC ::SQLSetPos или позиционное обновление. Функция ::SQLSetPos позволяет MFC обновить источник данных без отправки SQL-инструкций. Если эта функция поддерживается, MFC предпочитает использовать ее для внесения изменений, использующих SQL. Чтобы определить, поддерживает ли драйвер функцию ::SQLSetPos, вызовите функцию ::SQLGetInfo с параметром SQL_POS_OPERATIONS.

Позиционные обновления используют синтаксис SQL (в форме WHERE CURRENT OF "имя курсора") для указания конкретной строки в таблице источника данных. Чтобы определить, поддерживает ли драйвер позиционное обновление, вызовите функцию ::SQLGetInfo с параметром SQL_POSITIONED_STATEMENTS.

В целом, динамические подмножества MFC (но не наборы записей последовательного доступа) требуют, чтобы драйвер ODBC соответствовал уровню 2 интерфейса API ODBC. Если драйвер для источника данных соответствует набору функций уровня 1 интерфейса API ODBC, по-прежнему можно использовать обновляемые и доступные только для чтения моментальные снимки, а также наборы записей последовательного доступа, но не динамические подмножества. Тем не менее, драйвер уровня 1 может поддерживать динамические подмножества, если он поддерживает расширенную выборку и курсоры, управляемые набором ключей. Дополнительные сведения об уровнях соответствия интерфейсу API ODBC см. в разделе ODBC.

ka47a5az.alert_note(ru-ru,VS.90).gifПримечание.

Если требуется использовать и моментальные снимки, и динамические подмножества, необходимо основывать их на двух разных объектах CDatabase (двух отдельных подключениях).

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

Список драйверов ODBC, поставляемых с данной версией Visual C++, а также сведения о приобретении дополнительных драйверов см. в разделе Список драйверов ODBC.

См. также

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

Интерфейс ODBC (ODBC)