Udostępnij za pośrednictwem


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::SetFieldTypeza pośrednictwem pFX wskaźnika. To wywołanie określa, że wszystkie funkcje RFX wywołuje do końca DoFieldExchange lub następnego wywołania, aby SetFieldType 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łaniu DoFieldExchangemetody . Obiekt CFieldExchange określa operację, która DoFieldExchange 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_nFieldswartość . 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.

Zobacz też

Wymiana pól rekordów (RFX)