Обмен данными с полями записей (RFX). Работа с кодом мастера
В этом разделе объясняется написание кода для RFX с помощью мастера приложения MFC и Добавление класса (как описано в разделе Добавление объекта-получателя MFC ODBC), а также его изменение.
Примечание
В этом разделе описываются классы, производные от CRecordset, в которых не была реализована групповая выборка строк.При использовании групповой выборки строк реализуется групповой обмен данными с полями записей (групповой RFX).Групповой RFX и обычный RFX похожи.Описание различий см. в разделе Набор записей: групповая выборка записей ODBC.
При создании класса набора записей с помощью мастера приложений MFC или возможности Добавление класса, мастер создает следующие элементы RFX на основе источника данных, таблицы и выбора столбцов, отмеченных в мастере:
Объявления элементов полей с данными набора записей в классе набора записей
Переопределение CRecordset::DoFieldExchange
Инициализация элементов полей с данными набора записей в конструкторе класса набора записей
Объявления элементов полей с данными
Мастер прописывает объявления класса набора записей в H-файле, который похож на класс CSections, следующим образом:
class CSections : public CRecordset
{
public:
CSections(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSections)
// Field/Param Data
CString m_strCourseID;
CString m_strInstructorID;
CString m_strRoomNo;
CString m_strSchedule;
CString m_strSectionNo;
// Overrides
// Wizard generated virtual function overrides
protected:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
При добавлении элементов данных параметров или создании элементов полей с данными их следует добавить после сформированных мастером.
Также следует обратить внимание на то, что мастер переопределяет функцию-член DoFieldExchange класса CRecordset.
Переопределение DoFieldExchange
DoFieldExchange является основой RFX. Платформа вызывает DoFieldExchange каждый раз, когда требуется переместить данные либо из источника данных в набор записей, либо из набора записей в источник данных. DoFieldExchange также поддерживает получение информации об элементах данных полей с помощью функций-членов IsFieldDirty и IsFieldNull.
Ниже приводится переопределение DoFieldExchange для класса CSections. Мастер записывает функцию в .СРР-файл для класса набора записей.
void CSections::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Text(pFX, "RoomNo", m_strRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Text(pFX, "SectionNo", m_strSectionNo);
}
Обратите внимание на следующие ключевые возможности функции:
Эта секция функции называется сопоставлением поля.
Вызов CFieldExchange::SetFieldType с помощью указателя pFX. Этот вызов указывает, что все вызовы функций RFX до конца DoFieldExchange либо следующий вызов SetFieldType являются столбцами вывода. Дополнительные сведения см. в описании CFieldExchange::SetFieldType.
Несколько вызовов глобальной функции RFX_Text — по одному на каждый элемент поля данных (все они являются переменными типа CString в данном примере). Эти вызовы определяют связь между именем столбца в источнике данных и элементом поля данных. Функции RFX выполняют реальное перемещение данных. Библиотека классов предоставляет функции RFX для всех распространенных типов данных. Дополнительные сведения о функциях RFX см. в разделе Обмен данными с полями записей. Использование функций RFX.
Примечание
Порядок столбцов полученного результата должен соответствовать порядку вызовов функции RFX в DoFieldExchange.
Указатель pFX на объект CFieldExchange, который передается платформой, когда она вызывает DoFieldExchange. Объект CFieldExchange указывает операцию, которую необходимо DoFieldExchange выполнить, направление перемещения и другую контекстную информацию.
Конструктор набора записей
Написанный мастером конструктор набора записей содержит две вещи, относящиеся к RFX:
Инициализацию для каждого элемента поля данных
Инициализацию для элемента данных m_nFields, который содержит число элементов поля данных
Конструктор для примера набора записей CSections представлен таким образом:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Примечание
Если элементы поля данных добавляются вручную, например, чтобы выполнить динамическую привязку столбца, необходимо увеличить m_nFields.Это можно сделать добавлением строки кода, такого как:
m_nFields += 3;
Этот код добавляет три новых поля. При добавлении элементов данных параметров, следует инициализировать элемент данных m_nParams, который содержит количество элементов данных параметров. Вынесите настройку m_nParams за скобки.