Sdílet prostřednictvím


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

[!POZNÁMKA]

Tak jako jazyk Visual C++ .NET, tak taky prostředí a průvodci jazyka Visual C++ nepodporují rozhraní DAO (přestože třídy rozhraní DAO jsou zahrnuty a lze je stále použít).Společnost Microsoft doporučuje používat Šablon technologie OLE DB nebo rozhraní ODBC a knihovna MFC pro nové projekty.Měli by jste používat pouze rozhraní DAO pro údržbu existujících aplikací.

Tato technická Poznámka popisuje mechanismus výměny (DFX) pole záznamu rozhraní DAO.Chcete-li porozumět tomu, co se děje v DFX rutin, DFX_Text funkce budou vysvětleny podrobně jako příklad.Jako další zdroj informací k této technické poznámky můžete zkoumat kód pro druhou jednotlivé funkce DFX.Pravděpodobně nebudete potřebovat vlastní rutiny DFX často potřebovat vlastní rutiny RFX (používá se s třídami rozhraní ODBC databáze).

Tato technická poznámka obsahuje:

  • Přehled DFX

  • Příklady použití výměny pole záznamů DAO a dynamická vazba.

  • Podstata práce DFX

  • Co dělá váš vlastní DFX rutina

  • Podrobnosti o DFX_Text

Přehled DFX

Rozhraní DAO mechanismus výměny pole záznamu (DFX) slouží ke zjednodušení postupu načítání a aktualizace dat při použití CDaoRecordset třídy.Proces je zjednodušeno pomocí datové členy CDaoRecordset třídy.Odvozením ze CDaoRecordset, můžete přidat datové členy odvozené třídy, reprezentující jednotlivá pole v tabulce nebo dotazu.Tento mechanismus "statická vazba" je jednoduchý, ale nemusí být metoda načítání nebo aktualizaci dat výběru pro všechny aplikace.DFX získá každé vázané pole pokaždé, když se změní aktuální záznam.Pokud vyvíjíte aplikace náročné na výkon, který nevyžaduje načítání všech polí při změně měny "dynamická vazba" via CDaoRecordset::GetFieldValue a CDaoRecordset::SetFieldValue může být metoda přístupu dat výběru.

[!POZNÁMKA]

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

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

(předpokládá CDaoRecordset – odvozené třídy 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í dynamické vázání

(předpokládá se použití CDaoRecordset třídy, rs, a 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í z DAO výměna pole záznamu a dynamická vazba

(předpokládá procházení dat zaměstnanců s CDaoRecordset-odvozené třídy 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);

Podstata práce DFX

DFX mechanismus funguje podobným způsobem jako mechanismus výměny (RFX) pole záznamu používaný třídami knihovny MFC rozhraní ODBC.Zásady DFX a RFX jsou stejné, ale existují četné vnitřní rozdíly.Návrh DFX funkce byl takový, že prakticky veškerý kód sdílí jednotlivých rutin DFX.Na nejvyšší úrovni DFX pouze provede několik věcí.

  • DFX konstrukce SQL Vybrat klauzule a SQL Parametry klauzule, podle potřeby.

  • DFX vytvoří strukturu vazba používá rozhraní DAO v GetRows funkce (o tom více později).

  • DFX spravuje vyrovnávací paměť pro data sloužící ke zjišťování dirty polí (Pokud je použit dvojité ukládání do vyrovnávací paměti)

  • DFX spravuje NULL a DIRTY stav polí a nastaví hodnoty Pokud je to nutné pro aktualizace.

V srdci DFX mechanismus je CDaoRecordset odvozené třídy DoFieldExchange funkce.Tato funkce odešle volání jednotlivých funkcí DFX typu příslušné operace.Před volací DoFieldExchange vnitřní funkce knihovny MFC, nastavit typ operace.V následujícím seznamu jsou uvedeny různé typy operací a stručný popis.

Operace

Popis

AddToParameterList

Parametry klauzule sestavení

AddToSelectList

Klauzule SELECT sestavení

BindField

Nastaví strukturu vazby

BindParam

Nastaví hodnoty parametrů

Opravy

Nastaví stav na hodnotu NULL

AllocCache

Přiděluje mezipaměti pro kontrolu dirty

StoreField

Aktuální záznam uloží do mezipaměti

LoadField

Obnovení mezipaměti hodnoty členů

FreeCache

Uvolnění mezipaměti

SetFieldNull

Nastaví pole Stav & hodnotu NULL

MarkForAddNew

Značky dirty polí není-li PSEUDO NULL

MarkForEdit

Pokud dirty polí značky neodpovídají mezipaměti

SetDirtyField

Nastaví pole hodnot, které jsou označeny jako nečisté

V další části každé operace budou vysvětleny podrobněji pro DFX_Text.

Nejdůležitější funkce pro pochopení charakteru procesu výměny pole záznamu rozhraní DAO je, že používá GetRows funkce CDaoRecordset objektu.Rozhraní DAO GetRows funkce mohou pracovat v několika způsoby.Tato technická Poznámka bude pouze stručně popište GetRows je mimo rozsah této technické poznámky.

Rozhraní DAO GetRows mohou pracovat v několika způsoby.

  • Jej lze načíst více záznamů a více polí dat současně.To umožňuje rychlejší přístup k datům s komplikace pro vyřizování rozsáhlých datových struktur a příslušná pořadová čísla pro každé pole a pro každý záznam dat ve struktuře.MFC nevyužívá výhody tohoto více záznamu mechanismus načítání.

  • Jiný způsob GetRows může práce je umožnit programátorům vazba určena pro každé pole pro jeden záznam dat načtená data.

  • Rozhraní DAO, budou také "zpětného volání" do volajícího pro proměnné délky sloupce, aby volající přidělení paměti.Tato druhá funkce má výhodu minimalizace počtu kopií dat a také umožňující přímé ukládání dat do členy třídy ( CDaoRecordset odvozené třídy).Tento druhý mechanismus je metoda používá knihovna MFC svázat datové členy v CDaoRecordset odvozené třídy.

Co dělá váš vlastní DFX rutina

Je zřejmé z této diskuse, které nejdůležitější operace prováděny v jakékoli funkci DFX musí být možnost nastavit požadované datové struktury úspěšně volat GetRows.Existuje mnoho dalších operací, které DFX funkce musí podporovat také, ale žádná jako důležité nebo složitý jako správně Příprava GetRows volání.

Použití DFX je popsán v dokumentaci online.Existují v podstatě dva požadavky.Nejprve členové musí být přidán do CDaoRecordset odvozené třídy pro každé vázané pole a parametr.Následující CDaoRecordset::DoFieldExchange by měla být přepsána.Všimněte si, že datový typ člena je důležité.Musí odpovídat pole v databázi nebo alespoň být převést na daný typ.Můžete například číselné pole v databázi, například dlouhé celé číslo vždy převedeny na text a vázán CString člen, ale textové pole v databázi může nemusí převedeny na číselné vyjádření, například dlouhé celé číslo a vázán na člena dlouhé celé číslo.Rozhraní DAO a databázového stroje Microsoft Jet je zodpovědná za převod (spíše než knihovny MFC).

Podrobnosti o DFX_Text

Jak bylo zmíněno dříve, je nejlepší způsob, jak Vysvětlit princip DFX pro práci v příkladu.K tomuto účelu prostřednictvím interní z DFX_Text by měly fungovat docela dobře pomoci poskytnout alespoň základní znalost DFX.

  • AddToParameterList
    Tato operace vytvoří SQL Parametry klauzule ("Parameters <param name>, <param type> ... ;") vyžaduje databázový stroj Jet.Každý parametr je pojmenovaný a zadali (jak je uvedeno ve volání RFX).Funkce CDaoFieldExchange::AppendParamType funkce, chcete-li zobrazit názvy jednotlivých typů.U DFX_Text, je použit typ text.

  • AddToSelectList
    Vytvoří SQL Vybrat klauzule.To je poměrně rovně dopředu zadaný název sloupce voláním DFX je jednoduše připojen ("SELECT <column name>, ...").

  • BindField
    Nejvíce komplexních operací.Jak bylo uvedeno dříve, je to, kde struktura vazby rozhraní DAO používá GetRows je nastaven.Jak můžete vidět z kódu v DFX_Text informace ve struktuře patří použitý typ rozhraní DAO (DAO_CHAR nebo DAO_WCHAR u DFX_Text).Navíc typ vazby se používá také nastaven.V předchozí části GetRows byl popsán pouze krátce, ale byla dostatečná a vysvětlit, že typ vazby se používá knihovna MFC vždy vazbu přímé adresy (DAOBINDING_DIRECT).Kromě toho pro vazbu sloupců proměnné délky (například DFX_Text) zpětné vazby se používá tak, aby knihovny MFC lze řídit přidělování paměti a určit adresu správnou délku.To znamená, že knihovna MFC vždy poznáte DAO "kde" dat, takže přímou vazbu na členské proměnné.Zbytek struktura vazby je naplněno například adresu funkce zpětného volání při přidělování paměti, typ sloupec vázání (vázání podle názvu sloupce).

  • BindParam
    Jedná se o jednoduchou operaci, která volá SetParamValue s hodnotou parametru určenou v parametr člena.

  • Opravy
    Vyplní NULL stav pro každé pole.

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

  • SetDirtyField
    Volání SetFieldValue pro každé pole označen za nečistý.

Zbývajících operací zacházet pouze s použitím mezipaměti data.Mezipaměť dat je další vyrovnávací paměti dat v aktuálním záznamu, která jsou používána k vytvoření určité věci jednodušší.Například "dirty" polí lze automaticky zjistit.Jak je popsáno v dokumentaci online jej lze vypnout úplně, nebo na úrovni pole.Provádění vyrovnávací paměti používá mapu.Tato mapa je používána pro párování se dynamicky přidělené kopie dat s adresou "vázaná" pole (nebo CDaoRecordset odvozené datový člen).

  • AllocCache
    Dynamicky přiděluje hodnoty uložené v mezipaměti pole a přidá do mapy.

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

  • StoreField
    Aktuální hodnota pole se zkopíruje do mezipaměti data.

  • LoadField
    V mezipaměti hodnotu zkopíruje do pole člena.

  • MarkForAddNew
    Zkontroluje, zda aktuální hodnota pole je non -NULL a označí dirty podle potřeby.

  • MarkForEdit
    Porovná aktuální hodnoty pole s mezipaměť dat a označí dirty, pokud je to nutné.

Tip

Model, na základě existující DFX rutin pro standardní datové typy vlastních rutin DFX.

Viz také

Další zdroje

Technické poznámky podle čísel

Technické poznámky podle kategorií