TN053: Custom DFX Routinen für DAO-Datenbankklassen

Diese technische Applikationsschrift beschreibt den DAO-Mechanismus Record Field Exchange (DFX). Um zu helfen zu verstehen, was geschieht in der DFX-Routinen, werden die DFX_Text Funktion als Beispiel ausführlich erläutert werden. Als eine zusätzliche Informationsquelle zu diesem technischen Hinweis können Sie einfach den Code untersuchen für die anderen die einzelnen DFX-Funktionen.Sie benötigen nicht wahrscheinlich eine benutzerdefinierte DFX-Routine so oft wie Sie benötigen (mit ODBC-Datenbankklassen verwendete) eine benutzerdefinierte RFX-routine.

Diese technische Hinweis enthält:

DFX-Übersicht

Der DAO Mechanismus Record Field Exchange (DFX) wird zur Vereinfachung des Verfahrens zum Abrufen und Aktualisieren von Daten bei Verwendung der CDaoRecordset -Klasse. Der Prozess wird durch die Verwendung von Datenmember der Klasse CDaoRecordset vereinfacht. Durch Ableiten von CDaoRecordset, können Sie Daten-Member der abgeleiteten Klasse, die jedes Feld in einer Tabelle oder Abfrage hinzufügen. Dieser Mechanismus "statische Bindung" ist einfach, aber es kann nicht sein, die Daten abrufen/Update-Methode der Wahl für alle Anwendungen. DFX Ruft jedes gebundenes Feld jedes Mal, wenn der aktuelle Datensatz geändert wird. Wenn Sie eine leistungsabhängigen-Anwendung, die nicht erfordert jedes Feld abrufen entwickeln, wenn Währung geändert wird, werden möglicherweise "dynamische Bindung" über CDaoRecordset::GetFieldValue und CDaoRecordset::SetFieldValue die Methode der Wahl einer Datenzugriffsseite.

Hinweis&Nbsp;  DFX und dynamische Bindung sind nicht gegenseitig aus, so dass ein Hybrid statische und dynamische Bindung verwendet werden können.

Beispiel 1 - Verwenden von DAO-Datensatzfeldaustausch nur

(übernimmt der CDaoRecordset - Klasse abgeleiteten CMySet bereits geöffnet)

/ / Der Customers-Tabelle einen neuen Datensatz hinzufügen
MYSET.AddNew();
MYSET.m_strCustID = _T("MSFT");
MYSET.m_strCustName = _T("Microsoft");
MYSET.Update()

Beispiel 2 - Einsatz der dynamischen Bindung nur

(nimmt mit CDaoRecordset -Klasse, rs , und es ist bereits geöffnet)

/ / Der Customers-Tabelle einen neuen Datensatz hinzufügen
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / Hinweis: VT_BSTRT Fahnen Zeichenfolgentyp als A&NSI statt UNICODE Standard
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
Rs.AddNew();
Rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
Rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
Rs.Update()

Beispiel 3 - Verwendung von DAO-Datensatzfeldaustausch und dynamisches Binden

(übernimmt Mitarbeiter Suchdaten mit CDaoRecordset-Klasse abgeleitet emp )

/ / Daten des Mitarbeiters zu erhalten, damit sie angezeigt werden kann
EMP.MoveNext();

/ / Wenn Benutzer des Mitarbeiters Photographie, sehen möchte
/ / Abrufen
COleVariant VarPhoto;
Wenn (bSeePicture)
EMP.GetFieldValue(_T("photo"), VarPhoto);

/ / Daten anzeigen
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, VarPhoto)

Funktionsweise von DFX

Der DFX-Mechanismus funktioniert in ähnlicher Weise die Record Field Exchange (RFX) Mechanismus durch die MFC-ODBC-Klassen verwendet. Das Prinzip von DFX und RFX sind die gleichen, aber es gibt zahlreiche interne Unterschiede. Das Design der DFX-Funktionen war, dass praktisch alle der Code von den einzelnen DFX-Routinen geteilt wird. Auf der höchsten Ebene DFX nur tut einige Sachen.

Das Herzstück der DFX ist der Mechanismus der CDaoRecordset abgeleitete Klasse DoFieldExchange -Funktion. Diese Funktion sendet Aufrufe an die einzelnen DFX-Funktionen einen entsprechenden Vorgang Typ. Vor dem Aufruf von DoFieldExchange der internen MFC legen Funktionen den Vorgangstyp. Die folgende Liste zeigt die verschiedenen Betriebsarten und eine kurze Beschreibung.

Betrieb Beschreibung
AddToParameterList Erstellt Parameter-Klausel
AddToSelectList Baut SELECT-Klausel
BindField Bindungsstruktur richtet
BindParam Legt Parameterwerte
Fixup Legt NULL-status
AllocCache Cache reserviert für schmutzige check
StoreField Speichert aktuelle Cache
LoadField Wiederherstellungen Cache-Member-Werten
FreeCache Cache freigibt
SetFieldNull Legt Feld Status &Amp; Wert auf NULL
MarkForAddNew Marken Felder verschmutzt wenn nicht PSEUDO-NULL
MarkForEdit Marken Felder verschmutzt If Cache entsprechen nicht
SetDirtyField Legt Feld Werte als fehlerhaft gekennzeichnet

Im nächsten Abschnitt wird jeder Vorgang im Detail für DFX_Text erklärt werden.

Das wichtigste Merkmal über die DAO-Record Field Exchange-Prozess zu verstehen ist, dass es die GetRows -Funktion des ICDaoRecordset -Objekts verwendet. Die DAO GetRows -Funktion kann auf verschiedene Weise arbeiten. Diese technische Hinweis wird GetRows nur kurz beschreiben, wie es außerhalb des Umfangs dieser technische Note.

DAO GetRows kann auf verschiedene Weise arbeiten.

Was tut Ihr Custom-DFX-Routine

Es ergibt sich aus dieser Diskussion, die die wichtigste Operation implementiert in alle DFX-Funktionen die Möglichkeit zum Einrichten der erforderlichen Datenstrukturen rufen Sie die GetRowserfolgreich sein müssen. Es gibt eine Reihe von anderen Operationen, die eine DFX-Funktion auch unterstützen muss, sondern rufen Sie none als wichtig und komplex wie die GetRows richtig vorbereiten.

Die Verwendung von DFX ist in der Onlinedokumentation beschrieben. Im Wesentlichen gibt es 2 Anforderungen. Zunächst müssen der CDaoRecordset abgeleitete Klasse für jedes gebundene Feld und Parameter Member hinzugefügt werden. Nach diesem CDaoRecordset::DoFieldExchange sollte überschrieben werden. Beachten Sie, dass der Datentyp des Elements wichtig ist. Es sollte mit den Daten aus dem Feld in der Datenbank überein oder zumindest in diesen Typ konvertierbar sein. Zum Beispiel ein numerisches Feld in der Datenbank, z. B. eine Ganzzahl des Typs long, kann immer in Text konvertiert und ein CString -Mitglied verpflichtet, aber ein Textfeld in einer Datenbank kann nicht notwendigerweise in eine numerische Darstellung, wie z. B. eine lange ganze Zahl konvertiert und an eine Ganzzahl des Typs long-Mitglied gebunden. DAO und das Microsoft Jet-Datenbankmodul sind verantwortlich für die Konvertierung (statt MFC).

Informationen über DFX_Text

Wie bereits erwähnt, ist wahrscheinlich der beste Weg, um die Funktionsweise von DFX, einfach durch ein Beispiel zu arbeiten. Zu diesem Zweck sollte durchlaufen die Interna von DFX_Text ganz gut zu funktionieren, damit zumindest ein grundlegendes Verständnis von DFX eine.

AddToParameterList

Dieser Vorgang erstellt die SQL- Parameter -Klausel (" Parameters lt;param name>, <param type> ... ; ") von Jet benötigt. Jeder Parameter ist mit dem Namen und eingegeben (wie in dem RFX-Aufruf angegeben). Finden Sie die CDaoFieldExchange::AppendParamType -Funktion die Namen der einzelnen Typen sehen. Im Falle von DFX_Textwird verwendettext.

AddToSelectList

Die SQL- SELECT -Klausel erstellt. Dies ist ziemlich geradlinig, wie den Namen der Spalte angegeben, die durch den Aufruf von DFX einfach ist angehängt (" SELECT lt;column name>, ... ").

BindField

-Bei weitem die komplexen Vorgänge. Wie bereits erwähnt, dass dieses ist, wo die Bindungsstruktur DAO verwendet von GetRows eingerichtet ist. Wie Sie aus dem Code in DFX_Text sehen können gehören die Arten von Informationen in der Struktur den DAO-Typ verwendet (DAO_CHAR oder DAO_WCHAR im Fall von DFX_Text). Darüber hinaus ist der Typ der Bindung auch eingerichtet. In einem früheren Abschnitt GetRows nur kurz beschrieben wurde, aber es war ausreichend zu erklären, dass der Typ der Bindung von MFC verwendet immer direkte Ansprache Bindung (DAOBINDING_DIRECT). Darüber hinaus wird für Sonderlänge Spaltenbindung (wie DFX_Text) Rückruf Bindung verwendet, so dass MFC die Speicherreservierung zu steuern und eine Adresse die richtige Länge angeben kann. Das heißt, dass MFC kann DAO immer "wo", um die Daten, damit die Bindung direkt an die Membervariablen bringen sagen. Der Rest der Bindungsstruktur wird mit Dingen wie die Adresse der Rückruffunktion Speicher Zuweisung und den Typ der Spaltenbindung (Bindung von Spaltennamen) gefüllt.

BindParam

Dies ist eine einfache Bedienung, die SetParamValue mit dem Parameter gemäß Ihrer Parameter Member aufruft.

Fixup

Füllt den NULL -Status für jedes Feld.

SetFieldNull

Dieser Vorgang nur kennzeichnet jedes Feldstatus als NULL und das Mitglied der Variablen Wert auf PSEUDO_NULL.

SetDirtyField

SetFieldValue Aufrufe für jedes Feld fehlerhaft gekennzeichnet.

Alle verbleibenden Vorgänge befassen sich nur mit den Data-Cache. Data-Cache ist eine zusätzliche Puffer, der Daten im aktuellen Datensatz, der verwendet wird, um bestimmte Dinge einfacher. Zum Beispiel können "schmutzig" Felder automatisch erkannt werden. In der online-Dokumentation beschriebenen kann es vollständig oder in der Feldebene ausgeschaltet werden. Die Umsetzung des Puffers verwendet eine Karte. Diese Karte wird verwendet, um dynamisch zugewiesenen Kopien der Daten mit der Adresse des "gebundenen" Feld (oder Datenmember CDaoRecordset Derieved) zu vergleichen.

AllocCache

Dynamisch reserviert den zwischengespeicherten Wert und fügt es zur Karte.

FreeCache

Löscht den zwischengespeicherten Wert und entfernt es aus der Karte.

StoreField

Kopiert den Wert des aktuellen Feldes in den Data-cache.

LoadField

Kopiert den zwischengespeicherten Wert in das Feld-Element.

MarkForAddNew

Überprüft, ob der Wert des aktuellen Feldes ist nicht-NULL und Marken es schmutzig, ggf.

MarkForEdit

Vergleicht die aktuellen Feldwert mit Data-Cache und schmutzig, ggf. markiert.

Tipp&Nbsp;  Ihre benutzerdefinierten DFX-Routinen auf die vorhandenen DFX-Routinen für Standarddatentypen Model.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index