Обмен данными с полями записей: Принцип работы RFX
В этом разделе объясняется процесс RFX. Это подробное объяснение темы:
RFX и набор записей
Процесс RFX
Примечание
В этом разделе описываются классы, производные от CRecordset, в которых не была реализована групповая выборка строк.При использовании групповой выборки строк реализуется групповой обмен данными с полями записей (групповой RFX).Групповой RFX и обычный RFX похожи.Описание различий см. в разделе Набор записей: групповая выборка записей ODBC.
RFX и набор записей
Элементы данных поля объекта набора записей, взятые вместе, составляют буфер редактирования, который содержит выбранные столбцы одной записи. Когда впервые открывается набор записей и происходит считывание первой записи, RFX связывает (ассоциирует) каждый столбец выборки с адресом соответствующего элемента данных поля. Если в наборе обновляется запись, RFX вызывает функции ODBC API для отправки инструкции SQL UPDATE или INSERT драйверу. RFX использует имеющуюся информацию элементов поля данных, чтобы указать столбцы для записи.
Платформа производит резервное копирование буфера редактирования на определенных этапах, чтобы при необходимости можно было восстановить его содержимое. RFX производит резервное копирование буфера редактирования перед добавлением новой записи и редактированием существующей записи. В некоторых случаях буфер редактирования восстанавливается, например, после вызова метода Update сразу после метода AddNew. Буфер редактирования не восстанавливается, если новое изменение буфера редактирования отменяется, например, при переходе к другой записи до вызова метода Update.
Помимо обмена данными между источником данных и элементами данных полей RFX управляет параметрами связывания. Когда открывается набор записей, любой элемент данных параметра связывается в порядке местозаместителей "?" в инструкции SQL, построение которой выполняет CRecordset::Open. Дополнительные сведения см. в разделе Набор записей. Параметризация набора записей (ODBC).
Переопределенная в пользовательском классе набора записей функция DoFieldExchange выполняет всю работу, перемещая данные в обоих направлениях. Подобно DDX, для RFX требуется информация об элементах данных класса. Мастер предоставляет необходимую информацию путем написания реализации для конкретного набора записей функции DoFieldExchange на основе имен элементов полей с данными и типов данных, которые были заданы мастером.
Процесс обмена данными с полями записей
В данном подразделе описана последовательность событий RFX, таких как открытие объекта набора записей, добавление, обновление, удаление записей. В таблице Последовательность операций RFX во время открытия набора записей и таблице Последовательность операций RFX во время прокрутки в этом разделе показано, как RFX выполняет команду Move в наборе записей, и как RFX управляет обновлением. В ходе этих процессов функция DoFieldExchange вызывается для выполнения различных операций. Элемент данных m_nOperation объекта CFieldExchange определяет запрашиваемые операции. Полезно прочитать разделы Набор записей. Выбор записей в наборе записей ODBC и Набор записей. Обновление записей в наборе записей ODBC до изучения данного материала.
RFX. Первоначальная привязка столбцов и параметров
При вызове функции-члена Open объекта набора записей, RFX выполняет следующие действия в указанном порядке:
Если в наборе записей имеются параметры элементов данных, платформа вызывает функцию DoFieldExchange, чтобы связать параметры с местозаполнителями параметров в строке инструкций SQL набора записей. Представление зависимого от типа данных значения параметра используется для каждого местозаполнителя в инструкции SELECT. Это происходит после того, как инструкция SQL подготовлена, но еще не выполнена. Дополнительные сведения о подготовке инструкции см. в описании функции ::SQLPrepare в Справочнике программиста ODBC.
Платформа вызывает функцию DoFieldExchange второй раз для связывания значений выбранных столбцов с соответствующими элементами данных полей в наборе записей. Объект набора записей устанавливается в качестве буфера редактирования, содержащего столбцы первой записи.
Набор записей выполняет инструкцию SQL, а источник данных выбирает первую запись. Столбцы записи загружаются в элементы данных полей набора записей.
В следующей таблице показана последовательность операций RFX при открытии набора записей.
Последовательность операций RFX при открытии набора записей
Пользовательская операция |
Операция DoFieldExchange |
Операция базы данных/SQL |
---|---|---|
1. Открытие набора записей. |
|
|
|
2. Построение инструкции SQL. |
|
|
|
3. Отправка SQL. |
|
4. Связывание элементов данных параметров. |
|
|
5. Связывание элементов данных полей со столбцами. |
|
|
|
6. ODBC выполняет перемещение и заполнение данных. |
|
7. Привязка данных для С++. |
|
Наборы записей используют подготовленное исполнение ODBC, что позволяет быстро повторить инструкцию SQL, если она не изменилась. Дополнительные сведения о подготовленном исполнении см. в описании ODBC SDK в Справочнике программиста библиотеки MSDN.
RFC. Перемещение по набору записей
Во время перехода от одной записи к другой платформа вызывает функцию DoFieldExchange для замены значений, предварительно сохраненных в элементе данных поля, значениями новой записи.
В следующей таблице показана последовательность операций RFX, когда пользователь перемещается от одной записи к другой.
Последовательность операций RFC во время перемещения
Пользовательская операция |
Операция DoFieldExchange |
Операция базы данных/SQL |
---|---|---|
1. Вызов MoveNext или одной из других функций Move. |
|
|
|
|
2. ODBC выполняет перемещение и заполнение данных. |
|
3. Привязка данных для С++. |
|
RFX. Добавление новой записи и редактирование существующих записей
При добавлении новой записи набор записей выполняет действия буфера редактирования для построения содержимого новой записи. Так же как и при добавлении записей, при редактировании записей задействуется изменение значений элементов данных полей в наборе записей. Со стороны RFX порядок действий выглядит следующим образом:
В набор записей производится вызов функции элементов AddNew или Edit, благодаря которой RFX сохраняет текущий буфер редактирования, чтобы его можно было потом восстановить.
Метод AddNew или Edit подготавливает поля в буфере редактирования, чтобы RFX мог обнаружить элементы измененных данных полей.
Так как новая запись не имеет предыдущих значений, с которыми ее можно было бы сравнить, метод AddNew задает значение каждому элементу данных поля значение PSEUDO_NULL. Затем при вызове функции Update RFX сравнивает значение каждого элемента данных со значением PSEUDO_NULL. Если они отличаются, задается элемент данных. (значение PSEUDO_NULL не равно значению NULL в столбце записи, и не совпадает со значением в C++ NULL).
В отличие от вызова функции Update для метода AddNew, функция Update вызывает метод Edit для сравнения обновленных значений с ранее сохраненными, и не использует значение PSEUDO_NULL. Разница заключается в том, что метод AddNew не имеет ранее сохраненных значений для сравнения.
Напрямую задаются значения элементов данных полей, значения которых необходимо редактировать или заполнить новой записью. Это может включать вызов метода SetFieldNull.
При вызове Update проверяются элементы измененных данных полей, как описано в шаге 2 (см. таблицу Порядок операций RFX во время перемещения). Если ничего не изменилось, Update возвращает 0. Если элементы данных полей изменились, функция Update готовит и выполняет инструкцию SQL INSERT, которая содержит значения для всех обновленных полей в записи.
Для метода AddNew функция Update подводит итоги, восстанавливая ранее сохраненные значения записи, которая была текущей до вызова метода AddNew. Для Edit новые, отредактированные значения остаются на месте.
В следующей таблице показан порядок операций RFX при добавлении новой записи или редактировании существующей записи.
Порядок операций RFX во время выполнения AddNew и Edit
Пользовательская операция |
Операция DoFieldExchange |
Операция базы данных/SQL |
---|---|---|
1. Вызов метода AddNew или Edit. |
|
|
|
2. Создание резервной копии буфера редактирования. |
|
|
3. Для метода AddNew элементы данных полей обозначаются как "clean" и NULL. |
|
4. Назначение значений элементам данных полей. |
|
|
5. Вызов функции Update. |
|
|
|
6. Проверка измененных полей. |
|
|
7. Построение инструкции SQL INSERT для метода AddNew или инструкции UPDATE для метода Edit. |
|
|
|
8. Отправка SQL. |
|
9. Для метода AddNew восстанавливается созданная резервная копия буфера редактирования. Для метода Edit удаляется резервная копия. |
|
RFX. Удаление существующих записей
При удалении записи RFX задает всем полям значение NULL в качестве напоминания о том, что запись удалена и необходимо выполнить перемещение. Никакой другой информации о порядке операций RFX не требуется.
См. также
Задачи
Добавление потребителя ODBC MFC
Ссылки
Макросы, глобальные функции и глобальные переменные