Datensatzfeldaustausch: Arbeiten mit Assistenten-Code
Hinweis
Der MFC-ODBC-Consumer-Assistent ist in Visual Studio 2019 und höher nicht verfügbar. Sie können einen Consumer weiterhin manuell erstellen.
In diesem Thema wird der Code erläutert, den der MFC-Anwendungs-Assistent und Klasse hinzufügen (wie unter Hinzufügen eines MFC-ODBC-Consumers beschrieben) zur Unterstützung von RFX schreiben, und wird erläutert, wie Sie diesen Code ändern können.
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).
Wenn Sie eine Recordset-Klasse mit dem MFC-Anwendungs-Assistenten oder mit Klasse hinzufügen erstellen, schreibt der Assistent die folgenden RFX-bezogenen Elemente anhand der Datenquelle, der Tabelle und der Spalten, die Sie im Assistenten ausgewählt haben:
Deklarationen der Recordset-Felddatenmember in der Recordset-Klasse
Eine Überschreibung von
CRecordset::DoFieldExchange
Initialisierung von Recordset-Felddatenmemberm im Konstruktor der Recordset-Klasse
Felddatenelementdeklarationen
Die Assistenten schreiben Sie die Deklaration einer Recordset-Klasse in eine .h-Datei, die so ähnlich aussieht wie die folgende für die Klasse CSections
:
class CSections : public CRecordset
{
public:
CSections(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CSections)
// Field/Param Data
CString m_strCourseID;
CString m_strInstructorID;
CString m_strRoomNo;
CString m_strSchedule;
CString m_strSectionNo;
// Overrides
// Wizard generated virtual function overrides
protected:
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};
Wenn Sie Parameterdatenmember oder neue Felddatenmember hinzufügen, die Sie selbst binden, fügen Sie diese nach denjenigen hinzu, die vom Assistenten generiert wurden.
Beachten Sie außerdem, dass der Assistent die DoFieldExchange
-Memberfunktion der Klasse CRecordset
überschreibt.
DoFieldExchange-Außerkraftsetzung
DoFieldExchange ist das Herzstück von RFX. Das Framework ruft DoFieldExchange
jedes Mal auf, wenn es entweder Daten aus der Datenquelle in das Recordset oder aus dem Recordset in die Datenquelle verschieben muss. DoFieldExchange
unterstützt außerdem das Abrufen von Informationen zu Felddatenmembern über die Memberfunktionen IsFieldDirty und IsFieldNull.
Die folgende DoFieldExchange
-Überschreibung gilt für die CSections
-Klasse. Der Assistent schreibt die Funktion in der CPP-Datei für Ihre Recordset-Klasse.
void CSections::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Text(pFX, "RoomNo", m_strRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Text(pFX, "SectionNo", m_strSectionNo);
}
Beachten Sie die folgenden Hauptmerkmale der Funktion:
Dieser Abschnitt der Funktion wird als Feldzuordnung bezeichnet.
Ein Aufruf von
CFieldExchange::SetFieldType
über denpFX
-Zeiger. Dieser Aufruf gibt an, dass alle RFX-Funktionsaufrufe bis zum Ende vonDoFieldExchange
oder bis zum nächsten Aufruf vonSetFieldType
Ausgabespalten sind. Weitere Informationen hierzu finden Sie unter CFieldExchange::SetFieldType.Mehrere Aufrufe der globalen Funktion
RFX_Text
: jeweils einer pro Felddatenmember (die alleCString
-Variablen im Beispiel sind). Diese Aufrufe geben die Beziehung zwischen dem Namen einer Spalte in der Datenquelle und einem Felddatenmember an. Die RFX-Funktionen übernehmen die tatsächliche Datenübertragung. Die Klassenbibliothek stellt RFX-Funktionen für alle gängigen Datentypen bereit. Weitere Informationen zu RFX-Funktionen finden Sie unter Record Field Exchange: Using the RFX Functions.Hinweis
Die Reihenfolge der Spalten in Ihrem Resultset muss mit der Reihenfolge der RFX-Funktionsaufrufe in
DoFieldExchange
übereinstimmen.Der
pFX
-Zeiger auf ein CFieldExchange-Objekt, das vom Framework übergeben wird, wenn esDoFieldExchange
aufruft. DasCFieldExchange
-Objekt gibt den Vorgang, denDoFieldExchange
ausführen soll, die Richtung der Übertragung und weitere Kontextinformationen an.
Recordset-Konstruktor
Der Recordset-Konstruktor, den die Assistenten schreiben, enthält zwei Dinge im Zusammenhang mit RFX:
Eine Initialisierung für jeden Felddatenmeber
Eine Initialisierung für den m_nFields-Datenmember, der die Anzahl der Felddatenmember enthält
Der Konstruktor für das CSections
-Recordset-Beispiel sieht wie folgt aus:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Hinweis
Wenn Sie neue Felddatenmember manuell hinzufügen, wie dies der Fall ist, wenn Sie neue Spalten dynamisch binden, müssen Sie m_nFields
inkrementieren. Fügen Sie dazu eine neue Codezeile an, etwa:
m_nFields += 3;
Dies ist der Code für ein Hinzufügen von drei neuen Feldern. Wenn Sie Parameterdatenmember hinzufügen, müssen Sie den m_nParams-Datenmember initialisieren, der die Anzahl der Parameterdatenmember enthält. Platzieren Sie die m_nParams
-Initialisierung außerhalb der Klammern.