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 для стандартных типов данных. |