TN043: RFX-Routinen

Diese Applikationsschrift beschreibt die Record Field Exchange (RFX)-Architektur. Es beschreibt auch, wie Sie schreiben, ein RFX_ Verfahren.

Übersicht über Datensatzfeldaustausch

Alle Recordset-Feld-Funktionen erfolgen mit C++-Code. Es gibt keine speziellen Ressourcen oder magische Makros. Das Herz des Mechanismus ist eine virtuelle Funktion, die in jeder abgeleiteten Recordsetklasse überschrieben werden muss. Es ist immer in dieser Form gefunden.:

privatevoid CMySet::DoFieldExchange (CFieldExchange pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  Lt; Recordset Austausch Feld Typ Aufruf >
  < Recordset Austausch Funktionsaufruf >
  //}}AFX_FIELD_MAP
}

Die speziellen Format AFX Kommentare ermöglichen Klassen-Assistent zum Suchen und bearbeiten Sie den Code innerhalb dieser Funktion. Code, die nicht kompatibel mit ClassWizard ist sollte außerhalb der speziellen Format Kommentare eingefügt werden.

Im obigen Beispiel, Lt; Recordset_exchange_field_type_call > ist in Form:

pFX-≫SetFieldType(CFieldExchange::outputColumn)

und lt; recordset_exchange_function_call > ist in form:

RFX_Custom (pFX, "Spalte2", m_Col2)

Die meisten RFX_ Funktionen haben drei Argumente wie oben gezeigt, aber einige (z.B. RFX_Text und RFX_Binary) haben zusätzliche optionale Argumente.

Mehrere RFX_ können in jede DoDataExchange -Funktion aufgenommen werden.

Finden Sie unter 'afxdb.h' für eine Liste der alle Recordset-Feld Exchange Routinen mit MFC bereitgestellten.

Recordset-Feld Anrufe sind eine Art der Registrierung Speicherbereiche (in der Regel Daten Mitglieder) zum Speichern von Felddaten für eine CMySet -Klasse.

Hinweise

Recordset-Feldfunktionen sollen nur mit der CRecordset -Klasse arbeiten. Sie sind nicht benutzbar durch andere MFC-Klassen.

Anfangswerte der Daten sind festgelegt im standard C++ Konstruktor, in der Regel in einem Block mit //{{AFX_FIELD_INIT(CMylSet) und //}}AFX_FIELD_INIT Kommentare.

Jede RFX_ Funktion muss verschiedene Vorgänge, die von den schmutzigen Status des Feldes für die Archivierung in Vorbereitung auf das Feld Feld zurückgeben unterstützen.

Jede Funktion, die ruft DoFieldExchange (zum Beispiel SetFieldNull, IsFieldDirty) tut Initialisierungsschritt um den Aufruf von DoFieldExchange.

Wie funktioniert es?

Sie müssen nicht das folgende zu verstehen, um Record Field Exchange verwenden. Jedoch verstehen, wie es hinter den Kulissen funktioniert wird Ihnen helfen, Ihre eigenen Verfahren schreiben.

Die DoFieldExchange -Memberfunktion ist ähnlich wie die Memberfunktion Serialize - es ist verantwortlich für das Abrufen und Festlegen von Daten/auf Memberdaten in der Klasse von einer äußeren Form (in diesem Fall Spalten aus dem Ergebnis einer ODBC-Abfrage). Der pFX -Parameter ist der Kontext für den Datenaustausch zu tun und ist ähnlich wie die CArchive -Parameter für CObject::Serialize. Der pFX (ein CFieldExchange -Objekt) hat eine Betriebsanzeige, die ähnlich ist, aber eine Verallgemeinerung der CArchive Richtung kennzeichnen. Eine RFX-Funktion möglicherweise die folgenden Vorgänge unterstützen

Benutzer Erweiterungen

Es gibt mehrere Möglichkeiten, den Standardmechanismus RFX zu erweitern. Sie können

Hinweis&Nbsp;  Solcher Code nicht vom Klassen-Assistenten bearbeitet werden und sollte nur außerhalb der speziellen Format Kommentare verwendet werden.

Schreiben einer benutzerdefiniertes RFX

Um Ihre eigenen benutzerdefinierten RFX-Funktion zu schreiben, wird empfohlen, dass Sie eine vorhandene RFX-Funktion kopieren und ändern Sie es für Ihre eigenen Zwecke. Auswahl der richtigen RFX kopieren kann Ihre Arbeit viel einfacher. Einige RFX-Funktionen haben einige einzigartigen Eigenschaften, die Sie berücksichtigen sollten bei der Entscheidung, das kopiert.

RFX_Long und RFX_Int:

Dies sind die einfachsten RFX-Funktionen. Der Datenwert muss keine spezielle Auslegung und die Größe der Daten behoben wird.

RFX_Single und RFX_Double:

Wie RFX_Long und RFX_Int oben, diese Funktionen sind einfach und können die Standardimplementierung intensiv nutzen. Sie werden in dbflt.cpp statt dbrfx.cpp, jedoch gespeichert, Laden der Common Language Runtime unverankerte Punkt-Bibliothek nur, wenn sie explizit Verweis aktivieren.

RFX_Text und RFX_Binary:

Diese beiden Funktionen vorab einen statischen Puffer für Zeichenfolgen-/Binärdaten Informationen zuzuordnen, und müssen diese Puffer mit SQLBindCol ODBC anstelle der Registrierung registrieren &Amp; Wert. Aus diesem Grund haben diese beiden Funktionen viele besondere Fall code.

RFX_Date:

ODBC gibt Datums-und Zeitinformationen in ihren eigenen Typ TIMESTAMP_STRUCT Datenstruktur zurück. Diese Funktion ordnet einen Typ TIMESTAMP_STRUCT dynamisch als "Proxy" für Datum-Zeit-Daten senden und empfangen. Verschiedene Operationen müssen Datum und Uhrzeit Informationen zwischen dem C++- CTime -Objekts und dem Typ TIMESTAMP_STRUCT Proxy übertragen. Unnötig zu sagen, dies erschwert diese Funktion erheblich, aber es ist ein gutes Beispiel wie man einen Proxy für die Datenübertragung verwenden.

RFX_LongBinary:

Dies ist die einzige Klassenbibliothek RFX-Funktion, die Spaltenbindung nicht zum empfangen und Senden von Daten verwendet wird. Diese Funktion ignoriert die BindFieldToColumn Operation und stattdessen während des Fixup-Vorgangs, reserviert Speicherplatz zum Aufbewahren von der eingehenden Daten SQL_LONGVARCHAR oder SQL_LONGVARBINARY, dann führt einen SQLGetData-Aufruf zum Abrufen des Werts in den reservierten Speicher. Beim Vorbereiten der Datenwerte zurück an die Datenquelle (d. h. NameValue und Wert Vorgänge) zu senden, verwendet diese Funktion des ODBC-DATA_AT_EXEC-Funktionalität. Weitere Informationen zum Arbeiten mit SQL_LONGVARBINARY und SQL_LONGVARCHARs finden Sie unter technischer Hinweis 45.

Wenn Sie Ihre eigene RFX_ -Funktion zu schreiben, werden Sie oft in der Lage, CFieldExchange::Default zu verwenden, um eine bestimmte Operation implementieren. Blick auf die Umsetzung der Standard für die Operation in Frage. Wenn es Sie in Ihrer RFX_ Funktion schreiben müssten führt die Operation können Sie delegieren die CFieldExchange::Default. Beispiele für den Aufruf von CFieldExchange::Default in dbrfx.cpp finden Sie

Es ist wichtig, IsFieldType zu Beginn Ihrer RFX-Funktion aufzurufen, und kehrt sofort zurück, wenn es FALSE zurückgibt. Dieser Mechanismus hält Parameter Operationen auf OutputColumns, und umgekehrt (wie Aufrufen von BindParam für ein OutputColumn) durchgeführt werden. Darüber hinaus hält verfolgen der IsFieldType automatisch die Anzahl der OutputColumns (M_nFields) und Params (M_nParams).

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

Index