Sdílet prostřednictvím


TN053: Vlastní rutiny DFX pro databázové třídy DAO

Poznámka:

DaO se používá s databázemi Accessu a podporuje se prostřednictvím Office 2013. DAO 3.6 je konečná verze a je považována za za zastaralou. Prostředí a průvodci Visual C++ nepodporují rozhraní DAO (i když jsou zahrnuty třídy DAO a můžete je stále používat). Společnost Microsoft doporučuje pro nové projekty používat šablony OLE DB nebo rozhraní ODBC a MFC . DaO byste měli používat jenom při údržbě existujících aplikací.

Tato technická poznámka popisuje mechanismus výměny polí záznamu DAO (DFX). Abychom pochopili, co se děje v rutinách DFX, DFX_Text funkce bude podrobně vysvětlena jako příklad. Jako další zdroj informací k této technické poznámce můžete prozkoumat kód pro ostatní jednotlivé funkce DFX. Pravděpodobně nebudete potřebovat vlastní rutinu DFX tak často, jak byste mohli potřebovat vlastní rutinu RFX (používá se s databázovými třídami ODBC).

Tato technická poznámka obsahuje:

Přehled DFX

Mechanismus výměny polí záznamu DAO (DFX) se používá ke zjednodušení postupu načítání a aktualizace dat při použití CDaoRecordset třídy. Proces je zjednodušený pomocí datových CDaoRecordset členů třídy. Odvozením můžete CDaoRecordsetpřidat datové členy do odvozené třídy představující každé pole v tabulce nebo dotazu. Tento mechanismus statické vazby je jednoduchý, ale nemusí se jednat o metodu načítání a aktualizace dat pro všechny aplikace. DFX načte každé vázané pole při každé změně aktuálního záznamu. Pokud vyvíjíte aplikaci citlivou na výkon, která nevyžaduje načtení každého pole při změně měny, dynamická vazba prostřednictvím CDaoRecordset::GetFieldValue a CDaoRecordset::SetFieldValue může být zvolená metoda přístupu k datům.

Poznámka:

DFX a dynamická vazba se vzájemně nevylučují, takže je možné použít hybridní použití statické a dynamické vazby.

Příklad 1 – Použití pouze výměny polí záznamu DAO

(předpokládá CDaoRecordset – odvozená třída CMySet již otevřená)

// Add a new record to the customers table
myset.AddNew();

myset.m_strCustID = _T("MSFT");

myset.m_strCustName = _T("Microsoft");

myset.Update();

Příklad 2 – Použití pouze dynamické vazby

(předpokládá použití CDaoRecordset třídy rsa je již otevřen)

// Add a new record to the customers table
COleVariant  varFieldValue1 (_T("MSFT"),
    VT_BSTRT);

//Note: VT_BSTRT flags string type as ANSI,
    instead of UNICODE default
COleVariant  varFieldValue2  (_T("Microsoft"),
    VT_BSTRT);

rs.AddNew();

rs.SetFieldValue(_T("Customer_ID"),
    varFieldValue1);

rs.SetFieldValue(_T("Customer_Name"),
    varFieldValue2);

rs.Update();

Příklad 3 – Použití výměny polí záznamů DAO a dynamické vazby

(předpokládá procházení dat zaměstnanců s CDaoRecordsetodvozenou třídou emp)

// Get the employee's data so that it can be displayed
emp.MoveNext();

// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
    emp.GetFieldValue(_T("photo"),
    varPhoto);

// Display the data
PopUpEmployeeData(emp.m_strFirstName,
    emp.m_strLastName,
    varPhoto);

Jak DFX funguje

Mechanismus DFX funguje podobně jako mechanismus výměny polí záznamu (RFX), který používají třídy MFC ODBC. Principy DFX a RFX jsou stejné, ale existuje mnoho vnitřních rozdílů. Návrh funkcí DFX byl takový, že prakticky veškerý kód je sdílen jednotlivými rutinami DFX. Na nejvyšší úrovni DFX dělá jen několik věcí.

  • DFX v případě potřeby sestaví klauzuli SQL SELECT a klauzuli SQL PARAMETERS .

  • DFX sestaví vazbu, kterou používá funkce DAO GetRows (další informace o této funkci později).

  • DFX spravuje vyrovnávací paměť dat používanou k detekci nezašpiněných polí (pokud se používá dvojité ukládání do vyrovnávací paměti).

  • DFX spravuje pole stavu NULL a DIRTY a v případě potřeby nastavuje hodnoty pro aktualizace.

Jádrem mechanismu DFX je CDaoRecordset funkce odvozené třídy DoFieldExchange . Tato funkce odesílá volání jednotlivých funkcí DFX odpovídajícího typu operace. Před voláním DoFieldExchange interních funkcí MFC nastavte typ operace. Následující seznam obsahuje různé typy operací a stručný popis.

Operation Popis
AddToParameterList Klauzule Builds PARAMETERS
AddToSelectList Builds SELECT – klauzule
BindField Nastaví strukturu vazeb.
BindParam Nastaví hodnoty parametrů.
Fixup Nastaví stav NULL.
AllocCache Přidělení mezipaměti pro špinavou kontrolu
StoreField Uloží aktuální záznam do mezipaměti.
LoadField Obnoví mezipaměť na hodnoty členů.
FreeCache Volné mezipaměti
SetFieldNull Nastaví stav pole a hodnotu null.
MarkForAddNew Označí pole zašpiněná, pokud není PSEUDO NULL.
MarkForEdit Označí pole zašpiněná, pokud se neshoduje s mezipamětí.
SetDirtyField Nastaví hodnoty polí označené jako nezašpiněné.

V další části bude každá operace vysvětlena podrobněji pro DFX_Text.

Nejdůležitější funkcí pro pochopení procesu výměny polí záznamu DAO je, že používá GetRows funkci objektu CDaoRecordset . Funkce DAO GetRows může fungovat několika způsoby. Tato technická poznámka bude stručně popisovat GetRows , protože je mimo rozsah této technické poznámky. DAO GetRows může pracovat několika způsoby.

  • Může načíst více záznamů a více polí dat najednou. To umožňuje rychlejší přístup k datům s komplikací práce s velkou datovou strukturou a příslušnými posuny do každého pole a pro každý záznam dat ve struktuře. MFC nevyužívá tento mechanismus načítání více záznamů.

  • Dalším způsobem GetRows práce je umožnit programátorům zadat vazbové adresy pro načtená data každého pole pro jeden záznam dat.

  • DAO také zavolá zpět volajícímu pro sloupce s proměnlivou délkou, aby volající mohl přidělit paměť. Tato druhá funkce má výhodu minimalizace počtu kopií dat a umožnění přímého ukládání dat do členů třídy (odvozené CDaoRecordset třídy). Tento druhý mechanismus je metoda MFC používá k vytvoření vazby k datovým členům v CDaoRecordset odvozených třídách.

Co vaše vlastní rutina DFX dělá

Z této diskuze vyplývá, že nejdůležitější operací implementovanou v jakékoli funkci DFX musí být schopnost nastavit požadované datové struktury pro úspěšné volání GetRows. Existuje řada dalších operací, které musí funkce DFX podporovat, ale žádná stejně důležitá nebo složitá jako správná příprava na GetRows volání.

Použití DFX je popsáno v online dokumentaci. V podstatě existují dva požadavky. Nejprve musí být členy přidány do CDaoRecordset odvozené třídy pro každé vázané pole a parametr. Za tímto CDaoRecordset::DoFieldExchange příkazem by se mělo přepsat. Všimněte si, že datový typ člena je důležitý. Měla by se shodovat s daty z pole v databázi nebo by měla být alespoň konvertibilní na tento typ. Například číselné pole v databázi, například dlouhé celé číslo, může být vždy převedeno na text a vázané na CString člena, ale textové pole v databázi nemusí být nutně převedeno na číselnou reprezentaci, například dlouhé celé číslo a vázané na dlouhý celočíselný člen. Rozhraní DAO a databázový stroj Microsoft Jet zodpovídají za převod (nikoli za MFC).

Podrobnosti o DFX_Text

Jak už jsme zmínili dříve, nejlepším způsobem, jak vysvětlit, jak DFX funguje, je pracovat s příkladem. Pro tento účel by měl projít vnitřními informacemi DFX_Text , které by měly fungovat docela dobře, aby pomohly alespoň základnímu porozumění DFX.

  • AddToParameterList

    Tato operace sestaví klauzuli SQL PARAMETERS ("Parameters <param name>, <param type> ... ;") vyžadovanou jetem. Každý parametr má název a typ (jak je uvedeno ve volání RFX). Podívejte se na funkci funkce CDaoFieldExchange::AppendParamType a podívejte se na názvy jednotlivých typů. V případě použitého DFX_Texttypu je text.

  • AddToSelectList

    Vytvoří klauzuli SQL SELECT . To je poměrně jednoduché, protože název sloupce určený voláním DFX je jednoduše připojen ("SELECT <column name>, ...").

  • BindField

    Nejsložitější operace. Jak už bylo zmíněno dříve, je zde nastavena struktura vazeb DAO používaná službou GetRows DAO. Jak je vidět z kódu v DFX_Text typech informací ve struktuře, zahrnují použitý typ DAO (DAO_CHAR nebo DAO_WCHAR v případě DFX_Text). Kromě toho je také nastaven typ použité vazby. V předchozí části GetRows bylo popsáno pouze krátce, ale bylo dostačující vysvětlit, že typ vazby, kterou mfc používá, je vždy přímá adresa vazby (DAOBINDING_DIRECT). Kromě vazby sloupce s proměnnou délkou (například DFX_Text) se používá vazba zpětného volání, aby mfc mohl řídit přidělení paměti a zadat adresu správné délky. To znamená, že MFC může vždy říct DAO " kam" umístit data, a tím umožnit vazbu přímo na členské proměnné. Zbytek struktury vazby se vyplní například adresou funkce zpětného volání přidělení paměti a typem vazby sloupce (vazba podle názvu sloupce).

  • BindParam

    Jedná se o jednoduchou operaci, která volá SetParamValue hodnotu parametru zadanou v členu parametru.

  • Fixup

    Vyplní stav NULL pro každé pole.

  • SetFieldNull

    Tato operace označí stav každého pole pouze hodnotou NULL a nastaví hodnotu členské proměnné na PSEUDO_NULL.

  • SetDirtyField

    Volá SetFieldValue všechna pole označená jako nezašpiněná.

Všechny zbývající operace se zabývají pouze používáním mezipaměti dat. Mezipaměť dat je dodatečná vyrovnávací paměť dat v aktuálním záznamu, která slouží k zjednodušení určitých věcí. Například "špinavá" pole se dají automaticky rozpoznat. Jak je popsáno v online dokumentaci, můžete ji úplně vypnout nebo na úrovni pole. Implementace vyrovnávací paměti využívá mapu. Tato mapa slouží ke shodě dynamicky přidělených kopií dat s adresou "vázaného" pole (nebo CDaoRecordset odvozeného datového členu).

  • AllocCache

    Dynamicky přiděluje hodnotu pole v mezipaměti a přidá ji do mapy.

  • FreeCache

    Odstraní hodnotu pole v mezipaměti a odebere ji z mapy.

  • StoreField

    Zkopíruje aktuální hodnotu pole do mezipaměti dat.

  • LoadField

    Zkopíruje hodnotu uloženou v mezipaměti do člena pole.

  • MarkForAddNew

    Zkontroluje, jestli aktuální hodnota pole není null , a v případě potřeby ji označí jako nezašpiněnou.

  • MarkForEdit

    Porovná aktuální hodnotu pole s mezipamětí dat a v případě potřeby označí zašpiněnou.

Tip

Vlastní rutiny DFX můžete modelovat u stávajících rutin DFX pro standardní datové typy.

Viz také

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