Обмен данными с полями записей (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 за скобки.

См. также

Обмен данными полей записей (RFX)