Partager via


Record Field Exchange : utilisation du code écrit par l'Assistant

Remarque

L’Assistant Consommateur ODBC MFC n’est pas disponible dans Visual Studio 2019 et ultérieur. Vous pouvez toujours créer un consommateur manuellement.

Cette rubrique explique le code que les Assistants Application MFC et Ajout de classe (comme décrit dans Ajout d’un consommateur ODBC MFC) écrivent pour prendre en charge RFX et comment vous pouvez modifier ce code.

Remarque

Cette rubrique s’applique aux classes dérivées de CRecordset où l’extraction de lignes en bloc n’a pas été implémentée. Si vous utilisez l’extraction de lignes en bloc, l’échange de champs d’enregistrements en bloc (Bulk RFX) est implémenté. Bulk RFX est similaire à RFX. Pour comprendre les différences, consultez Recordset : extraction d’enregistrements en bloc (ODBC).

Quand vous créez une classe recordset avec l’Assistant Application MFC ou Ajout de classe, l’Assistant écrit les éléments associés à RFX suivants pour vous, en fonction de la source de données, des tables et des colonnes que vous choisissez dans l’Assistant :

  • Déclarations des membres de données de champ de recordset dans la classe recordset

  • Un remplacement de CRecordset::DoFieldExchange

  • Initialisation des membres de données de champ de recordset dans le constructeur de la classe recordset

Déclarations de membre de données de champ

Les Assistants écrivent une déclaration de classe recordset dans un fichier .h qui ressemble à ce qui suit pour la classe 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

};

Si vous ajoutez des membres de données de paramètre ou de nouveaux membres de données de champ que vous liez vous-même, ajoutez-les après ceux générés par l’Assistant.

Remarquez également que l’Assistant substitue la fonction membre DoFieldExchange de la classe CRecordset.

Remplacement DoFieldExchange

DoFieldExchange est au cœur de RFX. Le framework appelle DoFieldExchange quand il a besoin de déplacer des données depuis la source de données vers le recordset ou inversement. De plus, DoFieldExchange prend en charge l’obtention d’informations sur les membres de données de champ par le biais des fonctions membres IsFieldDirty et IsFieldNull.

Le remplacement DoFieldExchange suivant concerne la classe CSections. L’Assistant écrit la fonction dans le fichier .cpp pour votre classe recordset.

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);
}

Notez les fonctionnalités clés suivantes de la fonction :

  • Cette section de la fonction est appelée mappage de champs.

  • Un appel à CFieldExchange::SetFieldType, jusqu’au pointeur pFX. Cet appel indique que tous les appels de fonction RFX jusqu’à la fin de DoFieldExchange ou l’appel suivant à SetFieldType sont des colonnes de sortie. Pour plus d’informations, consultez CFieldExchange::SetFieldType.

  • Plusieurs appels à la fonction globale RFX_Text, à raison d’un par membre de données de champ (qui sont tous des variables CString dans l’exemple). Ces appels spécifient la relation entre un nom de colonne sur la source de données et un membre de données de champ. Les fonctions RFX effectuent le transfert de données proprement dit. La bibliothèque de classes fournit des fonctions RFX pour tous les types de données courants. Pour plus d’informations sur les fonctions RFX, consultez Record Field Exchange : Using the RFX Functions.

    Remarque

    L’ordre des colonnes dans votre jeu de résultats doit correspondre à l’ordre des appels de fonction RFX dans DoFieldExchange.

  • Le pointeur pFX vers un objet CFieldExchange que le framework passe quand il appelle DoFieldExchange. L’objet CFieldExchange spécifie l’opération que doit effectuer DoFieldExchange, la direction de transfert et d’autres informations de contexte.

Constructeur recordset

Le constructeur de recordset écrit par l’Assistant contient deux éléments associés à RFX :

  • Une initialisation de chaque membre de données de champ

  • Une initialisation du membre de données m_nFields, qui contient le nombre de membres de données de champ

Le constructeur pour l’exemple de recordset CSections ressemble à ceci :

CSections::CSections(CDatabase* pdb)
   : CRecordset(pdb)
{
   m_strCourseID = "";
   m_strInstructorID = "";
   m_strRoomNo = "";
   m_strSchedule = "";
   m_strSectionNo = "";
   m_nFields = 5;
}

Remarque

Si vous ajoutez des membres de données de champ manuellement, comme vous le feriez pour lier de nouvelles colonnes dynamiquement, vous devez incrémenter m_nFields. Pour ce faire, ajoutez une autre ligne de code, par exemple :

m_nFields += 3;

Ce code permet d’ajouter trois nouveaux champs. Si vous ajoutez des membres de données de paramètre, vous devez initialiser le membre de données m_nParams, qui contient le nombre de membres de données de paramètre. Placez l’initialisation m_nParams en dehors des accolades.

Voir aussi

Record Field Exchange (RFX)