Обмен данными с полями записей: Принцип работы RFX
В этом разделе объясняется процесс RFX. Это расширенный раздел, охватывающий следующее:
Примечание.
Этот раздел относится к классам, производным от CRecordset
, в которых пакетное получение строк не реализовано. Если вы используете пакетное получение строк, реализуется пакетный обмен полями записей (Bulk RFX). Bulk RFX аналогичен RFX. Сведения о различиях см. в разделе Recordseting Recordseting Records in Bulk (ODBC).
RFX и набор записей
Элементы данных поля объекта записей, взятые вместе, представляют собой буфер редактирования, содержащий выбранные столбцы одной записи. При первом открытии набора записей и при чтении первой записи RFX привязывает (связывает) каждый выбранный столбец с адресом соответствующего элемента данных поля. Когда набор записей обновляет запись, RFX вызывает функции API ODBC для отправки инструкции SQL UPDATE или INSERT драйверу. RFX использует свои знания о элементах данных поля, чтобы указать столбцы для записи.
Платформа выполняет резервное копирование буфера редактирования на определенных этапах, чтобы при необходимости восстановить его содержимое. RFX резервное копирование буфера редактирования перед добавлением новой записи и перед редактированием существующей записи. Он восстанавливает буфер редактирования в некоторых случаях, например после Update
вызова ниже AddNew
. Буфер редактирования не восстанавливается, если вы отменяете только что измененный буфер редактирования, например, переход на другую запись перед вызовом Update
.
Помимо обмена данными между источником данных и элементами данных поля набора записей, RFX управляет параметрами привязки. При открытии набора записей все члены данных параметров привязаны в порядке заполнителей в инструкции SQL, CRecordset::Open
которая создает. Дополнительные сведения см. в разделе Recordset: параметризация набора записей (ODBC).
Переопределение DoFieldExchange
класса recordset выполняет всю работу, перемещая данные в обоих направлениях. Как и обмен данными диалоговых окон (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. Исправление данных для C++. |
Наборы записей используют подготовленное выполнение ODBC, чтобы обеспечить быстрое повторение с той же инструкцией SQL. Дополнительные сведения о подготовленном выполнении см. в справочнике программиста ODBC.
RFX: прокрутка
При прокрутке одной записи в другую платформу вызывается DoFieldExchange
замена значений, ранее хранящихся в элементах данных поля значениями новой записи.
В следующей таблице показана последовательность операций RFX при переходе пользователя из записи в запись.
Последовательность операций RFX во время прокрутки
Операция | Операция DoFieldExchange | Операция базы данных и SQL |
---|---|---|
1. Вызов MoveNext или одна из других функций перемещения. |
||
2. ODBC выполняет перемещение и заполняет данные. | ||
3. Исправление данных для C++. |
RFX: добавление новых записей и редактирование существующих записей
При добавлении новой записи набор записей работает в качестве буфера редактирования для создания содержимого новой записи. Как и при добавлении записей, изменения записей включают изменение значений элементов данных поля набора записей. С точки зрения RFX последовательность выглядит следующим образом:
Вызов функции addNew или Edit набора записей приводит к хранению текущего буфера редактирования, чтобы его можно было восстановить позже.
AddNew
илиEdit
подготавливает поля в буфере редактирования, чтобы RFX могли обнаруживать измененные элементы данных поля.Так как новая запись не имеет предыдущих значений для сравнения новых,
AddNew
задает для каждого элемента данных поля значение PSEUDO_NULL. Позже при вызовеUpdate
RFX сравнивает значение каждого члена данных со значением PSEUDO_NULL. Если имеется разница, то был установлен элемент данных. (PSEUDO_NULL не совпадает со столбцом записи с истинным значением NULL или не совпадает с значением NULL на языке C++.)Update
В отличие от вызоваAddNew
,Update
вызовEdit
для сравнения обновленных значений с ранее сохраненными значениями, а не с помощью PSEUDO_NULL. Разница заключается в том, чтоAddNew
у него нет ранее сохраненных значений для сравнения.Вы напрямую задаете значения элементов данных поля, значения которых необходимо изменить или которые нужно заполнить для новой записи. Это может включать вызовы
SetFieldNull
.Вызов обновления проверяет наличие измененных элементов данных поля, как описано на шаге 2 (см. таблицу последовательности операций RFX во время прокрутки). Если ни один из них не изменился,
Update
возвращает значение 0. Если некоторые элементы данных поля изменились, подготавливает и выполняет инструкцию SQL INSERT,Update
содержащую значения для всех обновленных полей в записи.Для
AddNew
этогоUpdate
выполняется восстановление ранее сохраненных значений записи, которая была текущей перед вызовомAddNew
. ДляEdit
новых измененных значений остаются на месте.
В следующей таблице показана последовательность операций RFX при добавлении новой записи или изменении существующей записи.
Последовательность операций RFX во время добавления и редактирования
Операция | Операция DoFieldExchange | Операция базы данных и SQL |
---|---|---|
1. Вызов AddNew или Edit . |
||
2. Резервное копирование буфера редактирования. | ||
3. Для AddNew поля помечайте элементы данных поля как "чистые" и null. |
||
4. Назначение значений элементам данных поля записей. | ||
5. Вызов Update . |
||
6. Проверьте наличие измененных полей. | ||
7. Создание инструкции SQL INSERT для AddNew или инструкции UPDATE для Edit . |
||
8. Отправка SQL. | ||
9. Для AddNew восстановления буфера редактирования до его содержимого резервного копирования. Для Edit этого удалите резервную копию. |
RFX: удаление существующих записей
При удалении записи RFX устанавливает для всех полей значение NULL в качестве напоминания о том, что запись удаляется, и ее необходимо удалить. Вам не нужны другие сведения о последовательности RFX.
См. также
Обмен данными полей записей (RFX)
Потребление MFC ODBC
Макросы, глобальные функции и глобальные переменные
Класс CFieldExchange
CRecordset::D oFieldExchange