Cette note technique décrit le mécanisme de change (DFX) record field DAO. Pour aider à comprendre ce qui se passe dans les routines DFX, la fonction DFX_Text sera expliquée en détail par exemple. Comme une source supplémentaire d'information à la présente note technique, vous pouvez tout simplement examiner le code pour les autres fonctions DFX individuelles.Vous avez probablement ne besoin une routine personnalisée de DFX aussi souvent que vous pourriez avoir besoin d'une routine personnalisée de RFX (utilisée avec les classes de base de données ODBC).
Cette note technique contient:
Aperçu DFX
Le mécanisme d'échange record field DAO (DFX) est utilisé pour simplifier la procédure d'extraction et de mise à jour de données lorsque vous utilisez la classe CDaoRecordset . Le processus est simplifié par l'utilisation de membres de données de la classe CDaoRecordset . En dérivant de CDaoRecordset, vous pouvez ajouter des membres de données de la classe dérivée représentant chaque champ dans une table ou une requête. Ce mécanisme de « liaison statique » est simple, mais il ne peut pas être la méthode de récupération/mise à jour des données de choix pour toutes les applications. DFX récupère chaque champ lié chaque fois que l'enregistrement en cours est modifiée. Si vous développez une application performance sensible qui ne nécessite pas l'extraction de chaque champ lorsque la monnaie est modifiée, « lie dynamique » via CDaoRecordset::GetFieldValue et CDaoRecordset::SetFieldValue peut être l'accès aux données méthode de choix.
&Notenbsp ; DFX et liaison dynamique ne sont pas mutuellement exclusifs, pour une utilisation hybride de liaison statique et dynamique puisse être utilisée.
Exemple 1 - utilisation de DAO Record Field Exchange uniquement
(suppose CDaoRecordset - classe dérivée CMySet déjà ouvert)
/ / Ajouter un nouvel enregistrement à la table customers
MONJEU.AddNew() ;
myset.m_strCustID = _T("MSFT") ;
myset.m_strCustName = _T("Microsoft") ;
MONJEU.Update()
Exemple 2: utilisation de la liaison dynamique uniquement
(suppose à l'aide de CDaoRecordset classe, rs , et il est déjà ouvert)
/ / Ajouter un nouvel enregistrement à la table customers
COleVariantnbsp ; varFieldValue1 (_T("MSFT"), VT_BSTRT) ;
/ / &Note : VT_BSTRT indicateurs de type chaîne comme ANSI, au lieu de la valeur par défaut UNICODE
VarFieldValue2 COleVariant (_T("Microsoft"), VT_BSTRT) ;
RS.AddNew() ;
RS.SetFieldValue(_T("Customer_ID"), varFieldValue1) ;
RS.SetFieldValue(_T("Customer_Name"), varFieldValue2) ;
RS.Update()
Exemple 3 - utilisation de DAO Record Field Exchange et liaison dynamique
(suppose de navigation données employé avec CDaoRecordset-classe dérivée emp )
/ / Obtenir des données de l'employé afin qu'il peut être affiché
EMP.MoveNext() ;
/ / Si l'utilisateur veut voir la photo de l'employé,
/ / chercher
COleVariant varPhoto ;
Si (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto) ;
/ / Afficher les données
PopUpEmployeeData (emp.m_strFirstName,
EMP.m_strLastName, varPhoto)
Le mécanisme DFX fonctionne de manière similaire au mécanisme record field exchange (RFX) utilisé par les classes ODBC MFC. Les principes de DFX et appels d'offres sont les mêmes, mais il existe de nombreuses différences internes. La conception des fonctions DFX était telle que pratiquement tout le code est partagé par les routines DFX individuels. Sur le plus haut niveau DFX seulement est peu de choses.
Au cœur de la DFX mécanisme est fonction DoFieldExchange de la classe CDaoRecordset dérivé. Cette fonction envoie des appels aux fonctions DFX individuelles d'un type de fonctionnement approprié. Avant d'appeler DoFieldExchange le MFC en interne, fonctions définissent le type d'opération. La liste suivante montre les différents types d'opération et une brève description.
| Opération | Description |
| AddToParameterList | Clause de paramètres de builds |
| AddToSelectList | Clause SELECT construit |
| BindField | Met en place une structure de liaison |
| BindParam | Définit les valeurs de paramètre |
| Correction | Définit l'État NULL |
| AllocCache | Alloue un cache pour cocher sale |
| StoreField | Enregistre l'enregistrement en cours dans le cache |
| LoadField | Cache de restaurations pour des valeurs du membre |
| FreeCache | Libère de la cache |
| SetFieldNull | Ensembles de ch& amp de statut ; valeur null |
| MarkForAddNew | Les champs marques Sales si non NULL PSEUDO |
| MarkForEdit | Si sale de marques champs ne correspondent pas cache |
| SetDirtyField | Ensembles de champ valeurs marqués comme Sales |
Dans la section suivante, chaque opération sera expliquée plus en détail pour DFX_Text.
La caractéristique la plus importante à comprendre au sujet du processus d'échange record field DAO est qu'elle utilise la fonction GetRows de l'objet ICDaoRecordset . La fonction DAO GetRows peut fonctionner de plusieurs façons. Cette note technique décrit brièvement GetRows comme il est hors de la portée de cette note technique.
DAO GetRows peut fonctionner de plusieurs façons.
En quoi consiste votre Routine DFX personnalisé
Il ressort de cette analyse que l'opération plus importante mis en œuvre dans n'importe quelle fonction DFX doit être la capacité de mettre en place les structures de données requises pour appeler correctement GetRows. Il y a un certain nombre d'autres opérations qui ont une fonction DFX doit ainsi prendre en charge, mais aucun comme important ni complexe se préparer correctement pour la méthode GetRows appeler.
L'utilisation de DFX est décrite dans la documentation en ligne. Essentiellement, il y a 2 exigences. Tout d'abord, les membres doivent être ajoutées à la classe CDaoRecordset dérivée pour chaque champ lié et chaque paramètre. Suite à cette CDaoRecordset::DoFieldExchange doit être substituée. Notez que le type de données des membres est important. Il devrait correspondre les données du champ dans la base de données ou au moins être convertable de ce type. Par exemple, un champ numérique dans la base de données, comme un entier long, toujours peut être converti en texte et lié à un membre CString , mais un champ de texte dans une base de données ne peut pas nécessairement être converti en une représentation numérique, comme un entier long et lié à un membre de type entier long. DAO et le moteur de base de données Microsoft Jet sont responsables de la conversion (plutôt que de le MFC).
Tel que mentionné précédemment, la meilleure façon d'expliquer comment fonctionne la DFX est probablement simplement travailler par exemple. À cette fin traverse les rouages de la DFX_Text devrait fonctionner parfaitement afin de fournir au moins une compréhension de base de DFX.
AddToParameterList
Cette opération génère la clause SQL paramètres (" Parameters lt;param name>, <param type> ... ; ") requis par Jet. Chaque paramètre est nommé et typé (comme spécifié dans l'appel RFX). Voir la fonction CDaoFieldExchange::AppendParamType pour voir les noms des types individuels. Dans le cas de DFX_Text, le type utilisé esttext.
AddToSelectList
Construit la clause SQL SELECT . C'est assez simple comme le nom de la colonne spécifié par l'appel DFX est simplement annexée (" SELECT lt;column name>, ... ").
BindField
-De loin le plus complexe des opérations. Comme mentionné précédemment que c'est où la structure de liaison DAO utilisée par la méthode GetRows est mises en place. Comme vous pouvez le voir dans le code de DFX_Text les types d'informations dans la structure comprennent le type DAO utilisé (DAO_CHAR ou DAO_WCHAR dans le cas de DFX_Text). En outre, le type de liaison utilisé est également installé. Dans une section précédente GetRows a été brièvement décrite, mais elle était suffisante pour expliquer que le type de liaison utilisé par MFC n'est toujours obligatoire adresse directe (DAOBINDING_DIRECT). En outre pour fixation de colonne de longueur variable (comme DFX_Text) liaison de rappel est utilisé afin que les MFC peut contrôler l'allocation de mémoire et de spécifier une adresse de la bonne longueur. Ce que cela signifie est que MFC peut toujours dire DAO « où » mettre les données, permettant ainsi la liaison directement aux variables membres. Le reste de la structure de liaison est renseigné avec des choses comme l'adresse de la fonction de rappel d'allocation mémoire et le type de liaison de colonne (liaison par nom de colonne).
BindParam
C'est une opération simple qui appelle SetParamValue avec la valeur du paramètre spécifiée dans le membre de votre paramètre.
Correction
Renseigne l'état NULL pour chaque champ.
SetFieldNull
Cette opération seulement marque chaque statut de champ NULL et le membre définit la valeur de la variable PSEUDO_NULL.
SetDirtyField
Appels SetFieldValue pour chaque champ marqué sale.
Toutes les opérations restantes traitent uniquement en utilisant le cache de données. Le cache de données est un tampon supplémentaire des données de l'enregistrement en cours qui est utilisée pour faire certaines choses plus simples. Par exemple les champs « Sales » peuvent être détectés automatiquement. Comme décrit dans la documentation en ligne, qu'il peut être désactivé complètement, ou au niveau du terrain. La mise en oeuvre de la mémoire tampon utilise une carte. Cette carte est utilisée pour correspondre à une copie allouée dynamiquement des données avec l'adresse du champ « lié » (ou du membre de données derieved CDaoRecordset ).
AllocCache
Dynamique affecte la valeur du champ mis en cache et l'ajoute à la carte.
FreeCache
Supprime la valeur du champ mis en cache et le supprime de la carte.
StoreField
Copie la valeur du champ actuel dans le cache de données.
LoadField
Copie la valeur mise en cache dans le membre de domaine.
MarkForAddNew
Vérifie si la valeur du champ actuel est non-NULL et marques il sale si nécessaire.
MarkForEdit
Compare la valeur du champ actuel avec le cache de données et marques sale si nécessaire.
Astuce  ; Modèle vos routines DFX personnalisés sur les routines DFX existants pour les types de données standard.
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie