Обмен данными с полями записей (RFX). Работа с кодом мастера
Примечание.
Мастер потребителя MFC ODBC недоступен в Visual Studio 2019 и более поздних версиях. При этом вы по-прежнему можете создать потребитель вручную.
В этом разделе объясняется код, который мастер приложений MFC и мастер Добавления класса (как описано в разделе Добавление объекта-получателя ODBC MFC) пишет для поддержки RFX, и то, как можно изменить этот код.
Примечание.
Этот раздел относится к классам, производным от CRecordset
, в которых пакетное получение строк не реализовано. Если вы используете пакетное получение строк, реализуется пакетный обмен полями записей (Bulk RFX). Bulk RFX аналогичен RFX. Сведения о различиях см. в разделе Recordseting Recordseting Records in Bulk (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
. Мастер создает функцию в CPP-файле для класса набора записей.
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
за скобки.