TN053: Benutzerdefinierte DFX-Routinen für DAO-Datenbankklassen
Hinweis |
---|
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.
Hinweis |
---|
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.
Tipp |
---|
Modellieren Sie die Routinen der benutzerdefinierten DFX auf den vorhandenen DFX-Routinen für standardmäßige Datentypen. |