Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
De wizard MFC ODBC Consumer is niet beschikbaar in Visual Studio 2019 en hoger. U kunt nog steeds handmatig een consument maken.
In dit onderwerp wordt de code uitgelegd die de MFC-toepassingswizard en Class toevoegen (zoals beschreven in een MFC ODBC-consumer toevoegen) schrijven om RFX (Record Field Exchange) te ondersteunen en hoe u die code eventueel wilt aanpassen.
Opmerking
Dit onderwerp is van toepassing op klassen die zijn afgeleid van CRecordset, waarin het ophalen van bulkrijen niet is geïmplementeerd. Als u bulksgewijs rijen ophalen gebruikt, wordt bulkrecordvelduitwisseling (Bulk RFX) geïmplementeerd. Bulk RFX is vergelijkbaar met RFX. Zie Recordset: Records in bulk ophalen (ODBC) om de verschillen te begrijpen.
Wanneer u een recordsetklasse maakt met de wizard MFC-toepassing of klasse toevoegen, schrijft de wizard de volgende RFX-gerelateerde elementen voor u op basis van de gegevensbron, tabel en kolomkeuzen die u in de wizard maakt:
Declaraties van de veldgegevensleden van de recordset in de recordsetklasse
Een overschrijving van
CRecordset::DoFieldExchangeInitialisatie van gegevensleden van recordsetvelden in de constructor van de recordsetklasse
Declaraties van veldgegevenslid
De wizards schrijven een declaratie van recordsetklasse in een .h-bestand dat lijkt op het volgende voor 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
};
Als u parametergegevensleden of nieuwe leden van veldgegevens toevoegt die u zelf verbindt, voegt u deze toe na de door de wizard gegenereerde leden.
U ziet ook dat de wizard de DoFieldExchange lidfunctie van klasse CRecordsetoverschrijft.
DoFieldExchange Override
DoFieldExchange is het hart van RFX. Het framework roept DoFieldExchange op elk gewenst moment aan dat gegevens moeten worden verplaatst van de gegevensbron naar de recordset of van de recordset naar de gegevensbron.
DoFieldExchange biedt ook ondersteuning voor het verkrijgen van informatie over veldattributen via de lidfuncties IsFieldDirty en IsFieldNull.
De volgende DoFieldExchange overschrijving is voor de CSections klasse. De wizard schrijft de functie in het .cpp-bestand voor uw recordsetklasse.
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);
}
Let op de volgende belangrijke functies van de functie:
Deze sectie van de functie wordt de veldkaart genoemd.
Een aanroep naar
CFieldExchange::SetFieldType, via depFXaanwijzer. Met deze aanroep wordt aangegeven dat alle RFX-functie-aanroepen tot het einde vanDoFieldExchangeof tot de volgende aanroep naarSetFieldType, uitvoerkolommen zijn. Zie CFieldExchange::SetFieldType voor meer informatie.Verschillende aanroepen naar de
RFX_Textglobale functie: één per veldgegevenslid (allemaalCStringvariabelen in het voorbeeld). Met deze aanroepen geeft u de relatie op tussen een kolomnaam in de gegevensbron en een veldgegevenslid. De RFX-functies voeren de werkelijke gegevensoverdracht uit. De klassebibliotheek levert RFX-functies voor alle algemene gegevenstypen. Voor meer informatie over RFX-functies, zie Record Field Exchange: Using the RFX Functions.Opmerking
De volgorde van de kolommen in uw resultatenset moet overeenkomen met de volgorde van de RFX-functie-aanroepen in
DoFieldExchange.De
pFXaanwijzer naar een CFieldExchange-object dat door het framework wordt doorgegeven wanneer het wordt aangeroepenDoFieldExchange. HetCFieldExchangeobject geeft de bewerking op dieDoFieldExchangemoet worden uitgevoerd, de richting van overdracht en andere contextinformatie.
Recordetconstructor
De recordset-constructor die door de wizards wordt geschreven, bevat twee dingen die betrekking hebben op RFX:
Een initialisatie voor elk veldgegevenslid
Een initialisatie voor het m_nFields gegevenslid, dat het aantal veldgegevensleden bevat
De constructor voor het voorbeeld van de CSections recordset ziet er als volgt uit:
CSections::CSections(CDatabase* pdb)
: CRecordset(pdb)
{
m_strCourseID = "";
m_strInstructorID = "";
m_strRoomNo = "";
m_strSchedule = "";
m_strSectionNo = "";
m_nFields = 5;
}
Opmerking
Als u handmatig gegevensvelden toevoegt, bijvoorbeeld wanneer u nieuwe kolommen dynamisch verbindt, moet u m_nFields aanpassen. Doe dit door een extra regel code toe te voegen, zoals:
m_nFields += 3;
Dit is de code voor het toevoegen van drie nieuwe velden. Als u parametergegevensleden toevoegt, moet u het m_nParams gegevenslid initialiseren, dat het aantal parametergegevensleden bevat. Plaats de m_nParams initialisatie buiten de haakjes.