TN043: Rutiny RFX
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje architektura pole záznamu (RFX) serveru exchange.Také popisuje, jak psát RFX_ postupu.
Základní informace o výměně pole záznamu
Provádět všechny funkce sady záznamů pole s kódem jazyka C++.Neexistují žádné zvláštní prostředky nebo magic makra.Srdce mechanismu je virtuální funkce, která musí být přepsána v každé třídy odvozené záznamů.Vždy nachází v tomto formuláři:
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
Komentáře AFX speciální formát umožňuje vyhledat a upravit kód v rámci této funkce ClassWizard.Kód, který není kompatibilní s ClassWizard by měl být umístěn mimo zvláštní formát komentáře.
V tomto příkladu <recordset_exchange_field_type_call> je ve formě:
pFX->SetFieldType(CFieldExchange::outputColumn);
a <recordset_exchange_function_call> je ve formě:
RFX_Custom(pFX, "Col2", m_Col2);
Většina RFX_ funkce mají tři argumenty, jak je uvedeno výše, ale některé (např.)RFX_Texta RFX_Binary) obsahují další volitelné argumenty.
Více RFX_ mohou být zahrnuty v každé DoDataExchange funkce.
Viz "afxdb.h" seznam všech sady záznamů pole exchange rutin dodávané s knihovnou MFC.
Volání sady záznamů pole představují způsob registrace paměťová místa (obvykle datových členů) k ukládání dat pole CMySet třídy.
Poznámky
Funkce sady záznamů pole jsou navrženy pro práci s pouze CRecordset třídy.Nejsou obecně použitelné podle jiných tříd knihovny MFC.
Počáteční hodnoty dat jsou nastavena v konstruktoru standard C++ obvykle v bloku s //{{AFX_FIELD_INIT(CMylSet) a //}}AFX_FIELD_INIT komentáře.
Každý RFX_ funkce musí podporovat různé operace, od návratu dirty stav pole archivace v přípravě pro úpravy pole pole.
Každá funkce, která volá DoFieldExchange (například SetFieldNull, IsFieldDirty), nemá vlastní inicializace kolem volání DoFieldExchange.
Jak to funguje?
Není nutné znát následující pro použití výměny pole záznamu.Vysvětlení, jak to funguje na pozadí vám však napsat vlastní postup výměny.
DoFieldExchange Členské funkce je podobně jako Serialize členské funkce – je odpovědný za získání nebo nastavení dat do/z externí formuláře (v tomto případu sloupce z výsledku dotazu ODBC) z/do data členů ve třídě.pFX Parametr kontextu při provádění výměny dat a je podobný CArchive parametr CObject::Serialize.pFX ( CFieldExchange Objekt) má ukazatel provozu, který je podobný, ale generalizace o CArchive směr příznak.RFX funkce týkající se podpory následující operace:
BindParam , kde má ODBC načíst data parametr označit
BindFieldToColumn , uveďte kde ODBC musí načtení/uložení dat outputColumn
Opravy – nastavení CString/CByteArray délky, nastavit NULL stav bit
MarkForAddNew – značka dirty Pokud hodnota byla změněna, protože volání AddNew
MarkForUpdate – značka dirty Pokud hodnota změněna vzhledem k tomu, že úpravy volání
Název -přidat názvy polí pro pole označen za nečistý.
NameValue -přidat "<název sloupce>=?" pro pole označen za nečistý.
Hodnota – přidávací "?" následuje oddělovač, například ',' nebo ""
SetFieldDirty– Nastavit stav bit dirty (tj.) změněné)
SetFieldNull– Nastavit stav bit určující hodnotu null pro pole
IsFieldDirty– Vrácená hodnota stav nevyřízeného bitu.
IsFieldNull-Vrátit hodnotu null stav bit
IsFieldNullable-Vrací hodnotu TRUE, je-li pole může obsahovat hodnotu NULL.
StoreField – hodnota pole archivovat
LoadField – archivovány znovu načíst hodnotu pole
GetFieldInfoValue – návrat na poli Obecné informace
GetFieldInfoOrdinal – návrat na poli Obecné informace
Rozšíření Uživatelé
Existuje několik způsobů, jak rozšířit výchozí mechanismus RFX.Můžete
Přidáte nové datové typy.Příklad:
CBookmark
Přidáte nové postupy výměny (RFX_???).
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName, BIGINT& value);
Jste DoFieldExchange členské funkce podmíněně zahrnout další volání RFX nebo 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 upravit pomocí ClassWizard a by měla sloužit pouze mimo zvláštní formát komentáře.
Psaní vlastní RFX
Psát vaše vlastní RFX vlastní funkce, doporučujeme zkopírovat existující RFX funkce a upravit pro vlastní účely.Výběr pravého RFX kopírovat můžete jednodušší práci.Některé funkce RFX mají některé jedinečné vlastnosti, které musí brát v úvahu při rozhodování, které chcete kopírovat.
RFX_Long a RFX_Int:
Jedná se o nejjednodušší funkce výměny pole záznamů.Hodnota dat není nutné žádné zvláštní výklad a velikost dat je pevná.RFX_Single a RFX_Double:
Jako RFX_Long a RFX_Int nad tyto funkce jsou jednoduché a můžete použít výchozí implementace rozsáhlé.Jsou uloženy v dbflt.cpp místo dbrfx.cpp, nicméně Chcete-li povolit načítání modulu runtime plovoucí bod knihovny, pouze pokud nejsou explicitně odkaz.RFX_Text a RFX_Binary:
Tyto dvě funkce předem přidělit statické vyrovnávací paměť pro řetězec nebo binární informace a zaregistrujte tyto vyrovnávací paměti s ODBC SQLBindCol místo registrace &hodnotu.Z tohoto důvodu tyto dvě funkce obsahují hodně zvláštní případ kódu.RFX_Date:
ODBC vrátí vlastní strukturu dat TIMESTAMP_STRUCT z data a času.Tato funkce dynamicky přiděluje TIMESTAMP_STRUCT z jako "proxy server" pro odesílání a přijímání dat Datum čas.Různé operace musí přenášet informace o datu a času mezi C++ CTime objekt a TIMESTAMP_STRUCT z proxy.To značně komplikuje tuto funkci, ale je dobrým příkladem použití proxy serveru pro přenos dat.RFX_LongBinary:
Toto je pouze RFX funkce, která nepoužívá vazbu sloupců pro příjem a odesílání dat knihovny tříd.Tato funkce ignoruje operace BindFieldToColumn a místo toho během operace opravy alokuje prostor pro uložení příchozích dat SQL_LONGVARCHAR a SQL_LONGVARBINARY, pak je SQLGetData volání k načtení hodnoty do přiděleného úložiště provádí.Při přípravě k odeslání dat zpět do zdroje dat (například operace NameValue a hodnota), tuto funkci používá funkce ODBC DATA_AT_EXEC.Viz Technická poznámka: 45 pro další informace o práci s SQL_LONGVARBINARY a SQL_LONGVARCHARs.
Při psaní své vlastní RFX_ funkce, často bude možné používat CFieldExchange::Default k provedení dané operace.Podívejte se na výchozí provádění dané činnosti.Pokud se provede operace by psaní do vašeho RFX_ funkce můžete delegovat na CFieldExchange::Default. Možné příklady volání CFieldExchange::Default v dbrfx.cpp
Je třeba volat IsFieldType na začátku RFX funkce a vrácení okamžitě, pokud vrátí hodnotu FALSE.Tento mechanismus zajišťuje parametr operace prováděny na outputColumnsa naopak (jako volací BindParam na outputColumn).Kromě toho IsFieldType automaticky uchovává informace o počtu outputColumns (m_nFields) a parametry (m_nParams).