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


Обмен данными с полями записей: Принцип работы 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 последовательность выглядит следующим образом:

  1. Вызов функции addNew или Edit набора записей приводит к хранению текущего буфера редактирования, чтобы его можно было восстановить позже.

  2. AddNew или Edit подготавливает поля в буфере редактирования, чтобы RFX могли обнаруживать измененные элементы данных поля.

    Так как новая запись не имеет предыдущих значений для сравнения новых, AddNew задает для каждого элемента данных поля значение PSEUDO_NULL. Позже при вызове UpdateRFX сравнивает значение каждого члена данных со значением PSEUDO_NULL. Если имеется разница, то был установлен элемент данных. (PSEUDO_NULL не совпадает со столбцом записи с истинным значением NULL или не совпадает с значением NULL на языке C++.)

    Update В отличие от вызоваAddNew, Update вызов Edit для сравнения обновленных значений с ранее сохраненными значениями, а не с помощью PSEUDO_NULL. Разница заключается в том, что AddNew у него нет ранее сохраненных значений для сравнения.

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

  4. Вызов обновлений проверка для измененных элементов данных поля, как описано на шаге 2 (см. последовательность операций RFX во время прокрутки). Если ни один из них не изменился, Update возвращает значение 0. Если некоторые элементы данных поля изменились, подготавливает и выполняет инструкцию SQL INSERT, Update содержащую значения для всех обновленных полей в записи.

  5. Для 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