Freigeben über


TN043: RFX-Routinen

HinweisHinweis

Im Folgenden technischen Hinweis ist nicht aktualisiert wurde, seitdem er erstmals in der Onlinedokumentation enthalten waren.Folglich können mehrere Prozeduren und Themen veraltet oder falsch.Die aktuellsten Informationen wird empfohlen, zum Thema Onlinedokumentations im Index finden.

Dieser Hinweis wird die Architektur des Datensatzfeldaustauschs (RFX).Außerdem wird beschrieben, wie Sie eine RFX_ Prozedur schreiben.

Übersicht des Datensatzfeldaustauschs

Alle Funktionen sind in C++-Code Feld Recordset.Es gibt keine besonderen Ressourcen oder Magic Makros.Das Kernstück des Mechanismus ist eine virtuelle Funktion, die in jeder abgeleitete Recordset-Klasse außer Kraft gesetzt werden muss.Es wird immer in dieser Form gefunden:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  <recordset exchange field type call>
  <recordset exchange function call>
  //}}AFX_FIELD_MAP
}

Die besonderen Format AFX-Kommentare ermöglichen ClassWizard, um den Code innerhalb dieser Funktion zu suchen und zu bearbeiten.Code, der nicht mit ClassWizard kompatibel ist, sollte außerhalb der speziellen Formats Kommentare platziert werden.

Im obigen Beispiel ist <recordset_exchange_field_type_call> in der Form:

pFX->SetFieldType(CFieldExchange::outputColumn);

<recordset_exchange_function_call> und ist in der Form:

RFX_Custom(pFX, "Col2", m_Col2);

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

Mehr als ein RFX_ möglicherweise wird in jeder DoDataExchange-Funktion eingeschlossen.

Siehe "afxdb.h" für eine Liste aller Recordsets feld-Austausch routinen, die mit MFC bereitgestellt werden.

Recordsets stehen im Feld ruft eine Methode des Registrierens von Speicheradressen (normalerweise Datenmember), um Felddaten für eine CMySet-Klasse zu speichern.

Hinweise

Funktionen sind im Feld Recordset sollen nur mit den CRecordset-Klassen zu arbeiten.Sie sind im Allgemeinen nicht von einem anderen MFC-Klassen verwendet werden.

Anfangswerte von Daten werden im Standard-C++-Konstruktor, normalerweise in einem Block mit //{{AFX_FIELD_INIT(CMylSet) und //}}AFX_FIELD_INIT Kommentaren festgelegt.

Jede RFX_-Funktion muss die verschiedenen Vorgänge unterstützen und dem Zurückgeben des geänderten Status des Felds bis zum Archivieren des Felds Vorbereitung für das Bearbeiten des Felds liegen.

Jede Funktion, die DoFieldExchange (z SetFieldNull, IsFieldDirty) aufruft, führt eine eigene Initialisierung um den Aufruf von DoFieldExchange.

Wie funktioniert sie?

Sie müssen Folgendes zu verstehen, um Datensatzfeldaustausch zu verwenden.Allerdings unterstützt das Sie wissen, wie diese hinter den Kulissen funktioniert, Sie Vermittlungsstelle eigenen der die Prozedur zu gewähren.

Die DoFieldExchange-Memberfunktion ist ähnlich wie die Serialize — Memberfunktion steht zum Abrufen oder Festlegen von Daten zu/von einem externen Format (in diesem Fall Spalten aus dem Ergebnis einer ODBC-Abfrage/) von Daten nach Member in der Klasse verantwortlich.Der pFX-Parameter ist der Kontext für das diese Daten des austausches und entspricht dem CArchive-Parameter in CObject::Serialize vergleichbar.pFX (ein CFieldExchange-Objekt) verfügt über einen Indikator für den Vorgang ähnelt, der jedoch eine Generalisierung des CArchive Richtungs Flags.Eine RFX-Funktion muss möglicherweise die folgenden Vorgänge unterstützen:

  • BindParam — Gibt an, wo der Parameterdaten abrufen soll

  • BindFieldToColumn — Gibt an, wo ODBC Einzahlung/abrufen muss outputColumn Daten

  • Fixup — festgelegte CString/CByteArray Länge Null, Statusbit des Satzes

  • MarkForAddNew — Marke geändert, wenn sich der Wert geändert hat AddNew-Aufruf da

  • MarkForUpdate — Marke geändert, wenn seit dem Aufruf Bearbeiten Wert geändert wurde.

  • Fügen Sie Name — modifiziertes markierte Felder für Feldnamen an

  • Fügen Sie NameValue —<Spaltenname>= "?" modifiziertes als für Felder

  • Fügen Sie der Wert "?" worauf ggf. Trennzeichen, z "," oder ''

  • SetFieldDirty — geändert Statusbit festgelegt wird (d. h.geänderte Feld)

  • SetFieldNull — Menge Statusbit NULL-Wert für das Feld angibt

  • IsFieldDirty Rückgabewert des geänderten Statusbits

  • Statusbits IsFieldNull Rückgabewert des NULL

  • IsFieldNullable — Rückhol-TRUE, wenn das Feld NULL-Werte enthalten kann

  • StoreField — Archivfeldwert

  • LoadField — Lädt archivierter Feldwert

  • GetFieldInfoValue — allgemeine RückholInformationen über ein Feld

  • GetFieldInfoOrdinal — allgemeine RückholInformationen über ein Feld

Benutzer-Erweiterungen

Es gibt mehrere Möglichkeiten, den Mechanismus des Standardwerts RFX zu erweitern.Können Sie

  • Fügen Sie neue Datentypen hinzu.Beispiele:

    CBookmark
    
  • Hinzufügen von neuen Austausch Prozeduren (RFX_???).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Haben Sie die zusätzlichen RFX DoFieldExchange-Memberfunktion bedingt Aufrufe Zu oder alle anderen gültigen C++-Anweisungen.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX, m_listName.GetNext(posExtraFields), 
            m_listValue.GetNext(posExtraValues));
    }
    
HinweisHinweis

Solcher Code kann nicht durch ClassWizard bearbeitet und sollte nur außerhalb der speziellen Formats Kommentare verwendet werden.

Eine benutzerdefinierte RFX schreiben

Um eine eigene benutzerdefinierte RFX-Funktion zu schreiben, wird empfohlen, dass Sie eine vorhandene RFX-Funktion kopieren und in Ihren eigenen Zwecke ändern.Durch Auswahl des Rechts RFX zu kopieren kann den Auftrag viel einfacher machen.Einige RFX-Funktionen haben einige besondere Eigenschaften, die Sie beachten sollten, wenn Entscheiden, das kopiert werden soll.

  • RFX_Long and RFX_Int:
    Dies sind die einfachsten RFX-Funktionen.Der Datenwert ist keine spezielle Interpretation und die Datengröße wurde korrigiert.

  • RFX_Single and RFX_Double:
    Wie oben RFX_Int und RFX_Long, sind diese Funktionen. Sie können einfach die Standardimplementierung umfassend.Sie werden in dbflt.cpp jedoch anstelle dbrfx.cpp gespeichert gleitkomma das Laden der Common Language Runtime Library zu aktivieren, wenn sie nur explizit Verweis sind.

  • RFX_Text and RFX_Binary:
    Diese beiden Funktionen weisen einen statischen Puffer zu, um Zeichenfolge bzw. binäre Informationen zu speichern und müssen diese Puffer mit ODBC SQLBindCol registrieren, anstatt &value zu registrieren.Aus diesem Grund verfügen diese zwei Funktionen viele Insbesondere CASE-Code.

  • RFX_Date:
    ODBC gibt Datums- und Uhrzeitinformationen normalerweise in einer eigenen TIMESTAMP_STRUCT-Datenstruktur zurück.Diese Funktion weist ein dynamisch als "Proxy" TIMESTAMP_STRUCT zum Senden und Empfangen von Datum-Zeit-Daten.Verschiedene Vorgänge müssen die Datums- und Uhrzeitinformationen zwischen dem Objekt und dem CTime C++ TIMESTAMP_STRUCT-Proxy übertragen.Dies erschwert diese Funktion erheblich, aber es ist ein gutes Beispiel dafür, wie Sie einen Proxy für die Datenübertragung verwendet.

  • RFX_LongBinary:
    Dies ist die einzige Klassenbibliothek RFX-Funktion, die keine Spaltenbindung verwendet, um Daten zu empfangen und zu senden.Diese Funktion ignoriert und stattdessen den BindFieldToColumn-Vorgang, während des Vorgangs Fixup Speicher zuordnet, die eingehenden SQL_LONGVARCHAR- oder SQL_LONGVARBINARY-Daten SQLGetData-Aufruf einen ausführt, Anhalten, um den Wert in den zugeordneten Speicher abzurufen.Beim Vorbereiten, Datenwerte zurück an die Datenquelle zu senden (z) und des Werts NameValue Vorgängen verwendet diese Funktion DATA_AT_EXEC-Funktionalität ODBC.Weitere Informationen finden Sie unter Technischer Hinweis 45 Weitere Informationen zum Arbeiten mit SQL_LONGVARBINARY und SQL_LONGVARCHARs.

Wenn Sie eine eigene RFX_-Funktion schreiben, ist es häufig in der Lage, CFieldExchange::Default verwenden, um einen bestimmten Vorgang zu implementieren.Beachten Sie die Implementierung des Standardwerts nach dem betreffenden Vorgang.Bei der den Vorgang ausführt, würden Sie in der RFX_-Funktion schreiben, die Sie CFieldExchange::Default. delegieren können Sie können in CFieldExchange::Default des Aufrufs von Beispielen finden dbrfx.cpp

Es ist wichtig, IsFieldType am Anfang einer RFX-Funktion aufzurufen und wird sofort beendet, wenn er FALSE zurückgibt.Dieser Mechanismus kann Parameter auf outputColumns Vorgänge ausgeführt werden und umgekehrt (z. B. das Aufrufen von BindParam auf outputColumn).Außerdem behält IsFieldType automatisch die Anzahl der outputColumns (m_nFields) und der Parameter im Auge (m_nParams).

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie