Delen via


Recordvelduitwisseling: werken met de wizardcode

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::DoFieldExchange

  • Initialisatie 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 de pFX aanwijzer. Met deze aanroep wordt aangegeven dat alle RFX-functie-aanroepen tot het einde van DoFieldExchange of tot de volgende aanroep naar SetFieldType, uitvoerkolommen zijn. Zie CFieldExchange::SetFieldType voor meer informatie.

  • Verschillende aanroepen naar de RFX_Text globale functie: één per veldgegevenslid (allemaal CString variabelen 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 pFX aanwijzer naar een CFieldExchange-object dat door het framework wordt doorgegeven wanneer het wordt aangeroepen DoFieldExchange. Het CFieldExchange object geeft de bewerking op die DoFieldExchange moet 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.

Zie ook

Record Field Exchange (RFX)