Partager via


Record Field Exchange : fonctionnement de RFX

Cette rubrique explique le processus RFX. Il s’agit d’une rubrique avancée couvrant :

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).

RFX et l’objet Recordset

Les membres de données de champ de l’objet recordset, regroupés, constituent une mémoire tampon de modification qui contient les colonnes sélectionnées d’un enregistrement. Lorsque le jeu d’enregistrements est ouvert pour la première fois et qu’il est sur le point de lire le premier enregistrement, RFX lie (associe) chaque colonne sélectionnée à l’adresse du membre de données de champ approprié. Lorsque le jeu d’enregistrements met à jour un enregistrement, RFX appelle les fonctions d’API ODBC pour envoyer une instruction SQL UPDATE ou INSERT au pilote. RFX utilise ses connaissances des membres de données de champ pour spécifier les colonnes à écrire.

L’infrastructure sauvegarde la mémoire tampon d’édition à certaines étapes afin qu’elle puisse restaurer son contenu si nécessaire. RFX sauvegarde la mémoire tampon d’édition avant d’ajouter un nouvel enregistrement et avant de modifier un enregistrement existant. Il restaure la mémoire tampon d’édition dans certains cas, par exemple, après un Update appel suivant AddNew. La mémoire tampon d’édition n’est pas restaurée si vous abandonnez une mémoire tampon de modification nouvellement modifiée par exemple, en déplaçant vers un autre enregistrement avant d’appeler Update.

Outre l’échange de données entre la source de données et les membres de données de champ du jeu d’enregistrements, RFX gère les paramètres de liaison. Lorsque le jeu d’enregistrements est ouvert, tous les membres de données de paramètre sont liés dans l’ordre des espaces réservés « ? » dans l’instruction SQL qui CRecordset::Open construit. Pour plus d’informations, consultez Recordset : Paramétrage d’un recordset (ODBC).

Le remplacement de DoFieldExchange la classe recordset effectue tout le travail, en déplaçant les données dans les deux sens. Comme l’échange de données de boîte de dialogue (DDX), RFX a besoin d’informations sur les membres de données de votre classe. L’Assistant fournit les informations nécessaires en écrivant une implémentation spécifique à un recordset pour DoFieldExchange vous, en fonction des noms des membres de données de champ et des types de données que vous spécifiez avec l’Assistant.

Processus d’échange de champs d’enregistrement

Cette section décrit la séquence d’événements RFX en tant qu’objet recordset ouvert et lorsque vous ajoutez, mettez à jour et supprimez des enregistrements. La table Sequence of RFX Operations During Recordset Open et la table Sequence of RFX Operations During Scrolling in this topic show the process as RFX process a Move command in the recordset and as RFX manage an update. Pendant ces processus, DoFieldExchange est appelé pour effectuer de nombreuses opérations différentes. Le m_nOperation membre de données de l’objet CFieldExchange détermine l’opération demandée. Vous trouverez peut-être utile de lire l’objet Recordset : Comment les recordsets sélectionnent des enregistrements (ODBC) et l’ensemble d’enregistrements : Comment les recordsets mettent à jour les enregistrements (ODBC) avant de lire ce matériel.

RFX : liaison initiale de colonnes et de paramètres

Les activités RFX suivantes se produisent, dans l’ordre indiqué, lorsque vous appelez la fonction Open member d’un objet recordset :

  • Si le jeu d’enregistrements a des membres de données de paramètre, l’infrastructure appelle DoFieldExchange pour lier les paramètres aux espaces réservés de paramètres dans la chaîne d’instruction SQL du jeu d’enregistrements. Une représentation dépendante du type de données de la valeur du paramètre est utilisée pour chaque espace réservé trouvé dans l’instruction SELECT . Cela se produit après la préparation de l’instruction SQL, mais avant son exécution. Pour plus d’informations sur la préparation des instructions, consultez la ::SQLPrepare fonction dans la référence du programmeur ODBC.

  • L’infrastructure appelle DoFieldExchange une deuxième fois pour lier les valeurs des colonnes sélectionnées aux membres de données de champ correspondants dans le jeu d’enregistrements. Cela établit l’objet recordset en tant que mémoire tampon d’édition contenant les colonnes du premier enregistrement.

  • Le jeu d’enregistrements exécute l’instruction SQL et la source de données sélectionne le premier enregistrement. Les colonnes de l’enregistrement sont chargées dans les membres de données de champ du jeu d’enregistrements.

Le tableau suivant montre la séquence d’opérations RFX lorsque vous ouvrez un jeu d’enregistrements.

Séquence d’opérations RFX pendant l’ouverture du jeu d’enregistrements

Votre opération Opération DoFieldExchange Opération de base de données/SQL
1. Ouvrez le jeu d’enregistrements.
2. Générez une instruction SQL.
3. Envoyez le code SQL.
4. Lier des membres de données de paramètre.
5. Lier des membres de données de champ à des colonnes.
6. ODBC effectue le déplacement et remplit les données.
7. Corrigez les données pour C++.

Les recordsets utilisent l’exécution préparée d’ODBC pour permettre une nouvelle requête rapide avec la même instruction SQL. Pour plus d’informations sur l’exécution préparée, consultez la référence du programmeur ODBC.

RFX : défilement

Lorsque vous faites défiler d’un enregistrement vers un autre, l’infrastructure appelle DoFieldExchange pour remplacer les valeurs précédemment stockées dans les membres de données de champ par des valeurs pour le nouvel enregistrement.

Le tableau suivant montre la séquence d’opérations RFX lorsque l’utilisateur passe de l’enregistrement à l’enregistrement.

Séquence d’opérations RFX pendant le défilement

Votre opération Opération DoFieldExchange Opération de base de données/SQL
1. Appelez ou l’une MoveNext des autres fonctions Move.
2. ODBC effectue le déplacement et remplit les données.
3. Corrigez les données pour C++.

RFX : Ajout de nouveaux enregistrements et modification d’enregistrements existants

Si vous ajoutez un nouvel enregistrement, le jeu d’enregistrements fonctionne en tant que mémoire tampon de modification pour générer le contenu du nouvel enregistrement. Comme pour l’ajout d’enregistrements, la modification d’enregistrements implique la modification des valeurs des membres de données de champ du jeu d’enregistrements. Du point de vue RFX, la séquence est la suivante :

  1. Votre appel à la fonction AddNew ou Edit du jeu d’enregistrements entraîne la restauration de RFX dans la mémoire tampon d’édition actuelle afin qu’elle puisse être restaurée ultérieurement.

  2. AddNew ou Edit prépare les champs dans la mémoire tampon d’édition afin que RFX puisse détecter les membres de données de champ modifiés.

    Étant donné qu’un nouvel enregistrement n’a pas de valeurs précédentes pour comparer les nouvelles valeurs, AddNew définissez la valeur de chaque membre de données de champ sur une valeur PSEUDO_NULL. Plus tard, lorsque vous appelez Update, RFX compare la valeur de chaque membre de données à la valeur PSEUDO_NULL. S’il existe une différence, le membre de données a été défini. (PSEUDO_NULL n’est pas identique à une colonne d’enregistrement avec une valeur Null vraie et n’est pas l’une de ces valeurs identiques à C++ NULL.)

    Contrairement à l’appel Update pour AddNew, l’appel Update pour Edit comparer les valeurs mises à jour avec les valeurs précédemment stockées plutôt que d’utiliser PSEUDO_NULL. La différence est qu’aucune AddNew valeur précédemment stockée n’est stockée pour la comparaison.

  3. Vous définissez directement les valeurs des membres de données de champ dont vous souhaitez modifier ou que vous souhaitez remplir pour un nouvel enregistrement. Cela peut inclure l’appel SetFieldNull.

  4. Votre appel à Update case activée s pour les membres de données de champ modifiés, comme décrit à l’étape 2 (voir la séquence de tables des opérations RFX pendant le défilement). Si aucune modification n’a été apportée, Update retourne 0. Si certains membres de données de champ ont changé, Update prépare et exécute une instruction SQL INSERT qui contient des valeurs pour tous les champs mis à jour dans l’enregistrement.

  5. Pour AddNew, Update conclut en restaurant les valeurs précédemment stockées de l’enregistrement qui était actif avant l’appel AddNew . Pour Edit, les nouvelles valeurs modifiées restent en place.

Le tableau suivant montre la séquence d’opérations RFX lorsque vous ajoutez un nouvel enregistrement ou modifiez un enregistrement existant.

Séquence d’opérations RFX pendant AddNew et Edit

Votre opération Opération DoFieldExchange Opération de base de données/SQL
1. Appel ou AddNewEdit.
2. Sauvegardez la mémoire tampon d’édition.
3. Pour AddNew, marquez les membres de données de champ en tant que « propre » et Null.
4. Attribuez des valeurs aux membres de données de champ recordset.
5. Appelez Update.
6. Recherchez les champs modifiés.
7. Générer l’instruction SQL INSERT pour ou l’instruction UPDATE pour Edit.AddNew
8. Envoyez le code SQL.
9. Pour AddNew, restaurez la mémoire tampon d’édition sur son contenu sauvegardé. Pour Edit, supprimez la sauvegarde.

RFX : suppression d’enregistrements existants

Lorsque vous supprimez un enregistrement, RFX définit tous les champs sur NULL comme rappel que l’enregistrement est supprimé et que vous devez le déplacer. Vous n’avez pas besoin d’autres informations de séquence RFX.

Voir aussi

Record Field Exchange (RFX)
Consommation ODBC MFC
Macros, fonctions globales et variables globales
CFieldExchange, classe
CRecordset ::D oFieldExchange