Record Field Exchange : utilisation du code écrit par l'Assistant
La présente rubrique explique le code que l'Assistant Création d'applications MFC et Add Class (comme indiqué dans Ajout d'un consommateur ODBC MFC) écrivent pour prendre en charge RFX, ainsi que la façon dont vous pouvez, le cas échéant, modifier ce code.
[!REMARQUE]
Cette rubrique s'applique aux classes dérivées de CRecordset dans lesquels l'extraction de lignes en bloc n'a pas été implémentée.Si vous utilisez l'extraction de lignes en bloc, le mécanisme RFX en bloc (Bulk RFX) est implémenté.RFX en bloc est similaire à RFX.Pour plus d'informations sur les différences, consultez Recordset : extraction globale d'enregistrements (ODBC).
Lorsque vous créez une classe du recordset à l'aide de l'Assistant Création d'applications MFC ou de Add Class, l'Assistant écrit automatiquement les éléments ci-après associés à RFX, en fonction des colonnes, tables et sources de données que vous avez choisies dans l'Assistant :
les déclarations des données membres de type champ de recordset dans la classe de recordset ;
la substitution de CRecordset::DoFieldExchange ;
Initialisation des données membres de champ de recordset dans le constructeur de la classe de recordset
Déclarations des membres de données de type champ
Les Assistants écrivent la déclaration de la classe du recordset dans un fichier .h similaire au code suivant, correspondant à 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 type paramètre ou de nouveaux membres de données de type champ que vous liez vous-même, ajoutez-les à la suite de ceux qui ont été générés par l'Assistant.
Remarquez également que l'Assistant substitue la fonction membre DoFieldExchange de la classe CRecordset.
Substitution de DoFieldExchange
DoFieldExchange est le noyau de RFX.L'infrastructure appelle DoFieldExchange à chaque fois qu'il faut déplacer des données depuis la source de données vers le recordset ou du recordset vers la source de données.DoFieldExchange prend en charge également l'obtention d'informations relatives aux données membres de champ via les fonctions membres IsFieldDirty et d'IsFieldNull.
La substitution ci-après de DoFieldExchange concerne la classe CSections.L'Assistant écrit la fonction dans le fichier .cpp correspondant à votre classe du 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);
}
Remarquez les principaux éléments de cette fonction :
Cette section de la fonction s'intitule mappage de champ.
Appel de CFieldExchange::SetFieldType via le pointeur pFX.Cet appel indique que tous les appels de fonction RFX jusqu'à la fin de DoFieldExchange ou jusqu'au prochain appel de SetFieldType sont des colonnes de sortie.Pour plus d'informations, consultez CFieldExchange::SetFieldType.
Plusieurs appels de la fonction globale RFX_Text — un par membre de données de type champ (dans l'exemple, ce sont tous des variables de type CString).Ces appels spécifient la relation entre un nom de colonne dans la source de données et un membre de données de champ.Ce sont les fonctions RFX qui effectuent concrètement le transfert des données.La bibliothèque de classes fournit les fonctions RFX pour la totalité des types de données les plus courants.Pour plus d'informations sur les fonctions RFX, consultez Record Field Exchange : utilisation des fonctions RFX.
[!REMARQUE]
L'ordre des colonnes dans le jeu de résultats doit correspondre à celui des appels de fonction RFX dans DoFieldExchange.
Pointeur pFX vers un objet CFieldExchange que l'infrastructure passe lorsqu'elle appelle DoFieldExchange.L'objet CFieldExchange précise l'opération que DoFieldExchange doit effectuer, la direction du transfert et d'autres informations relatives au contexte.
Constructeur de recordsets
Le constructeur de recordsets écrit par l'Assistant comporte deux éléments associés à RFX :
Initialisation de chaque donnée membre de champ
Initialisation de la donnée membre m_nFields qui contient le nombre de données membres de champ
Voici un exemple de constructeur pour le recordset CSections :
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
[!REMARQUE]
Si vous ajoutez manuellement un membre de données de type champ, comme cela peut être le cas si vous liez dynamiquement de nouvelles colonnes, vous devez incrémenter m_nFields.À cette fin, ajoutez une nouvelle ligne de code :
m_nFields += 3;
Ce code correspond à l'ajout de 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 de m_nParams à l'extérieur des parenthèses.