Wymiana pól rekordów: praca z kodem kreatora
Uwaga
Kreator klienta MFC ODBC nie jest dostępny w programie Visual Studio 2019 i nowszych wersjach. Nadal można ręcznie utworzyć użytkownika.
W tym temacie opisano kod, który kreator aplikacji MFC i dodawanie klasy (zgodnie z opisem w artykule Dodawanie użytkownika MFC ODBC) zapisuje w celu obsługi RFX i sposobu zmiany tego kodu.
Uwaga
Ten temat dotyczy klas pochodnych CRecordset
, z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli używasz zbiorczego pobierania wierszy, implementowana jest wymiana pól rekordów zbiorczych (Bulk RFX). Zbiorcze RFX jest podobne do RFX. Aby zrozumieć różnice, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).
Podczas tworzenia klasy zestawu rekordów za pomocą Kreatora aplikacji MFC lub Dodawania klasy kreator zapisuje następujące elementy związane z RFX na podstawie źródła danych, tabeli i kolumny wybranych w kreatorze:
Deklaracje składowych danych pól zestawu rekordów w klasie zestawu rekordów
Przesłonięcia
CRecordset::DoFieldExchange
Inicjowanie składowych danych pól zestawu rekordów w konstruktorze klasy zestawu rekordów
Deklaracje składowych danych pól
Kreatorzy zapisują deklarację klasy zestawu rekordów w pliku .h, który przypomina następujący dla klasy 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
};
Jeśli dodasz elementy członkowskie danych parametrów lub nowe elementy członkowskie danych pól powiązane samodzielnie, dodaj je po wygenerowanych przez kreatora elementach.
Zwróć również uwagę, że kreator zastępuje DoFieldExchange
funkcję składową klasy CRecordset
.
Przesłonięcia DoFieldExchange
DoFieldExchange jest sercem RFX. Platforma wywołuje DoFieldExchange
wywołania za każdym razem, gdy musi przenieść dane ze źródła danych do zestawu rekordów lub z zestawu rekordów do źródła danych. DoFieldExchange
Obsługuje również uzyskiwanie informacji o elementach członkowskich danych pól za pomocą funkcji składowych IsFieldDirty i IsFieldNull .
Następujące DoFieldExchange
zastąpienie dotyczy CSections
klasy . Kreator zapisuje funkcję w pliku .cpp dla klasy zestawu rekordów.
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);
}
Zwróć uwagę na następujące kluczowe funkcje funkcji:
Ta sekcja funkcji jest nazywana mapą pól.
Wywołanie metody ,
CFieldExchange::SetFieldType
za pośrednictwempFX
wskaźnika. To wywołanie określa, że wszystkie funkcje RFX wywołuje do końcaDoFieldExchange
lub następnego wywołania, abySetFieldType
to kolumny wyjściowe. Aby uzyskać więcej informacji, zobacz CFieldExchange::SetFieldType.Kilka wywołań funkcji globalnej
RFX_Text
— jeden na element członkowski danych pola (wszystkie z nich sąCString
zmiennymi w przykładzie). Te wywołania określają relację między nazwą kolumny w źródle danych a elementem członkowskim danych pól. Funkcje RFX wykonują rzeczywisty transfer danych. Biblioteka klas dostarcza funkcje RFX dla wszystkich typowych typów danych. Aby uzyskać więcej informacji na temat funkcji RFX, zobacz Wymiana pól rekordów: korzystanie z funkcji RFX.Uwaga
Kolejność kolumn w zestawie wyników musi być zgodna z kolejnością wywołań funkcji RFX w pliku
DoFieldExchange
.Wskaźnik
pFX
do obiektu CFieldExchange , który struktura przechodzi po wywołaniuDoFieldExchange
metody . ObiektCFieldExchange
określa operację, któraDoFieldExchange
ma być wykonywana, kierunek transferu i inne informacje kontekstowe.
Konstruktor zestawu rekordów
Konstruktor zestawu rekordów, który pisze kreatory, zawiera dwie elementy związane z RFX:
Inicjowanie dla każdego elementu członkowskiego danych pól
Inicjowanie elementu członkowskiego danych m_nFields zawierającego liczbę składowych danych pól
Konstruktor przykładu CSections
zestawu rekordów wygląda następująco:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Uwaga
Jeśli ręcznie dodasz jakiekolwiek elementy członkowskie danych pól, tak jak w przypadku dynamicznego powiązania nowych kolumn, musisz zwiększyć m_nFields
wartość . W tym celu dołącz kolejny wiersz kodu, taki jak:
m_nFields += 3;
Jest to kod dodawania trzech nowych pól. Jeśli dodasz jakiekolwiek składowe danych parametrów, musisz zainicjować element członkowski danych m_nParams zawierający liczbę składowych danych parametrów. Umieść inicjację m_nParams
poza nawiasami kwadratowymi.