Datensatzfeldaustausch: Funktionsweise von RFX
In diesem Thema wird der RFX-Prozess erläutert. Dies ist ein erweitertes Thema, das folgendes behandelt:
Hinweis
Dieses Thema bezieht sich auf aus CRecordset
abgeleitete Klassen, in denen gesammeltes Abrufen (Massenabrufen) von Zeilen nicht implementiert wurde. Wenn Sie Massenabrufen von Zeilen verwenden, wird der Massen-Datensatzfeldaustausch (Bulk-RFX) implementiert. Bulk-RFX ist RFX sehr ähnlich. Informationen zu den Unterschieden finden Sie unter Recordset: Abrufen von Datensätzen in Massen (ODBC).
RFX und das Recordset
Die Felddatenmember des Recordset-Objekts bilden einen Bearbeitungspuffer, der die ausgewählten Spalten eines Datensatzes enthält. Wenn das Recordset zum ersten Mal geöffnet wird und der erste Datensatz gelesen werden soll, bindet RFX jede ausgewählte Spalte an die Adresse des entsprechenden Felddatenelements(n). Wenn das Recordset einen Datensatz aktualisiert, ruft RFX ODBC-API-Funktionen auf, um eine SQL UPDATE - oder INSERT-Anweisung an den Treiber zu senden. RFX verwendet sein Wissen über die Felddatenmber, um die zu schreibenden Spalten anzugeben.
Das Framework sichert den Bearbeitungspuffer in bestimmten Phasen, damit er den Inhalt bei Bedarf wiederherstellen kann. RFX sichert den Bearbeitungspuffer vor dem Hinzufügen eines neuen Datensatzes und vor dem Bearbeiten eines vorhandenen Datensatzes. Er stellt den Bearbeitungspuffer in einigen Fällen wieder her, z. B. nach einem Update
Aufruf:AddNew
Der Bearbeitungspuffer wird nicht wiederhergestellt, wenn Sie einen neu geänderten Bearbeitungspuffer abbrechen, indem Sie beispielsweise vor dem Aufrufen Update
zu einem anderen Datensatz wechseln.
Neben dem Austausch von Daten zwischen der Datenquelle und den Felddatenelementen des Recordsets verwaltet RFX Bindungsparameter. Wenn das Recordset geöffnet wird, werden alle Parameterdatenmber in der Reihenfolge der Platzhalter "?" in der SQL-Anweisung gebunden, die CRecordset::Open
erstellt wird. Weitere Informationen finden Sie unter "Recordset: Parametrisieren eines Recordset (ODBC)".
Die Außerkraftsetzung DoFieldExchange
Ihrer Recordsetklasse erledigt alle Aufgaben und verschiebt Daten in beide Richtungen. Wie Dialogdatenaustausch (Dialog Data Exchange, DDX) benötigt RFX Informationen zu den Datenmitgliedern Ihrer Klasse. Der Assistent stellt die erforderlichen Informationen bereit, indem eine recordsetspezifische Implementierung DoFieldExchange
für Sie erstellt wird, basierend auf den Felddatenelementnamen und Datentypen, die Sie mit dem Assistenten angeben.
Datensatzfeld-Exchange-Prozess
In diesem Abschnitt wird die Abfolge von RFX-Ereignissen beschrieben, wenn ein Recordsetobjekt geöffnet wird, und während Sie Datensätze hinzufügen, aktualisieren und löschen. Die Tabelle Sequence of RFX Operations During Recordset Open and the table Sequence of RFX Operations During Scrolling in this topic show the process as RFX process a Move
command in the recordset and as RFX manage an update. Während dieser Prozesse wird DoFieldExchange aufgerufen, um viele verschiedene Vorgänge auszuführen. Das m_nOperation
Datenmemm des CFieldExchange-Objekts bestimmt, welcher Vorgang angefordert wird. Möglicherweise ist es hilfreich, Recordset zu lesen : How Recordsets Select Records (ODBC) und Recordset: How Recordsets Update Records (ODBC) before you read this material.
RFX: Anfängliche Bindung von Spalten und Parametern
Die folgenden RFX-Aktivitäten treten in der angezeigten Reihenfolge auf, wenn Sie die Open-Memberfunktion eines Recordset-Objekts aufrufen:
Wenn das Recordset Parameterdatenmber enthält, ruft
DoFieldExchange
das Framework die Parameter an Parameterplatzhalter in der SQL-Anweisungszeichenfolge des Recordsets an. Eine datentypabhängige Darstellung des Werts des Parameters wird für jeden Platzhalter verwendet, der in der SELECT-Anweisung zu finden ist. Dies tritt auf, nachdem die SQL-Anweisung vorbereitet wurde, aber bevor sie ausgeführt wird. Informationen zur Anweisungsvorbereitung finden Sie in der::SQLPrepare
Funktion in der ODBC-Programmierreferenz.Das Framework ruft
DoFieldExchange
ein zweites Mal auf, um die Werte der ausgewählten Spalten an die entsprechenden Felddatenmember im Recordset zu binden. Dadurch wird das Recordset-Objekt als Bearbeitungspuffer festgelegt, der die Spalten des ersten Datensatzes enthält.Das Recordset führt die SQL-Anweisung aus, und die Datenquelle wählt den ersten Datensatz aus. Die Spalten des Datensatzes werden in die Felddatenmber des Recordsets geladen.
Die folgende Tabelle zeigt die Abfolge von RFX-Vorgängen, wenn Sie ein Recordset öffnen.
Sequenz von RFX-Vorgängen während des Öffnens des Recordsets
Bei Ihrem Vorgang | DoFieldExchange-Vorgang | Datenbank-/SQL-Vorgang |
---|---|---|
1. Open recordset. | ||
2. Erstellen Sie eine SQL-Anweisung. | ||
3. Senden Sie sql. | ||
4. Binden von Parameterdatenelementen. | ||
5. Binden Sie Felddatenmber an Spalten. | ||
6. ODBC führt die Verschiebung durch und füllt die Daten aus. | ||
7. Korrigieren Sie die Daten für C++. |
Recordsets verwenden die vorbereitete Ausführung von ODBC, um schnelle erneute Abfragen mit derselben SQL-Anweisung zu ermöglichen. Weitere Informationen zur vorbereiteten Ausführung finden Sie in der ODBC-Programmierreferenz.
RFX: Scrollen
Wenn Sie von einem Datensatz zu einem anderen scrollen, ruft DoFieldExchange
das Framework auf, die zuvor in den Felddatenelementen gespeicherten Werte durch Werte für den neuen Datensatz zu ersetzen.
Die folgende Tabelle zeigt die Abfolge von RFX-Vorgängen, wenn der Benutzer von Datensatz zu Datensatz wechselt.
Sequenz von RFX-Vorgängen während des Bildlaufs
Bei Ihrem Vorgang | DoFieldExchange-Vorgang | Datenbank-/SQL-Vorgang |
---|---|---|
1. Rufen Sie MoveNext eine der anderen Verschieben-Funktionen auf. |
||
2. ODBC führt die Verschiebung durch und füllt die Daten aus. | ||
3. Korrigieren Sie die Daten für C++. |
RFX: Hinzufügen neuer Datensätze und Bearbeiten vorhandener Datensätze
Wenn Sie einen neuen Datensatz hinzufügen, fungiert das Recordset als Bearbeitungspuffer, um den Inhalt des neuen Datensatzes zu erstellen. Wie beim Hinzufügen von Datensätzen müssen beim Bearbeiten von Datensätzen die Werte der Felddatenmber des Recordsets geändert werden. Aus RFX-Perspektive lautet die Sequenz wie folgt:
Der Aufruf der AddNew- oder Edit-Memberfunktion des Recordsets bewirkt, dass RFX den aktuellen Bearbeitungspuffer speichert, damit er später wiederhergestellt werden kann.
AddNew
oderEdit
bereitet die Felder im Bearbeitungspuffer vor, damit RFX geänderte Felddatenmber erkennen kann.Da ein neuer Datensatz keine vorherigen Werte enthält, mit denen neue verglichen werden sollen,
AddNew
wird der Wert jedes Felddatenelements auf einen PSEUDO_NULL Wert festgelegt. Wenn Sie später aufrufenUpdate
, vergleicht RFX den Wert jedes Datenelements mit dem PSEUDO_NULL Wert. Wenn ein Unterschied besteht, wurde das Datenelement festgelegt. (PSEUDO_NULL ist nicht identisch mit einer Datensatzspalte mit einem true Null-Wert oder ist eines der gleichen wie C++ NULL.)Update
Im Gegensatz zum Aufruf fürEdit
den Aufruf vergleicht derUpdate
AufrufAddNew
aktualisierte Werte mit zuvor gespeicherten Werten, anstatt PSEUDO_NULL zu verwenden. Der Unterschied besteht darin, dassAddNew
keine zuvor gespeicherten Werte für den Vergleich vorhanden sind.Sie legen die Werte der Felddatenmember direkt fest, deren Werte Sie bearbeiten oder für einen neuen Datensatz ausfüllen möchten. Dazu kann das Aufrufen
SetFieldNull
gehören.Ihr Aufruf zum Aktualisieren sucht nach geänderten Felddatenelementen, wie in Schritt 2 beschrieben (siehe Tabelle Sequence of RFX Operations During Scrolling). Wenn sich keine geändert hat,
Update
wird 0 zurückgegeben. Wenn sich einige Felddatenmember geändert haben, wird eine SQL INSERT-Anweisung vorbereitet und ausgeführt,Update
die Werte für alle aktualisierten Felder im Datensatz enthält.Update
Endet mitAddNew
dem Wiederherstellen der zuvor gespeicherten Werte des Datensatzes, der vor demAddNew
Aufruf aktuell war. FürEdit
, die neuen, bearbeiteten Werte bleiben vorhanden.
Die folgende Tabelle zeigt die Abfolge von RFX-Vorgängen, wenn Sie einen neuen Datensatz hinzufügen oder einen vorhandenen Datensatz bearbeiten.
Sequenz von RFX-Vorgängen während addNew und Edit
Bei Ihrem Vorgang | DoFieldExchange-Vorgang | Datenbank-/SQL-Vorgang |
---|---|---|
1. Anrufen AddNew oder Edit . |
||
2. Sichern Sie den Bearbeitungspuffer. | ||
3. Markieren Sie Für AddNew , Felddatenmmber als "sauber" und "Null". |
||
4. Weisen Sie Datensätzen Felddatenmber Werte zu. | ||
5. Anruf Update . |
||
6. Suchen Sie nach geänderten Feldern. | ||
7. Erstellen Sie sql INSERT-Anweisung für AddNew oder UPDATE-Anweisung für Edit . |
||
8. Senden Sie sql. | ||
9. Stellen AddNew Sie für den Bearbeitungspuffer den gesicherten Inhalt wieder her. Löschen Edit Sie für , löschen Sie die Sicherung. |
RFX: Löschen vorhandener Datensätze
Wenn Sie einen Datensatz löschen, legt RFX alle Felder auf NULL fest, als Erinnerung, dass der Datensatz gelöscht wird, und Sie müssen ihn deaktivieren. Sie benötigen keine weiteren RFX-Sequenzinformationen.
Siehe auch
Datensatzfeldaustausch (RFX)
Nutzen von MFC-ODBC
Makros, globale Funktionen und globale Variablen
CFieldExchange-Klasse
CRecordset::D oFieldExchange