Sdílet prostřednictvím


TN043: Rutiny RFX

Poznámka:

Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.

Tato poznámka popisuje architekturu výměny polí záznamů (RFX). Popisuje také, jak píšete RFX_ proceduru.

Přehled výměny polí záznamů

Všechny funkce polí sady záznamů se provádějí pomocí kódu jazyka C++. Neexistují žádné speciální prostředky ani magická makra. Jádrem mechanismu je virtuální funkce, která se musí přepsat v každé odvozené třídě sady záznamů. Vždy se nachází v tomto formátu:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
    //{{AFX_FIELD_MAP(CMySet)
        <recordset exchange field type call>
        <recordset exchange function call>
    //}}AFX_FIELD_MAP
}

Komentáře AFX ve speciálním formátu umožňují třídyWizard vyhledat a upravit kód v rámci této funkce. Kód, který není kompatibilní s ClassWizard by měl být umístěn mimo komentáře speciálního formátu.

Ve výše uvedeném příkladu <je recordset_exchange_field_type_call> ve formuláři:

pFX->SetFieldType(CFieldExchange::outputColumn);

a <recordset_exchange_function_call> je ve formátu:

RFX_Custom(pFX, "Col2", m_Col2);

Většina RFX_ funkcí má tři argumenty, jak je znázorněno výše, ale některé (např RFX_Text . a RFX_Binary) mají další volitelné argumenty.

Každá funkce může obsahovat více RFX_.DoDataExchange

Seznam všech rutin výměny polí sady záznamů, které jsou k dispozici v prostředí MFC, najdete v souboru afxdb.h.

Volání polí sady záznamů představují způsob registrace umístění paměti (obvykle datových členů) pro ukládání dat polí pro CMySet třídu.

Notes

Funkce polí sady záznamů jsou navržené tak, aby fungovaly pouze s třídami CRecordset . Nejsou obecně použitelné pro žádné jiné třídy MFC.

Počáteční hodnoty dat jsou nastaveny ve standardním konstruktoru jazyka C++, obvykle v bloku s //{{AFX_FIELD_INIT(CMylSet) komentáři a //}}AFX_FIELD_INIT komentáři.

Každá RFX_ funkce musí podporovat různé operace, od vrácení nezašpiněného stavu pole až po archivaci pole v rámci přípravy na úpravu pole.

Každá funkce, která volá DoFieldExchange (například SetFieldNull), IsFieldDirtyprovede vlastní inicializaci kolem volání DoFieldExchange.

Jak to funguje

Abyste mohli použít výměnu polí záznamů, nemusíte rozumět následujícímu. Když ale pochopíte, jak to funguje na pozadí, pomůže vám to napsat vlastní postup výměny.

Členová DoFieldExchange funkce je podobně jako Serialize členová funkce – zodpovídá za načtení nebo nastavení dat z externího formuláře (v tomto případě sloupců z výsledku dotazu ODBC) z/do členových dat ve třídě. Parametr pFX je kontext pro výměnu dat a je podobný parametru CArchive jako CObject::Serialize. PFX (CFieldExchangeobjekt) má indikátor operace, který je podobný, ale generalizace příznaku CArchive směr. Funkce RFX může podporovat následující operace:

  • BindParam — Uveďte, kde by rozhraní ODBC mělo načítat data parametrů.

  • BindFieldToColumn — Uveďte, kde odbc musí načíst nebo uložit výstupní dataColumn.

  • Fixup — Nastavte délky, nastavte CString/CByteArray bit stavu NULL.

  • MarkForAddNew — Označte zašpiněnou hodnotu, pokud se hodnota od volání AddNew změnila.

  • MarkForUpdate — Označte zašpiněnou hodnotu, pokud se hodnota od volání Upravit změnila.

  • Name — Připojte názvy polí pro pole označená jako nezačená

  • NameValue — Připojte "<název> sloupce=" pro pole označená jako nezačená

  • Value — Připojte "" následovaný oddělovačem, jako je "," nebo ''

  • SetFieldDirty — Nastavit zašpiněné pole stavu (tj. změněno)

  • SetFieldNull — Nastavit bit stavu označující hodnotu null pro pole

  • IsFieldDirty — Návratová hodnota bitu stavu zašpiněného stavu

  • IsFieldNull — Návratová hodnota bitu stavu null

  • IsFieldNullable — Vrátí hodnotu PRAVDA, pokud pole může obsahovat hodnoty NULL.

  • StoreField — Hodnota pole archivu

  • LoadField — Znovu načíst archivovanou hodnotu pole

  • GetFieldInfoValue — Vrátit obecné informace o poli

  • GetFieldInfoOrdinal — Vrátit obecné informace o poli

Uživatelská rozšíření

Existuje několik způsobů, jak rozšířit výchozí mechanismus RFX. Můžete

  • Přidejte nové datové typy. Příklad:

    CBookmark
    
  • Přidejte nové postupy výměny (RFX_).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX,
        const char *szName,
        BIGINT& value);
    
  • DoFieldExchange Podmíněná členová funkce zahrnuje další volání RFX nebo jakékoli jiné platné příkazy jazyka C++.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX,
        m_listName.GetNext(posExtraFields),
        m_listValue.GetNext(posExtraValues));
    }
    

Poznámka:

Takový kód nelze upravovat pomocí TřídyWizard a měl by být použit pouze mimo komentáře speciálního formátu.

Psaní vlastního dokumentu RFX

Pokud chcete napsat vlastní funkci RFX, doporučujeme zkopírovat existující funkci RFX a upravit ji pro vlastní účely. Výběr správného dokumentu RFX pro kopírování může usnadnit práci. Některé funkce RFX mají některé jedinečné vlastnosti, které byste měli vzít v úvahu při rozhodování o kopírování.

RFX_Long a RFX_Int: Jedná se o nejjednodušší funkce RFX. Hodnota dat nepotřebuje žádnou speciální interpretaci a velikost dat je pevná.

RFX_Single a RFX_Double: Stejně jako RFX_Long a RFX_Int výše jsou tyto funkce jednoduché a mohou používat výchozí implementaci značně. Ukládají se místo dbrfx.cpp místo dbrfx.cpp, aby se však povolilo načítání knihovny s plovoucí desetinou čárkou za běhu pouze v případě, že jsou explicitně odkazované.

RFX_Text a RFX_Binary: Tyto dvě funkce předlokují statickou vyrovnávací paměť pro uložení řetězcových/binárních informací a musí tyto vyrovnávací paměti zaregistrovat u ODBC SQLBindCol místo registrace &value. Z tohoto důvodu mají tyto dvě funkce spoustu speciálního kódu.

RFX_Date: Odbc vrátí informace o datu a čase ve své vlastní TIMESTAMP_STRUCT datové struktuře. Tato funkce dynamicky přiděluje TIMESTAMP_STRUCT jako proxy pro odesílání a přijímání dat data data a času. Různé operace musí přenášet informace o datu a čase mezi objektem C++ CTime a TIMESTAMP_STRUCT proxy serverem. To tuto funkci značně komplikuje, ale je dobrým příkladem použití proxy serveru pro přenos dat.

RFX_LongBinary: Toto je jediná funkce RFX knihovny tříd, která nepoužívá vazbu sloupců pro příjem a odesílání dat. Tato funkce ignoruje operaci BindFieldToColumn a místo toho během operace Fixup přidělí úložiště pro uložení příchozích SQL_LONGVARCHAR nebo SQL_LONGVARBINARY dat a potom provede volání SQLGetData, které načte hodnotu do přiděleného úložiště. Při přípravě na odesílání hodnot dat zpět do zdroje dat (například operace NameValue a Value) tato funkce používá DATA_AT_EXEC funkce ODBC. Další informace o práci s SQL_LONGVARBINARY a SQL_LONGVARCHARs najdete v technické poznámce 45 .

Při psaní vlastní RFX_ funkce budete často schopni implementovat CFieldExchange::Default danou operaci. Podívejte se na implementaci výchozí pro danou operaci. Pokud provede operaci, kterou byste psali ve své RFX_ funkci, můžete delegovat na CFieldExchange::Default. Příklady volání CFieldExchange::Default v dbrfx.cpp

Je důležité volat IsFieldType na začátku funkce RFX a vrátit se okamžitě, pokud vrátí HODNOTU FALSE. Tento mechanismus zajišťuje, aby se operace parametrů prováděly u outputColumns a naopak (například volání BindParam na outputColumn). Kromě toho IsFieldType automaticky sleduje počet výstupních sloupců (m_nFields) a parametry (m_nParams).

Viz také

Technické poznámky podle čísel
Technické poznámky podle kategorií