Sdílet prostřednictvím


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).

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií