TN043 : Routines RFX

Cette note décrit l'architecture de record field exchange (RFX). Il décrit également comment vous écrire une procédure RFX_.

Vue d'ensemble du Record Field Exchange

Toutes les fonctions de champ de recordset sont faites avec du code C++. Il n'y a aucune ressources spéciales ou des macros magiques. Le cœur du mécanisme est une fonction virtuelle qui doit être substituée dans chaque classe dérivée de jeu d'enregistrements. On le trouve toujours dans le présent formulaire:

vOID CMySet::DoFieldExchange (objet CFieldExchange * pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  lt ; jeu d'enregistrements appel de type du domaine exchange >
  < recordset change fonction appel >
  //}}AFX_FIELD_MAP
}

Les commentaires AFX format spécial permettent de ClassWizard localiser et modifier le code dans cette fonction. Code qui n'est pas compatible avec ClassWizard doit être placé à l'extérieur des commentaires format spécial.

Dans l'exemple ci-dessus, lt ; recordset_exchange_field_type_call > se présente sous la forme:

pFX-> ;SetFieldType(CFieldExchange::outputColumn)

et lt ; recordset_exchange_function_call > se présente sous la forme:

RFX_Custom (pFX, « Col2 », m_Col2)

La plupart des fonctions RFX_ sont trois arguments comme indiqué ci-dessus, mais certains (p. ex. RFX_Text et RFX_Binary) ont des arguments facultatifs supplémentaires.

Plus d'un RFX_ peut être inclus dans chaque fonction DoDataExchange.

Voir « afxdb.h » pour une liste de tous les recordset champ change routines fournies avec MFC.

Appels de champ de Recordset sont un moyen d'enregistrer des emplacements de mémoire (généralement des membres de données) pour stocker des données de terrain pour une classe de CMySet.

Notes

Fonctions de champ de Recordset sont conçues pour fonctionner uniquement avec les classes de CRecordset . Ils ne sont pas généralement utilisables par toutes les autres classes MFC.

Les valeurs initiales de données sont définies dans le constructeur de C++ standard, généralement dans un bloc avec //{{AFX_FIELD_INIT(CMylSet) et //}}AFX_FIELD_INIT commentaires.

Chaque fonction RFX_ doit prendre en charge différentes opérations, allant de retourner la situation sale du champ archivage le terrain en vue de modifier le champ.

Chaque fonction qui appelle DoFieldExchange (par exemple SetFieldNull, IsFieldDirty), est son propre initialisation autour de l'appel à DoFieldExchange.

Comment ça marche?

Vous n'avez pas besoin de comprendre ce qui suit afin de pouvoir pour utiliser RFX. Cependant, comprendre comment cela fonctionne dans les coulisses vous aidera à rédiger votre propre procédure d'échange.

La fonction membre DoFieldExchange est assez semblable à la fonction de membre Serialize - il est responsable de l'obtention ou la définition des données à/de/vers les données des membres de la classe d'une forme externe (dans ce cas de colonnes du résultat d'une requête ODBC). Le paramètre pFX est dans ce contexte pour faire l'échange de données et est similaire au paramètre CArchive à CObject::Serialize. Le pFX (un objet CFieldExchange ) est un indicateur de fonctionnement, qui est semblable à, mais une généralisation de la direction de CArchive drapeau. Une fonction RFX peut avoir appuyer les opérations suivantes

Extensions de l'utilisateur

Il y a plusieurs façons d'étendre le mécanisme RFX par défaut. Vous pouvez

&Notenbsp ;  Ce code ne peut pas être édité par ClassWizard et devrait être utilisé uniquement à l'extérieur des commentaires format spécial.

Écrire une coutume RFX

Pour écrire votre propre fonction RFX personnalisé, il est suggéré que vous copiez une fonction RFX existante et modifiez vos propres objectifs. Choisir la droite RFX pour copier peut rendre votre travail plus facile. Certaines fonctions RFX ont des propriétés uniques que vous devez prendre en compte pour décider lequel copier.

RFX_Long et RFX_Int:

Il s'agit des plus simples fonctions RFX. La valeur de données n'a pas besoin de toute interprétation spéciale, et la taille des données est fixée.

RFX_Single et RFX_Double:

Comme RFX_Long et RFX_Int ci-dessus, ces fonctions sont simples et peut faire largement l'utilisation de l'implémentation par défaut. Ils sont stockés dans dbflt.cpp au lieu de dbrfx.cpp, cependant, pour permettre le chargement du runtime floating point bibliothèque uniquement lorsqu'elles sont explicitement référence.

RFX_Text et RFX_Binary:

Ces deux fonctions &allouer un tampon statique pour contenir les informations de la chaîne/binaire et doivent s'inscrire ces tampons avec SQLBindCol ODBC au lieu d'inscrire amp ; valeur. De ce fait, ces deux fonctions ont beaucoup de code spécial-affaire.

RFX_Date:

ODBC renvoie des informations de date et d'heure dans leur propre structure de données TIMESTAMP_STRUCT. Cette fonction alloue dynamiquement un TIMESTAMP_STRUCT comme un « proxy » pour envoyer et recevoir des données de temps de date. Diverses opérations doivent transférer les informations de date et d'heure entre l'objet C++ CTime et le proxy TIMESTAMP_STRUCT. Il va sans dire que cela complique considérablement la cette fonction, mais c'est un bon exemple de la façon d'utiliser un proxy pour transfert de données.

RFX_LongBinary:

Il s'agit de la seule bibliothèque de classe fonction RFX qui n'utilise pas de liaison de la colonne pour recevoir et envoyer des données. Cette fonction ne tient pas compte de l'opération de BindFieldToColumn au lieu de cela, lors de l'opération de correction, alloue de stockage pour stocker les données entrantes de SQL_LONGVARCHAR ou SQL_LONGVARBINARY, puis effectue un appel de SQLGetData pour extraire la valeur dans le stockage alloué. Lors de la préparation renvoyer des valeurs de données à la source de données (c.-à-d. les opérations NameValue et valeur), cette fonction utilise la fonctionnalité DATA_AT_EXEC de ODBC. Consultez Technical Note 45 pour plus d'informations sur le travail avec SQL_LONGVARBINARY et SQL_LONGVARCHARs.

Lorsque vous écrivez votre propre fonction RFX_ , vous serez souvent en mesure d'utiliser CFieldExchange::Default pour mettre en œuvre une opération donnée. Regardez la mise en œuvre de la valeur par défaut pour l'opération en question. Si elle effectue l'opération vous pourrait être écrit en fonction de votre RFX_ vous pouvez déléguer à la CFieldExchange::Default. Vous pouvez voir des exemples de l'appel de CFieldExchange::Default en dbrfx.cpp

Il est important d'appeler IsFieldType au début de votre fonction RFX et retourner immédiatement si elle retourne FALSE. Ce mécanisme conserve les opérations de paramètre d'effectué sur outputColumnset vice versa (comme appeler BindParam sur un outputColumn). En outre, IsFieldType automatiquement assure le suivi du comte outputColumns (m_nFields) et params (m_nParams).

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index