TN043: Rutiny RFX
[!POZNÁMKA]
Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje architekturu pole záznamu exchange (RFX).Také popisuje, jak píšete RFX_ postup.
Přehled Exchange pole záznamu
Funkce pole všech záznamů jsou v kódu jazyka C++.Neexistují žádné zvláštní prostředky nebo magic makra.Srdce mechanismus je virtuální funkci, která musí být v každé třídy odvozené recordset přepsána.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
}
Zvláštní formát komentáře AFX umožňují vyhledat a upravit kód v této funkci ClassWizard.Kód, který není kompatibilní s ClassWizard by umístěna 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 (například mít tři argumenty uvedené výše, ale některéRFX_Texta RFX_Binary) další volitelné argumenty.
Více RFX_ mohou být zahrnuty v každé DoDataExchange funkce.
Viz 'afxdb.h' seznam všech záznamů pole exchange rutiny s MFC.
Recordset pole volání jsou způsob registrace paměťových míst (obvykle data členů) k ukládání dat pole CMySet třídy.
Poznámky
Recordset pole funkce jsou navrženy pro práci s pouze CRecordset tříd.Nejsou obecně použitelné podle jiných tříd MFC.
Počáteční hodnoty dat jsou nastaveny 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 archivace pole v přípravě pro úpravy pole vrácení dirty stav pole.
Volání funkce DoFieldExchange (například SetFieldNull, IsFieldDirty), nemá vlastní inicializace kolem volání DoFieldExchange.
Jak funguje?
Není potřeba znát následující pole záznamu exchange použít.Vysvětlení, jak to funguje na pozadí můžete zapsat však exchange procedury.
DoFieldExchange Členské funkce je podobně jako Serialize členské funkce – je odpovědný za získání nebo nastavení dat do/z/do data členů třídy z externí formuláře (v tomto případu sloupce z výsledku dotazu ODBC).pFX Parametr kontextu postupu výměny dat a je podobná CArchive parametr CObject::Serialize.pFX ( CFieldExchange Objektu) má ukazatel operace, které je podobné, ale generalizace z CArchive příznak směru.Funkce aplikace RFX pravděpodobně podporovat následující operace:
BindParam – uveďte, kde by parametr data načíst ODBC
BindFieldToColumn – uveďte kde ODBC musí načíst nebo uložení dat outputColumn
Oprava – nastavení CString/CByteArray délky, nastavit stav NULL bit
MarkForAddNew – značka dirty, pokud hodnota změnila volat metodu AddNew
MarkForUpdate – značka dirty, pokud hodnota změnila úpravy volání
Název – přidat názvy polí pro pole označen za nečistý.
NameValue – Append "< název sloupce > =?" pro pole označen za nečistý.
Hodnota – Append "?" za oddělovač, například "," nebo ""
SetFieldDirty– Stav nastavení bitu dirty (tj.změněné) pole
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, pokud je pole může obsahovat hodnoty NULL
StoreField – archivovat hodnoty pole
LoadField – archivovány znovu načíst hodnotu pole
GetFieldInfoValue — vrátit pole Obecné informace
GetFieldInfoOrdinal — vrátit pole Obecné informace
Rozšíření
Rozšířit výchozím mechanismem RFX několika způsoby.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]
Tento kód nelze upravit pomocí ClassWizard a by měly být použity pouze mimo zvláštní formát komentáře.
Psaní vlastního RFX
Chcete-li zapsat vlastní RFX funkce je navrženo, že zkopírovat existující funkce RFX a upravit pro vlastní účely.Doprava RFX zkopírujte výběr provádět úlohy mnohem snadnější.Některé funkce RFX mají některé jedinečné vlastnosti, které je měly vzít v úvahu při rozhodování, který chcete kopírovat.
RFX_Long a RFX_Int:
Jedná se o nejjednodušší funkce RFX.Hodnota dat není nutné 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 lze použít výchozí provádění rozsáhlé.Jsou uloženy v dbflt.cpp namísto dbrfx.cpp, však povolit načítání runtime plovoucí bod knihovny, pouze pokud jsou výslovně odkaz.RFX_Text a RFX_Binary:
Tyto dvě funkce předem přidělit statickou vyrovnávací paměti pro uložení řetězce nebo binární informace a zaregistrujte vyrovnávací paměti s ODBC SQLBindCol namísto registrace & hodnota.Z tohoto důvodu tyto dvě funkce máte zvláštní případ kódu.RFX_Date:
Vlastní datové struktury TIMESTAMP_STRUCT ODBC vrátí informace o datu a času.Tato funkce dynamicky přiděluje TIMESTAMP_STRUCT jako "proxy" 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 TIMESTAMP_STRUCT serveru proxy a objektu.Tato funkce značně komplikuje, ale je dobrým příkladem použití serveru proxy pro přenos dat.RFX_LongBinary:
Toto je pouze knihovna tříd RFX funkce, která nepoužívá vazbu sloupce přijímat a odesílat data.Tato funkce ignoruje operaci BindFieldToColumn a místo toho během operace opravy alokuje prostor pro uložení příchozích dat SQL_LONGVARCHAR nebo SQL_LONGVARBINARY, pak provede voláním funkce SQLGetData do úložiště přidělenou načíst hodnotu.Při přípravě odeslat hodnoty data zpět do zdroje dat (například NameValue a hodnota operace), tato funkce využívá funkce ODBC a DATA_AT_EXEC.Viz Technická poznámka 45 Další informace o práci s SQL_LONGVARBINARY a SQL_LONGVARCHARs.
Při psaní vlastního RFX_ funkce, často bude možné použít CFieldExchange::Default k provedení dané operace.Podívejte se na provádění výchozí pro dotyčné operace.Pokud provádí operace by psaní v vaše RFX_ funkce můžete delegovat CFieldExchange::Default. Možné příklady volací CFieldExchange::Default v dbrfx.cpp
Je důležité volání IsFieldType na začátku funkce RFX a návrat okamžitě, pokud vrátí hodnotu FALSE.Tento mechanismus zajišťuje parametr operace prováděny na outputColumnsa naopak (podobně jako volací BindParam na outputColumn).Kromě toho IsFieldType automaticky udržuje přehled o počtu outputColumns (m_nFields) a parametry (m_nParams).