TN053 : DFX routines personnalisées pour les classes de base de données DAO
[!REMARQUE]
Dans Visual C++ .NET, les Assistants et l'environnement Visual C++ ne prennent plus en charge DAO (même si les classes DAO sont incluses et que vous pouvez toujours les utiliser).Microsoft recommande l'utilisation Modèles OLE DB ou ODBC et MFC pour les nouveaux projets.Vous ne devez utiliser DAO que dans les applications existantes.
Cette note technique décrit le mécanisme du processus DFX (DFX).Pour aider à comprendre ce qui se produit dans les routines DFX, la fonction d' DFX_Text est expliquée en détail comme exemple.Comme source d'informations supplémentaire à cette note technique, vous pouvez examiner le code pour les autres fonctions de la personne DFX.Vous n'aurez probablement pas besoin d'une routine DFX personnalisée aussi souvent que vous pouvez avoir besoin d'une routine de personnalisés RFX (utilisée avec les classes de base de données ODBC).
Cette note technique contient :
Vue d'ensemble du langage DFX
exemples à l'aide de le processus DFX et la liaison dynamique
Comment DFX s'exécute
Ce que votre routine DFX personnalisée fait
Détails de DFX_Text
Vue d'ensemble du langage DFX
Le mécanisme de processus DFX (DFX) est utilisée pour simplifier la procédure de récupérer et de mettre à jour des données lors de l'utilisation de la classe d' CDaoRecordset .Le processus est simplifié avec les données membres de la classe d' CDaoRecordset .En dérivant de CDaoRecordset, vous pouvez ajouter des données membres à 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 peut ne pas être la méthode d'effort/mise à jour de données de tableau pour toutes les applications.DFX extrait chaque champ lié chaque fois que l'enregistrement actif est modifié.Si vous développez une application dépendant qui ne requiert pas récupérer chaque champ lorsque la monnaie est modifiée, « la liaison dynamique » via CDaoRecordset::GetFieldValue et l' CDaoRecordset::SetFieldValue peuvent être la méthode d'accès aux données de votre choix.
[!REMARQUE]
DFX et la liaison dynamique ne sont pas mutuellement exclusifs, donc une utilisation hybride de la liaison statique et dynamique peut être utilisée.
Exemple 1 - utilisation de processus DFX uniquement
(suppose CDaoRecordset classe dérivée CMySet déjà ouvert)
// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();
Exemple 2 - utilisation de la liaison dynamique uniquement
(suppose à l'aide de la classe d' CDaoRecordset , rs, et elle est déjà ouverte)
// Add a new record to the customers table
COleVariant varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT );
rs.AddNew();
rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs.Update();
Exemple 3 — utilisation de processus DFX et de liaison dynamique
(a des données d'employés de navigation à CDaoRecordsetclasse dérivée emp)
// Get the employee's data so that it can be displayed
emp.MoveNext();
// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
emp.GetFieldValue(_T("photo"), varPhoto);
// Display the data
PopUpEmployeeData(emp.m_strFirstName,
emp.m_strLastName, varPhoto);
Comment DFX s'exécute
Le mécanisme DFX fonctionne de la même façon au mécanisme RFX (record field exchange) utilisé par les classes ODBC MFC.Les principes du DFX et de RFX sont identiques mais il existe de nombreuses différences internes.La création de fonctions de DFX était telle que virtuellement tout le code est partagé par les différentes routines DFX.Au DFX de plus haut niveau effectué uniquement certaines opérations.
DFX construit la clause SQL SÉLECTIONNER et la clause SQL PARAMÈTRES si nécessaire.
DFX construit la structure de liaison utilisée par la fonction d' GetRows DAO (plus sur cette version ultérieure).
DFX gère la mémoire tampon de données utilisée pour détecter les champs modifiés (si le mécanisme de double tampon est utilisée)
DFX gère les tableaux de NULL et état de DIRTY et les valeurs d'ensembles si nécessaire sur les mises à jour.
Au cœur de le mécanisme DFX est la fonction d' DoFieldExchange de la classe dérivée d' CDaoRecordset .Cette fonction comporte des appels aux fonctions de la personne DFX d'un type approprié d'opération.Avant d'appeler DoFieldExchange les fonctions internes MFC définit le type d'opération.La liste suivante affiche les différents types d'opération et une brève description.
Opération |
Description |
---|---|
AddToParameterList |
Clause de PARAMÈTRES de builds |
AddToSelectList |
Les builds UNE clause SELECT |
BindField |
Crée la structure de liaison |
BindParam |
Définit les valeurs de paramètre |
Corrections |
Les ensembles NULL l'état |
AllocCache |
Alloue le cache pour le contrôle modifié |
StoreField |
Enregistre l'enregistrement actif au cache |
LoadField |
Restaure mettent en cache des valeurs de membres |
FreeCache |
Libère le cache |
SetFieldNull |
État et valeur de champ d'ensembles DE valeur NULL |
MarkForAddNew |
Marque des champs dans le cas contraire PSEUDO NULL modifié |
MarkForEdit |
Marque les champs modifiés si ne correspondent pas le cache |
SetDirtyField |
Définit les valeurs de champ marquées comme modifiées |
Dans la section suivante, chaque opération est expliquée plus détaillée pour DFX_Text.
La fonctionnalité la plus importante à comprendre à propos de le processus de processus DFX est qu'elle utilise la fonction d' GetRows de l'objet d' CDaoRecordset .La fonction DAO GetRows peut fonctionner de plusieurs façons.Cette note technique décrira uniquement brièvement GetRows telle qu'elle est en dehors de la portée de cette note technique.
DAO GetRows peut fonctionner de plusieurs façons.
Il peut extraire plusieurs enregistrements et plusieurs champs de données en même temps.Cela permet à d'accès aux données plus rapide à la difficulté de traiter une grande structure de données et des offsets appropriés à chaque champ et de chaque enregistrement des données dans la structure.MFC ne tire pas parti de plusieurs ce mécanisme récupération d'enregistrement.
Une autre façon qu' GetRows peut s'exécuter est de permettre aux programmeurs de spécifier des adresses de liaison pour les données extraites de chaque champ pour un enregistrement des données.
DAO remontera également « rappel » dans l'appelant pour les colonnes de longueur variable afin de permettre à l'appelant d'allouer de la mémoire.Cette deuxième fonctionnalité offre l'avantage de réduire le nombre de copies de données ainsi que pour autoriser le stockage direct des données dans des membres d'une classe (classe dérivée d' CDaoRecordset ).Ce deuxième mécanisme est le utilise MFC de méthode de les lier aux données membres dans les classes dérivées d' CDaoRecordset .
Ce que votre routine DFX personnalisée fait
Il ressort de cette discussion que l'opération la plus importante implémentée dans toute fonction de DFX doit être possibilité d'installer les structures de données requises pour appeler avec succès GetRows.Il existe plusieurs autres opérations qu'une fonction de DFX doit prendre en charge également, mais pas aussi important ou complexe que correctement se préparation à l'appel d' GetRows .
l'utilisation du DFX est décrite dans la documentation en ligne.Fondamentalement, il existe deux spécifications.En premier lieu, les membres doivent être ajoutés à la classe dérivée d' CDaoRecordset pour chaque champ lié et paramètre.Après cet CDaoRecordset::DoFieldExchange doit être substituée.Notez que le type de données du membre est important.Elle doit correspondre aux données du champ dans la base de données ou au moins être convertible à ce type.Par exemple un champ numérique dans la base de données, tel qu'un long entier, peut toujours être converti en texte et l'englober à un membre d' CString , mais un champ de texte dans une base de données ne peut nécessairement être converti en une représentation numérique, telle que le longs entier et est liée à un long membre entier.DAO et le moteur de base de données Microsoft Jet sont chargées de la conversion (plutôt que MFC).
Détails de DFX_Text
Comme indiqué précédemment, la meilleure façon d'expliquer comment DFX s'exécute est de travailler via un exemple.À cette fin passer par les éléments internes d' DFX_Text doit être assez bien afin de fournir au moins une connaissance de base de DFX.
AddToParameterList
Cette opération génère la clause SQL PARAMÈTRES ("Parameters <param name>, <param type> ... ;") requise par Jet.Chaque paramètre est nommé et tapé (comme spécifié dans l'appel de fonction RFX).Consultez la fonction de CDaoFieldExchange::AppendParamType de fonction pour afficher les noms des différents types.Dans le cas de DFX_Text, le type utilisé est text.AddToSelectList
Génère la clause SQL SÉLECTIONNER .Cela est assez simple comme nom de colonne spécifié par l'appel de DFX est simplement ajouté ("SELECT <column name>, ...").BindField
Le plus complexe des opérations.Comme mentionné précédemment c'est là que la structure de liaison DAO utilisée par GetRows est installé.Comme vous pouvez le constater de code dans DFX_Text les types d'informations dans la structure incluent le type de DAO utilisé (DAO_CHAR ou DAO_WCHAR dans le cas de DFX_Text).En outre, le type de liaison utilisé est également installation.Dans une première section GetRows a été décrit uniquement brièvement, mais il était suffisant pour expliquer que le type de liaison utilisé par les MFC est toujours liaison adresse absolue (DAOBINDING_DIRECT).En plus de la liaison des colonnes de longueur variable (comme DFX_Text) la liaison de rappel est utilisée afin que MFC peut contrôler l'allocation de mémoire et spécifier une adresse de la longueur appropriée.Ces ce qui est le moyen ce MFC peut toujours pointer vers DAO « où » mettre les données, autorisant ainsi lier directement aux variables membres.Le reste de la structure de liaison est rempli avec des éléments tels que l'adresse de la fonction de rappel d'allocation de mémoire et du type de liaison des colonnes (liaison par le nom de la colonne).BindParam
Il s'agit d'une opération simple qui appelle SetParamValue avec la valeur de paramètre spécifié dans votre membre de paramètre.Fixup
Termine l'état de NULL pour chaque champ.SetFieldNull
Cette opération marque uniquement chaque état du champ comme NULL et définit la valeur de variable membre à PSEUDO_NULL.SetDirtyField
Appelle SetFieldValue pour chaque modifié marqué par champ.
Toutes les opérations suivantes traitent uniquement utiliser le cache de données.Le cache de données est une mémoire tampon supplémentaire des données dans l'enregistrement actif qui est utilisé pour fournir des opérations plus simples.Par exemple, les champs « modifiés » peuvent être automatiquement détectés.Comme décrit dans la documentation en ligne elle peut être arrêtée complètement ou au sur le mot.L'implémentation de la mémoire tampon utilise un mappage.Ce mappage est utilisée pour correspondre au sommet des copies allocation dynamique des données avec l'adresse du champ « lié » (ou des données membre dérivée d' CDaoRecordset ).
AllocCache
Alloue dynamiquement la valeur de champ mis en cache et l'ajoute à mapper.FreeCache
Supprime la valeur de champ mis en cache et le supprime du mappage.StoreField
Copie la valeur de champ actuelle dans le cache de données.LoadField
Copie la valeur mise en cache dans le membre de champ.MarkForAddNew
Le vérifie si la valeur du champ actuelle estNULL non- et marque modifié si nécessaire.MarkForEdit
Compare la valeur de champ actuelle avec le cache de données et marque modifié si nécessaire.
![]() |
---|
Modélisez vos routines DFX personnalisées sur les routines DFX existantes pour les types de données standard. |