TN053: Пользовательские процедуры DFX для классов DAO базы данных

ПримечаниеПримечание

Что касается Visual C++ .NET, то среда и мастера Visual C++ больше не поддерживают DAO (хотя классы DAO включены и вы по-прежнему можете их использовать).Майкрософт рекомендует использовать шаблоны OLE DB или ODBC и MFC для новых проектов.DAO необходимо использовать только для поддержки существующих приложений.

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

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

  • Общие сведения о DFX

  • примеры, используя динамическую привязку и обмен полей записей DAO

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

  • Что ваша программа выполняет пользовательскую DFX

  • Сведения DFX_Text

Общие сведения о DFX

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

ПримечаниеПримечание

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

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

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

// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();

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

(предполагается использование класса CDaoRecordset, rs, и он уже открыт)

// Add a new record to the customers table
COleVariant  varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
COleVariant  varFieldValue2  (_T("Microsoft"), VT_BSTRT );
rs.AddNew();
rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs.Update();

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

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

// Get the employee's data so that it can be displayed
emp.MoveNext();

// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
   emp.GetFieldValue(_T("photo"), varPhoto);

// Display the data
PopUpEmployeeData(emp.m_strFirstName,
    emp.m_strLastName, varPhoto);

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

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

  • DFX создает предложение предложения выбрать SQL и ПАРАМЕТРЫ SQL, если это необходимо.

  • DFX создает структуру привязки, используемые функцией GetRows DAO (больше об этом более поздней версии).

  • DFX управляет буфер данных, используемый для определения измененные поля (если используется), то двойной-буферность

  • DFX управляет массивы состояния NULL и DIRTY и значения наборов, если это необходимо для обновлений.

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

Операция

Описание

AddToParameterList

Предложение, определяющее параметры построения

AddToSelectList

Построение выберите пункт предложение

BindField

Создайте структуры привязки

BindParam

Устанавливает значения параметров

Адресная привязка

Наборы АННУЛИРУЮТ состояние

AllocCache

Выбирает кэш для пакостного проверки

StoreField

Сохраняет текущую запись в кэш

LoadField

Извлекает кэш к значениям элемента

FreeCache

Кэш свободенов

SetFieldNull

Устанавливает состояние & значение поля значение NULL

MarkForAddNew

Помечает поля измененные если ПСЕВДО NULL

MarkForEdit

Помечает поля измененные если кэш не совпадают

SetDirtyField

Задает значения поля помечена как " грязный "

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

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

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

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

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

  • DAO также «выполняет обратный вызов» в вызывающей стороны для столбцов переменной длины, чтобы разрешить вызывающему объекту для выделения памяти.Эта вторая функция имеет преимущества свернуть количество копий данных, а также разрешения непосредственно хранилище данных в элементы класса (производного класса CDaoRecordset ).Этот второй механизм метод MFC использует для привязки к элементам данных в производных классах CDaoRecordset.

Что ваша программа выполняет пользовательскую DFX

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

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

Сведения DFX_Text

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

  • AddToParameterList
    Эта операция создает предложение ПАРАМЕТРЫ SQL ("Parameters <param name>, <param type> ... ;") двигателем.Каждый параметр имеет имя и типизируется (как указано в вызове RFX).См. описание функции CDaoFieldExchange::AppendParamType функции, чтобы просмотреть имена отдельных типов.в случае DFX_Text, используемый тип text.

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

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

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

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

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

  • SetDirtyField
    Вызывает SetFieldValue для каждого пакостного помечен этим полем.

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

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

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

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

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

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

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

СоветСовет

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

См. также

Другие ресурсы

Технические замечания по номеру

Технические замечания по категориям