Recordset : fonctionnement d'AddNew, Edit et Delete (ODBC)
Cette rubrique s’applique aux classes ODBC MFC.
Cette rubrique explique comment fonctionnent les AddNew
fonctions membres et Delete
les Edit
fonctions membres de la classeCRecordset
. Sont abordés les sujets suivants :
Remarque
Cette rubrique s’applique aux objets dérivés 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, consultez Recordset : Extraction d’enregistrements en bloc (ODBC).
En guise de supplément, vous pouvez lire l’échange de champs d’enregistrement : fonctionnement de RFX, qui décrit le rôle correspondant de RFX dans les opérations de mise à jour.
Ajout d’un enregistrement
L’ajout d’un nouvel enregistrement à un jeu d’enregistrements implique l’appel de la fonction membre AddNew du jeu d’enregistrements, la définition des valeurs des membres de données de champ du nouvel enregistrement et l’appel de la fonction membre Update pour écrire l’enregistrement dans la source de données.
En tant que condition préalable à l’appel AddNew
, le jeu d’enregistrements ne doit pas avoir été ouvert en lecture seule. Les CanUpdate
fonctions membres CanAppend
et les fonctions vous permettent de déterminer ces conditions.
Quand vous appelez AddNew
:
L’enregistrement dans la mémoire tampon d’édition est stocké, de sorte que son contenu peut être restauré si l’opération est annulée.
Les membres de données de champ sont marqués de manière à pouvoir détecter les modifications apportées ultérieurement. Les membres de données de champ sont également marqués propre (inchangé) et définis sur une valeur Null.
Une fois que vous avez appelé AddNew
, la mémoire tampon d’édition représente un nouvel enregistrement vide, prêt à être rempli avec des valeurs. Pour ce faire, vous définissez manuellement les valeurs en les affectant. Au lieu de spécifier une valeur de données réelle pour un champ, vous pouvez appeler SetFieldNull
pour spécifier la valeur Null.
Pour valider vos modifications, vous appelez Update
. Lorsque vous appelez Update
le nouvel enregistrement :
Si votre pilote ODBC prend en charge la
::SQLSetPos
fonction API ODBC, MFC utilise la fonction pour ajouter l’enregistrement sur la source de données. Avec::SQLSetPos
, MFC peut ajouter un enregistrement plus efficacement, car il n’est pas obligé de construire et de traiter une instruction SQL.Si
::SQLSetPos
vous ne pouvez pas l’utiliser, MFC effectue les opérations suivantes :Si aucune modification n’est détectée,
Update
ne fait rien et retourne 0.S’il existe des modifications,
Update
construit une instruction SQL INSERT . Les colonnes représentées par tous les membres de données de champ sale sont répertoriées dans l’instruction INSERT. Pour forcer l’inclusion d’une colonne, appelez la fonction membre SetFieldDirty :SetFieldDirty( &m_dataMember, TRUE );
Update
valide le nouvel enregistrement : l’instruction INSERT est exécutée et l’enregistrement est validé dans la table sur la source de données (et le jeu d’enregistrements, si ce n’est pas un instantané), sauf si une transaction est en cours.L’enregistrement stocké est restauré dans la mémoire tampon d’édition. Enregistrement actif avant que l’appel
AddNew
soit à nouveau actif, que l’instruction INSERT ait été exécutée correctement.
Conseil
Pour contrôler complètement un nouvel enregistrement, suivez l’approche suivante : définissez les valeurs de tous les champs qui auront des valeurs, puis définissez explicitement tous les champs qui resteront Null en appelant
SetFieldNull
avec un pointeur vers le champ et le paramètre TRUE (valeur par défaut). Si vous souhaitez vous assurer qu’un champ n’est pas écrit dans la source de données, appelezSetFieldDirty
avec un pointeur vers le champ et le paramètre FALSE et ne modifiez pas la valeur du champ. Pour déterminer si un champ est autorisé à être Null, appelezIsFieldNullable
.Conseil
Pour détecter quand les membres de données recordset changent de valeur, MFC utilise une valeur PSEUDO_NULL appropriée à chaque type de données que vous pouvez stocker dans un recordset. Si vous devez définir explicitement un champ sur la valeur PSEUDO_NULL et que le champ doit déjà être marqué Null, vous devez également appeler
SetFieldNull
, en passant l’adresse du champ dans le premier paramètre et FALSE dans le deuxième paramètre.
Visibilité des enregistrements ajoutés
Quand un enregistrement ajouté est-il visible dans votre jeu d’enregistrements ? Les enregistrements ajoutés s’affichent parfois et parfois ne sont pas visibles, en fonction de deux éléments :
Ce que votre pilote est capable de.
Ce que le framework peut tirer parti de.
Si votre pilote ODBC prend en charge la ::SQLSetPos
fonction API ODBC, MFC utilise la fonction pour ajouter des enregistrements. Avec ::SQLSetPos
, les enregistrements ajoutés sont visibles par n’importe quel jeu d’enregistrements MFC pouvant être mis à jour. Sans prise en charge de la fonction, les enregistrements ajoutés ne sont pas visibles et vous devez les appeler Requery
pour les afficher. L’utilisation ::SQLSetPos
est également plus efficace.
Modification d’un enregistrement existant
La modification d’un enregistrement existant dans un jeu d’enregistrements implique le défilement vers l’enregistrement, l’appel de la fonction Modifier le membre Edit du jeu d’enregistrements, la définition des valeurs des membres de données de champ du nouvel enregistrement et l’appel de la fonction membre Update pour écrire l’enregistrement modifié dans la source de données.
En tant que condition préalable à l’appel Edit
, le jeu d’enregistrements doit être pouvant être mis à jour et sur un enregistrement. Les CanUpdate
fonctions membres IsDeleted
et les fonctions vous permettent de déterminer ces conditions. L’enregistrement actif ne doit pas non plus avoir déjà été supprimé, et il doit y avoir des enregistrements dans le jeu d’enregistrements (à la fois IsBOF
et IsEOF
retourner 0).
Lorsque vous appelez Edit
, l’enregistrement dans la mémoire tampon d’édition (l’enregistrement actif) est stocké. Les valeurs de l’enregistrement stocké sont utilisées ultérieurement pour détecter si des champs ont changé.
Après l’appel Edit
, la mémoire tampon d’édition représente toujours l’enregistrement actif, mais est maintenant prête à accepter les modifications apportées aux membres de données de champ. Pour modifier l’enregistrement, vous définissez manuellement les valeurs des membres de données de champ que vous souhaitez modifier. Au lieu de spécifier une valeur de données réelle pour un champ, vous pouvez appeler SetFieldNull
pour spécifier la valeur Null. Pour valider vos modifications, appelez Update
.
Conseil
Pour sortir ou AddNew
Edit
en mode, appelez Move
avec le paramètre AFX_MOVE_REFRESH.
En tant que condition préalable à l’appel Update
, le jeu d’enregistrements ne doit pas être vide et l’enregistrement actif n’a pas été supprimé. IsBOF
, IsEOF
et IsDeleted
doit tous retourner 0.
Lorsque vous appelez Update
l’enregistrement modifié :
Si votre pilote ODBC prend en charge la
::SQLSetPos
fonction API ODBC, MFC utilise la fonction pour mettre à jour l’enregistrement sur la source de données. Avec::SQLSetPos
, le pilote compare votre mémoire tampon d’édition avec l’enregistrement correspondant sur le serveur, en mettant à jour l’enregistrement sur le serveur si les deux sont différents. Avec::SQLSetPos
, MFC peut mettre à jour un enregistrement plus efficacement, car il n’est pas obligé de construire et de traiter une instruction SQL.- ou -
Si
::SQLSetPos
vous ne pouvez pas l’utiliser, MFC effectue les opérations suivantes :Si aucune modification n’a été apportée,
Update
ne fait rien et retourne 0.S’il existe des modifications,
Update
construit une instruction SQL UPDATE . Les colonnes répertoriées dans l’instruction UPDATE sont basées sur les membres de données de champ qui ont changé.Update
valide les modifications ( exécute l’instruction UPDATE ) et l’enregistrement est modifié sur la source de données, mais n’est pas validé si une transaction est en cours (voir Transaction : Exécution d’une transaction dans un recordset (ODBC) pour plus d’informations sur la façon dont la transaction affecte la mise à jour). ODBC conserve une copie de l’enregistrement, qui change également.Contrairement au processus pour
AddNew
, leEdit
processus ne restaure pas l’enregistrement stocké. L’enregistrement modifié reste en place en tant qu’enregistrement actif.
Attention
Lorsque vous préparez à mettre à jour un recordset en appelant
Update
, veillez à ce que votre jeu d’enregistrements inclut toutes les colonnes qui composent la clé primaire de la table (ou toutes les colonnes d’un index unique sur la table, ou suffisamment de colonnes pour identifier la ligne de manière unique). Dans certains cas, l’infrastructure peut utiliser uniquement les colonnes sélectionnées dans votre jeu d’enregistrements pour identifier l’enregistrement dans votre table à mettre à jour. Sans toutes les colonnes nécessaires, plusieurs enregistrements peuvent être mis à jour dans la table. Dans ce cas, l’infrastructure lève des exceptions lorsque vous appelezUpdate
.Conseil
Si vous appelez ou après avoir appelé
AddNew
l’une ouEdit
l’autre fonction précédemment, mais avant d’appelerUpdate
, la mémoire tampon de modification est actualisée avec l’enregistrement stocké, en remplaçant l’enregistrement nouveau ou modifié en cours. Ce comportement vous permet d’abandonner ouAddNew
Edit
de commencer un nouveau : si vous déterminez que l’enregistrement en cours est défectueux, appelez ouAddNew
réexénciezEdit
.
Suppression d’un enregistrement
La suppression d’un enregistrement d’un jeu d’enregistrements implique le défilement vers l’enregistrement et l’appel de la fonction de membre Delete du jeu d’enregistrements. Contrairement AddNew
à et Edit
, Delete
ne nécessite pas d’appel correspondant à Update
.
En tant que condition préalable à l’appel Delete
, le jeu d’enregistrements doit être mis à jour et doit être sur un enregistrement. Les CanUpdate
fonctions , , IsBOF
IsEOF
et IsDeleted
membres vous permettent de déterminer ces conditions.
Quand vous appelez Delete
:
Si votre pilote ODBC prend en charge la
::SQLSetPos
fonction API ODBC, MFC utilise la fonction pour supprimer l’enregistrement sur la source de données. L’utilisation::SQLSetPos
est généralement plus efficace que l’utilisation de SQL.- ou -
Si
::SQLSetPos
vous ne pouvez pas l’utiliser, MFC effectue les opérations suivantes :L’enregistrement actif dans la mémoire tampon d’édition n’est pas sauvegardé comme dans
AddNew
etEdit
.Delete
construit une instruction SQL DELETE qui supprime l’enregistrement.L’enregistrement actif dans la mémoire tampon d’édition n’est pas stocké comme dans
AddNew
etEdit
.Delete
valide la suppression : exécute l’instruction DELETE . L’enregistrement est marqué supprimé sur la source de données et, si l’enregistrement est un instantané, dans ODBC.Les valeurs de l’enregistrement supprimé se trouvent toujours dans les membres de données de champ du jeu d’enregistrements, mais les membres de données de champ sont marqués Null et la fonction membre du
IsDeleted
jeu d’enregistrements retourne une valeur différente de zéro.
Remarque
Après avoir supprimé un enregistrement, vous devez faire défiler vers un autre enregistrement pour remplir la mémoire tampon d’édition avec les données du nouvel enregistrement. Il s’agit d’une erreur d’appel
Delete
ou d’appelEdit
.
Pour plus d’informations sur les instructions SQL utilisées dans les opérations de mise à jour, consultez SQL.
Voir aussi
Recordset (ODBC)
Recordset : informations complémentaires sur les mises à jour (ODBC)
Record Field Exchange (RFX)