Výměna pole záznamu (Record Field Exchange - RFX): Práce s kódem průvodce
Toto téma vysvětluje kód, který zapíšou Průvodce aplikace knihovny MFC a Přidat třídu (jak je popsáno v Přidání příjemce knihovny MFC rozhraní ODBC) k podpoře RFX a jak můžete změnit kód.
Poznámka
Toto téma se týká tříd odvozených z třídy CRecordset, ve které nebylo naimplementováno hromadné načítání řádku. Je naimplementována hromadná výměna pole záznamu (Bulk RFX), pokud používáte hromadné načítání řádku. Funkce hromadné výměny pole záznamu (Bulk RFX) je podobná funkci výměny pole záznamu (RFX). Chcete-li porozumět rozdílům, přečtěte si téma Sada záznamů: Hromadné načítání záznamů (rozhraní ODBC).
Když vytvoříte třídu sady záznamů s Průvodcem aplikace knihovny MFC nebo s Přidat třídu, zapíše průvodce následující prvky související s RFX, založené na volbě zdroje dat, tabulky a sloupce, provedené v průvodci:
Deklarace sady záznamů pole datových členů ve třídě sady záznamů
Přepsání CRecordset::DoFieldExchange
Inicializace sady záznamů pole datových členů v konstruktoru třídy sady záznamů
Deklarace pole datového člena
Průvodci zapíše deklaraci třídy sady záznamů v souboru .h, která se podobá následujícímu pro třídu 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
};
Přidáte-li parametr datových členů nebo nové pole datových členů, které navážete sami, můžete je přidat po vygenerování průvodcem.
Všimněte si také, že průvodce přepíše členskou funkci DoFieldExchange třídy CRecordset.
Přepsání DoFieldExchange
DoFieldExchange je jádrem RFX. Architektura volá DoFieldExchange kdykoli je třeba přesunout data ze zdroje dat do sady záznamů nebo ze sady záznamů do zdroje dat. DoFieldExchange také podporuje získávání informací o poli datových členů, prostřednictvím členských funkcí IsFieldDirty a IsFieldNull.
Následující přepsání DoFieldExchange je pro třídu CSections. Průvodce zapíše funkci v soubru .cpp pro vaší třídu sady záznamů.
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);
}
Všimněte si následujících klíčových funkcí této funkce:
Tato část funkce se nazývá mapa pole.
Volání CFieldExchange::SetFieldType, prostřednictvím ukazatele pFX. Toto volání určuje, že všechna volání RFX funkce vyžadují konec DoFieldExchange nebo další volání SetFieldType jsou výstupní sloupce. Další informace naleznete v tématu CFieldExchange::SetFieldType.
Několik volání globální funkceRFX_Text – každé pro pole datového člena (všechny, které jsou proměnné CString v příkladu). Tato volání určují relaci mezi názvem sloupce ve zdroji dat a polem datového člen. Funkce RFX provádějí skutečný přenos dat. Knihovna tříd poskytuje funkce RFX pro všechny běžné datové typy. Další informace o RFX funkcích naleznete v tématu Výměna pole záznamu: Pomocí funkcí výměny pole záznamu (RFX).
Poznámka
Pořadí sloupců ve vaší sadě výsledků dotazu musí odpovídat pořadí volání RFX funkce v DoFieldExchange.
Ukazatel pFX na objekt CFieldExchange, který předává architektura při volání DoFieldExchange. Objekt CFieldExchange určuje operaci, která je provedena DoFieldExchange, směr přenosu a další informace o kontextu.
Konstruktor sady záznamů
Konstruktor sady záznamů, který zapíše průvodce, obsahuje dvě věci týkající se RFX:
Inicializaci pro každé pole datového člena
Inicializaci pro datového člena m_nFields, který obsahuje číslo pole datových členů
Konstruktor pro sadu záznamů CSections příklad vypadá takto:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Poznámka
Přidáte-li ručně jakékoliv pole datových členů, jak můžete, pokud svážete dynamicky nové sloupce, budete muset zvýšit m_nFields. Tak učiníte přidáním další řádky kódu, jako například:
m_nFields += 3;
Toto je kód pro přidání tří nových polí. Přidáte-li jakýkoliv parametr datových členů, je třeba inicializovat datového člena m_nParams, který obsahuje počet parametrů datových členů. Umístěte inicializaci m_nParams mimo závorky.