TN053: Custom DFX подпрограммы для базы данных классов DAO

Это техническое примечание описывает механизм обмена (DFX) полями записей DAO. Чтобы помочь понять, что происходит в DFX подпрограмм, функция DFX_Text будет объяснено в деталях как пример. Как дополнительный источник информации для этой технической записке можете просто изучить код для другого отдельных функций DFX.Вам скорее всего не потребуется пользовательскую процедуру DFX так часто, как вам может потребоваться RFX настраиваемой (используется с классами базы данных ODBC).

Эта техническая записка содержит:

DFX обзор

Механизм обмена полей записей DAO (DFX) используется для упрощения процедуры извлечения и обновления данных при использовании класса CDaoRecordset . Основании данных членов класса CDaoRecordset упрощает этот процесс. Производным от CDaoRecordset, можно добавить члены данных в производный класс, представляющий каждое поле в таблице или запросе. Этот механизм «статическое связывание» прост, но она не может быть метод выборки/обновление данных выбора для всех приложений. DFX извлекает все связанное поле каждый раз, когда изменяется текущая запись. Если вы разрабатываете чувствительных к производительности приложения, которое не требует извлечения каждого поля при изменении валюты, «динамической привязки» через CDaoRecordset::GetFieldValue и CDaoRecordset::SetFieldValue могут быть предпочтительным методом доступа к данным.

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

Пример 1 - использование обмена полей записей DAO только

(предполагает CDaoRecordset - производный класс CMySet уже открыт)

/ / Добавить новую запись в таблицу «Клиенты»
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update()

Пример 2 - использование динамического связывания только

(берет на себя с помощью класса CDaoRecordset , rs , и он уже открыт)

/ / Добавить новую запись в таблицу «Клиенты»
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / Примечание: VT_BSTRT флаги строкового типа, как A&NSI, вместо того, чтобы по умолчанию UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
LSPAddNew();
LSPSetFieldValue(_T("Customer_ID"), varFieldValue1);
LSPSetFieldValue(_T("Customer_Name"), varFieldValue2);
LSPUpdate()

Пример 3 - использование обмена полей записей DAO и динамического связывания

(предполагается просматривать данные сотрудников с CDaoRecordset-производного класса emp )

/ / Получить данные сотрудников таким образом, чтобы оно может отображаться
EMP.MoveNext();

/ / Если пользователь хочет увидеть его фотография,
/ / получить его
COleVariant varPhoto;
Если (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto);

/ / Отображения данных
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, varPhoto)

Как работает DFX

DFX механизм работает аналогичным образом механизм обмена (RFX) полями записей, используются классы MFC ODBC. Принципов RFX и DFX являются такими же, но существует множество внутренних различий. Дизайн DFX функций было таковым, что практически весь код является общим отдельных подпрограмм DFX. На самом высоком уровне DFX только делает кое-что.

В основе DFX механизм является функция DoFieldExchange CDaoRecordset производного класса. Эта функция отправляет вызовы отдельных функций DFX типа соответствующей операции. До вызова функции DoFieldExchange внутренней MFC функции установите тип операции. В следующем списке приведены различные типы операции и краткое описание.

Операция Описание
AddToParameterList Строит параметры положения
AddToSelectList Предложение SELECT строит
BindField Устанавливает привязку структуры
BindParam Устанавливает значения параметров
Исправление Устанавливает состояние NULL
AllocCache Выделяет кэш для грязной проверки
StoreField Сохраняет текущую запись в кэш
LoadField Восстанавливает кэш значений членов
FreeCache Освобождает кэш
Метод SetFieldNull Задает поле статус & значение NULL
MarkForAddNew Знаки поля грязный, если не ПСЕВДО NULL
MarkForEdit Знаки поля грязный если не соответствуют кэш
SetDirtyField Задает поле значения, помеченных как грязные

В следующем разделе каждая операция будет объяснено более подробно для DFX_Text.

Наиболее важной особенностью понять о процессе обмена полей записей DAO является, что она использует функцию GetRows объекта ICDaoRecordset . Дао GetRows функция может работать несколькими способами. Эта техническая записка лишь кратко опишем GetRows как это вне сферы охвата настоящей технической записки.

Дао GetRows можно работать несколькими способами.

Что делает ваш режим Custom DFX

Это очевидно из этого обсуждения наиболее важные операции в любой DFX функции должна быть возможность создания требуемых данных структур для успешного вызова GetRows. Существует ряд других операций, которые также должна поддерживать функцию DFX, но ни как важные или сложные, как правильно подготовиться GetRows вызывать.

Использование DFX описано в электронной документации. По сути есть 2 требования. Во-первых члены должны добавляться CDaoRecordset производного класса для каждого связанного поля и параметра. После этого CDaoRecordset::DoFieldExchange должен быть переопределен. Обратите внимание, что тип данных члена имеет важное значение. Она должна соответствовать данных из поля в базе данных или по крайней мере быть конвертируемой к этому типу. Например числовое поле в базе данных, такие как длинное целое число, всегда можно преобразовать в текст и привязан к элементу CString , но текстовое поле в базе данных не обязательно может быть преобразован в числовое представление, такие как длинное целое и привязан к члену длинное целое. Дао и Microsoft Jet database engine отвечают за преобразование (а не MFC).

Подробная информация о DFX_Text

Как упоминалось ранее, вероятно объяснить, как работает DFX лучше просто работать через пример. Для этой цели через внутреннее DFX_Text должен работать достаточно хорошо для обеспечения по крайней мере общее представление о DFX.

AddToParameterList

Эта операция строит предложении Параметры SQL (" Parameters lt;param name>, <param type> ... ; ") требует Jet. Каждый параметр с именем и типом (как указано в вызове RFX). Смотрите функции функцию CDaoFieldExchange::AppendParamType чтобы увидеть имена отдельных типов. В случае DFX_Text, является тип, используемыйtext.

AddToSelectList

Строит SQL выберите положение. Это довольно прямо вперед, как имя столбца DFX вызовом является просто добавляется (" SELECT lt;column name>, ... ").

BindField

-Наиболее сложных операций. Как упоминалось ранее, это то, где создана структура связывания DAO, используемые GetRows . Как вы можете видеть из кода в DFX_Text информации в структуре такие DAO используемый (DAO_CHAR или DAO_WCHAR по DFX_Text). Кроме того тип привязки используется также установить. В предыдущем разделе GetRows был описан лишь ненадолго, но достаточно объяснить, что тип привязки, используемый MFC, всегда прямой адрес привязки (DAOBINDING_DIRECT). В дополнение к этому для привязки столбцов переменной длины (например, DFX_Text) привязка обратного вызова используется таким образом, чтобы MFC можно контролировать распределение памяти и адрес правильной длины. Это означает, что MFC можно всегда говорят DAO «где» поместить данные, таким образом позволяя привязку непосредственно к переменных-членов. Остальные структуры привязки заполняется в с вещами как адрес функции обратного вызова выделения памяти и тип столбцов связывания (связывание по имени столбца).

BindParam

Это простая операция, которая требует SetParamValue с значением параметра, указанного в параметр члена.

Исправление

Заполняет NULL статуса для каждого поля.

Метод SetFieldNull

Эта операция только помечает каждое поле статус как NULL и устанавливает значение переменной члена PSEUDO_NULL.

SetDirtyField

SetFieldValue звонков для каждого поля помечены как изменившиеся.

Все остальные операции работать только с использованием кэша данных. Кэш данных — дополнительный буфер данных в текущую запись, которая используется для сделать некоторые вещи проще. К примеру «грязный» полей могут быть автоматически обнаружены. Как описано в документации в Интернете можно отключить, полностью или на местном уровне. Осуществление буфера использует карты. Эта карта используется для сопоставления динамически выделяемые копии данных с адресом «связанного» поля (или CDaoRecordset члена данных derieved).

AllocCache

Динамически распределяет значения кэшированного поля и добавляет его к карте.

FreeCache

Удаление кэшированных поля значения и удаляет его из карты.

StoreField

Копирует текущее значение поля в кэш данных.

LoadField

Кэшированное значение копируется в поле-член.

MarkForAddNew

Проверяет, является ли текущее значение поля не-NULL и знаки, грязные при необходимости.

MarkForEdit

Сравнивает текущее значение поля с кэшем данных и помечает грязные при необходимости.

Подсказка   Модель пользовательских процедур DFX на существующих процедур DFX для стандартных типов данных.

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index