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
), IsFieldDirty
provede 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 (CFieldExchange
objekt) 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, nastavteCString/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 poleIsFieldDirty
— Návratová hodnota bitu stavu zašpiněného stavuIsFieldNull
— Návratová hodnota bitu stavu nullIsFieldNullable
— Vrátí hodnotu PRAVDA, pokud pole může obsahovat hodnoty NULL.StoreField
— Hodnota pole archivuLoadField
— Znovu načíst archivovanou hodnotu poleGetFieldInfoValue
— Vrátit obecné informace o poliGetFieldInfoOrdinal
— 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í