Freigeben über


TN053: Benutzerdefinierte DFX-Routinen für DAO-Datenbankklassen

HinweisHinweis

Ab Visual C++ .NET wird DAO von der Visual C++-Umgebung und den Assistenten nicht mehr unterstützt. (Die DAO-Klassen sind allerdings weiterhin enthalten und können verwendet werden.)Microsoft empfiehlt, dass Sie OLE DB-Vorlagen oder ODBC und MFC für neue Projekte verwenden.DAO sollte lediglich zur Verwaltung bereits bestehender Anwendungen eingesetzt werden.

In diesem technischen Hinweis beschreibt den Mechanismus des DAO-Datensatzfeldaustauschs (DFX).Um zu verstehen, was in den DFX-Routinen geschieht, wird die DFX_Text-Funktion ausführlich als Beispiel erläutert.Als weitere Informationsquelle zu diesem technischen Hinweis, können Sie den Code für den anderen überprüfen die einzelnen DFX-Funktionen.Sie benötigen keine benutzerdefinierte Routine DFX so häufig, wie Sie eine benutzerdefinierte Routine mit ODBC-Datenbankklassen benötigt werden (RFX).

In diesem technischen Hinweis enthält:

  • Übersicht über DFX

  • Beispiele unter Verwendung des DAO-Datensatzfeldaustauschs und der dynamischen Bindung

  • Wie arbeitet DFX

  • Was geschieht Gewohnheits-DFX der die Routine

  • Details DFX_Text

Übersicht über DFX

Der DAO-Datensatzfeldaustausch-Mechanismus (DFX) wird verwendet, um die Prozedur zum Abrufen und Aktualisieren von Daten zu vereinfachen, wenn die CDaoRecordset-Klasse verwendet.Der Prozess wird mithilfe der Datenmember der CDaoRecordset-Klasse vereinfacht.Mithilfe von CDaoRecordset ableiten, können Sie Datenmember der abgeleiteten Klasse hinzufügen, die jedes Feld in einer Tabelle oder in einer Abfrage darstellt.Dieser Mechanismus "statischer Bindungen" ist einfach, aber es ist möglicherweise nicht die Daten abruf-/die Aktualisierungsmethode der Auswahl für alle Anwendungen.DFX wird jedes gebundene Feld ab, wenn der aktuelle Datensatz geändert wird.Wenn Sie eine Leistungsoptimierung SENSITIVE-Anwendung entwickeln, die nicht das Abrufen jedes Felds ist es erforderlich, wenn Währungs-, "dynamische Bindung und CDaoRecordset::GetFieldValue " CDaoRecordset::SetFieldValue können die Datenzugriffs Methode der Auswahl.

HinweisHinweis

DFX und dynamische Bindung sind nicht gegenseitig aus, sodass eine hybride Verwendung von statischen und dynamischen Bindung verwendet werden können.

Beispiel 1: Verwendung nur DAO-Datensatzfeldaustausch

(nimmt CDaoRecordset abgeleiteten Klasse bereits CMySet Öffnen)

// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();

Beispiel 2 - Verwenden der dynamischen Bindung nur

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

// 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();

Beispiel 3: Verwenden des DAO-Datensatzfeldaustauschs und der dynamischen Bindung

(nimmt Durchsuchen employees Daten mit CDaoRecordset abgeleitete Klasse 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);

Wie arbeitet DFX

Der DFX-Mechanismus funktioniert auf ähnliche Weise auf den Datensatzfeldaustausch-Mechanismus (Record Field Exchange, RFX), das durch die MFC-ODBC-Klassen verwendet wird.Die Prinzipien von RFX und DFX sind identisch, es gibt jedoch zahlreiche interne Unterschiede.Der Entwurf der DFX-Funktionen wurde so, dass virtuell der gesamte Code durch die Routinen der einzelnen DFX freigegeben wird.Auf der obersten Ebene DFX führt nur einige Punkte aufgeführt.

  • DFX erstellt die Klausel SQL SELECT und Klausel SQL PARAMETER ggf. an.

  • DFX erstellt die Bindung von Struktur, die durch GetRows mehr verwendet wird (DAO Funktion für diesen höher).

  • DFX verwaltet den Datenpuffer, der verwendet wird, um eine modifizierte Felder erkannt (wenn doppelte Pufferung verwendet wird)

  • DFX verwaltet die NULL Arrays und DIRTY Status und die Werte bei Bedarf auf Updates.

Im Wesentlichen aus dem DFX-Mechanismus ist die Funktion DoFieldExchange abgeleiteten Klasse CDaoRecordset.Diese Funktion bietet Aufrufe an einzelnen Typs DFX-Funktionen eines entsprechenden Vorgangs aus.Bevor Sie DoFieldExchange die internen MFC-Funktionen aufgerufen haben, legen Sie den Typ des Vorgangs fest.In der folgenden Liste werden die unterschiedlichen Typen von Vorgangs und eine kurze Beschreibung an.

Vorgang

Beschreibung

AddToParameterList

PARAMETERS-Klausel Builds

AddToSelectList

Builds WÄHLEN Klausel aus

BindField

Setupe, die Struktur binden

BindParam

Legt die Parameterwerte fest

Fixup

Legt zur ungültigen Status

AllocCache

Ordnet Cache für die modifizierte Überprüfung

StoreField

Speichert aktuellen Datensatz zum Cache

LoadField

Stellt den Cache zu Werten wieder her

FreeCache

Gibt Caches frei

SetFieldNull

Auf den Status & - Feld mit dem Wert NULL zur TO

MarkForAddNew

Markiert die geänderten Felder wenn ein nicht PSEUDO-NULL

MarkForEdit

Markiert die geänderten Felder, wenn Sie Cache nicht übereinstimmen

SetDirtyField

Legt die Feldwerte fest, die als geändert

Im nächsten Abschnitt wird jeder Vorgang für DFX_Text ausführlicher erläutert.

Die wichtigste Funktion, mit der über den DAO-Datensatzfeldaustausch-Prozess zu verstehen ist, dass sie die GetRows-Funktion des CDaoRecordset-Objekts verwendet wird.Die Funktion kann auf mehrere Arten GetRows DAO arbeiten.In diesem technischen Hinweis GetRows nur kurz beschrieben, wie er außerhalb des Geltungsbereichs diesem technischen Hinweises ist.

DAO GetRows kann auf unterschiedliche Weise funktionieren.

  • Es kann mehrere Datensätze und mehrere Felder von Daten auf einmal abgefragt werden.Auf diese Weise können für einen schnelleren Datenzugriff mit der Komplikation des Beschäftigens eine umfangreiche Datenstruktur und der entsprechenden Offset zu jedem Feld und jeder Datensatz von Daten in der Struktur.MFC beansprucht diesen nicht mehrere abrufenden RekordMechanismus.

  • Eine andere Möglichkeit, die GetRows bearbeiten kann, besteht darin, können Programmierer Binding adressen für die abgerufenen Daten jedes Felds für einen Datensatz von Daten anzugeben.

  • DAO auch "ruft den Hintergrund" in den Aufrufer für Spalten variabler Längen auf, um dem Aufrufer zuzulassen, um Speicher belegen.Diese zweite Funktion hat den Vorteil Minimierens der Anzahl der Kopien von Daten sowie den Abschluss der direkten Datenspeicherung in Member einer Klasse (die CDaoRecordset abgeleitete Klasse).Dieser zweite Mechanismus besteht in der Möglichkeit MFC verwendet, um auf Datenmember in CDaoRecordset abgeleiteten Klassen zu binden.

Was geschieht Gewohnheits-DFX der die Routine

Er wird von dieser Diskussion deutlich, dass der wichtigste Vorgang, der in einer beliebigen DFX-Funktion Implementierung in der Lage sein muss, um die erforderlichen Datenstrukturen einzurichten, um GetRows erfolgreich aufzurufen.Es gibt mehrere andere Vorgänge, die eine DFX-Funktion unterstützen muss, aber auch nicht als wichtiges oder komplexes, wie ordnungsgemäß, vorbereitend für den GetRows Aufruf.

Die Verwendung von DFX wird in der Onlinedokumentation beschrieben.Im Wesentlichen gibt es zwei Anforderungen.Zuerst müssen Member zur CDaoRecordset abgeleiteten Klasse für jedes gebundene Feld und Parameter hinzugefügt werden.Danach CDaoRecordset::DoFieldExchange überschrieben werden soll.Beachten Sie, dass der Datentyp des Members wichtig ist.Er sollte die Daten aus dem Feld in der Datenbank entsprechen, oder zumindest in diesen Typ konvertierbar sein.Beispielsweise kann ein numerisches Feld in der Datenbank, z. B. einer langen ganzen Zahl konvertiert werden, immer zu einem CString-Member simsen und zu springen, sondern ein Textfeld in einer Datenbank nicht notwendigerweise wird auf eine numerische Darstellung, z. B. ganze Zahl und Long Grenze zu einem langen ganzzahligen Member konvertiert werden.DAO und das Microsoft Jet-Datenbankmodul sind verantwortlich für die Konvertierung statt (MFC).

Details DFX_Text

Wie bereits erwähnt, ist die beste Möglichkeit zur Funktionsweise erklärt, wie DFX, um ein Beispiel zu arbeiten.Zu diesem Zweck muss das Durchlaufen der internals von DFX_Text richtig ausgeführt werden, um über ein grundlegendes Verständnis von DFX mindestens bereitzustellen.

  • AddToParameterList
    Dieser Vorgang erstellt die Klausel SQL PARAMETER ("") erforderlich Parameters <param name>, <param type> ... ; von Jet.Jeder Parameter eingegeben und Namen (wie im RFX-Aufruf angegeben).Zeigen Sie die Funktion CDaoFieldExchange::AppendParamType-Funktion, um die Namen der einzelnen Typen anzuzeigen.Im Fall DFX_Text ist der verwendete Typ text.

  • AddToSelectList
    Erstellt die Klausel SQL SELECT.Dies ist Right einfach, da der Spaltenname, der vom DFX-Aufruf angegeben wird, einfach angefügt wird SELECT <column name>, ...("") eingeschlossen werden.

  • BindField
    Die meisten komplexen der Vorgänge.Wie bereits erwähnt, ist die Struktur von DAO Bindung verwendet wird, GetRows eingerichtet ist.Wie Sie den Code in DFX_Text die Typen von Informationen im Struktur gehören sehen, wurde der DAO-Typ DAO_WCHARDAO_CHAR (oder im Fall DFX_Text).Außerdem ist der Typ der Bindung verwendet ebenfalls eingerichtet.In einem vorherigen Abschnitt wurde GetRows nur kurz beschrieben, es wurde jedoch ausreichend, um zu verdeutlichen, dass der Typ der Bindung von MFC verwendet immer Bindung der Symbolleiste Adresse (DAOBINDING_DIRECT) ist.Außerdem für den Rückruf Assemblybindung der Bindung der Spalte variabler Länge (beispielsweise DFX_Text) wird verwendet, um die Speicherbelegung MFC steuern und eine Adresse der richtigen Länge angeben kann.Was dies bedeutet, ist dies immer dann mitteilen kann MFC DAO "woher die Daten abzulegen sind" und so die Bindung direkt an die Membervariablen zulässig.Der Rest der Binding Struktur wird mit der Adresse der Familie B. rückruffunktion und des Typs der Spaltenbindung Bindung gefüllt (durch Spaltennamen).

  • BindParam
    Dies ist ein einfacher Vorgang SetParamValue mit dem Parameterwert aufgerufen wird, der im Parameter angegebene Member.

  • Fixup
    Füllt den NULL Status für jedes Feld aus.

  • SetFieldNull
    Dieser Vorgang nur für jeden Status als Feld markiert NULL und legt den Wert der Membervariable zu PSEUDO_NULL fest.

  • SetDirtyField
    Ruft SetFieldValue für jedes Feld als modifizierte an.

Alle übrigen Vorgänge verarbeiten nur die Verwendung des Datencache.Der Datencache ist ein zusätzlicher Puffer der Daten im aktuellen Datensatz, der verwendet wird, um bestimmte Aufgaben zu vereinfachen.Beispiel: "modifizierte" Felder können automatisch erkannt werden.Wie in der Onlinedokumentation beschrieben kann er im Feld oder vollständig deaktiviert werden.Die Implementierung des Puffers wird eine Zuordnung.Diese Zuordnung wird verwendet, um in dynamisch zugeordnete Kopien der Daten mit der Adresse des Felds" gebundenen "(oder des abgeleiteten Datenmembers CDaoRecordset ) übereinstimmt.

  • AllocCache
    Weist dynamisch den zwischengespeicherten Wert des Felds auf und fügt ihn der Zuordnung hinzu.

  • FreeCache
    Löscht den zwischengespeicherten Feldwert und entfernt sie aus der Zuordnung.

  • StoreField
    Kopiert den aktuellen Wert des Felds im Datencache.

  • LoadField
    Kopiert den zwischengespeicherten Wert in den Feldmember.

  • MarkForAddNew
    Überprüft, ob aktueller Feldwert Nicht-NULL ist und ggf. geändert markiert.

  • MarkForEdit
    Vergleicht den aktuellen Wert des Felds mit Datencache ggf. modifiziertes und markiert.

TippTipp

Modellieren Sie die Routinen der benutzerdefinierten DFX auf den vorhandenen DFX-Routinen für standardmäßige Datentypen.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie