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 Updatezu 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:

  1. Der Aufruf der AddNew- oder Edit-Memberfunktion des Recordsets bewirkt, dass RFX den aktuellen Bearbeitungspuffer speichert, damit er später wiederhergestellt werden kann.

  2. AddNew oder Edit 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 aufrufen Update, 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ür Edit den Aufruf vergleicht der Update Aufruf AddNewaktualisierte Werte mit zuvor gespeicherten Werten, anstatt PSEUDO_NULL zu verwenden. Der Unterschied besteht darin, dass AddNew keine zuvor gespeicherten Werte für den Vergleich vorhanden sind.

  3. 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 SetFieldNullgehören.

  4. 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.

  5. Update Endet mit AddNewdem Wiederherstellen der zuvor gespeicherten Werte des Datensatzes, der vor dem AddNew Aufruf aktuell war. For Edit, the new, edited values re Standard place.

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 AddNewSie für den Bearbeitungspuffer den gesicherten Inhalt wieder her. Löschen EditSie 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