TN053: Vlastní DFX rutiny pro třídy DAO databáze
[!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žít OLE DB šablony nebo ODBC a 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 DAO.Porozumět, co se děje v rutiny DFX DFX_Text funkce budou vysvětleny podrobně jako příklad.Jako další zdroj informací o této technické poznámky můžete zkontrolovat kód pro ostatní funkce jednotlivých DFX.Pravděpodobně nebudete potřebovat vlastní rutina DFX často může být nutné vlastní rutina RFX (používat s třídami databází ODBC).
Tato technická poznámka obsahuje:
Přehled DFX
Příklady výměnu záznamů DAO a dynamická vazba
Podstata práce DFX
Nemá své vlastní rutina DFX
Podrobnosti o DFX_Text
Přehled DFX
Mechanismus výměny pole záznamu DAO (DFX) slouží ke zjednodušení načítání a aktualizaci dat při použití postupu CDaoRecordset třídy.Proces je zjednodušeno členové data CDaoRecordset třídy.Podle vyplývající z CDaoRecordset, přidáte členy data odvozená třída představující každé pole v tabulce nebo dotazu.Tento mechanismus "statická vazba" je jednoduchý, ale nemusí být metoda fetch nebo aktualizace dat výběru pro všechny aplikace.DFX načítá pokaždé, když se změní aktuální záznam všech vázané pole.Pokud vyvíjíte citlivé na výkon aplikace, 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 výběru data aplikace access.
[!POZNÁMKA]
DFX a dynamická vazba se vzájemně nevylučují, tak lze používat hybridní statické a dynamické vazby.
Příklad 1 – Použití DAO záznam výměnu 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 – Dynamická vazba pouze použití
(předpokládá 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();
Například 3 – Použití aplikace DAO záznamu pole Exchange 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 pracuje podobným způsobem jako mechanismus výměny (RFX) pole záznamu používaný tříd MFC ODBC.Zásady DFX a RFX jsou stejné, ale existují četné vnitřní rozdíly.Návrh funkce DFX byl takový, že prakticky veškerý kód sdílí jednotlivých DFX rutiny.Na nejvyšší úrovni DFX pouze nemá několik věcí.
DFX konstrukce SQL Vyberte klauzule a SQL Parametry klauzule potřeby.
Konstrukce DFX vazby struktura používaná v DAO GetRows funkce (o tom více později).
Vyrovnávací paměť dat slouží k detekci dirty pole (pokud používá dvojité ukládání do vyrovnávací paměti) spravuje DFX
Spravuje DFX NULL a DIRTY stav maticových a nastaví hodnoty v případě potřeby aktualizace.
Srdcem 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 voláním DoFieldExchange vnitřní funkce MFC nastavit typ operace.Následující seznam obsahuje různé typy operací a stručný popis.
Operace |
Description |
---|---|
AddToParameterList |
Vytvoří klauzuli parametry |
AddToSelectList |
Klauzule SELECT sestavení |
BindField |
Nastavuje strukturu vazby |
BindParam |
Nastaví hodnoty parametru |
Opravu |
Nastaví stav NULL |
AllocCache |
Přiděluje mezipaměti pro kontrolu dirty |
StoreField |
Uloží aktuální záznam do mezipaměti |
LoadField |
Obnovení mezipaměti pro hodnoty člena |
FreeCache |
Uvolnění mezipaměti |
SetFieldNull |
Nastaví pole Stav & hodnota NULL |
MarkForAddNew |
Dirty značky polí není PSEUDO NULL- |
MarkForEdit |
Dirty Pokud značky polí 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 pochopit proces výměny DAO pole záznamu je, že používá GetRows funkce CDaoRecordset objektu.DAO GetRows funkce pracovat v několika způsoby.Tato technická Poznámka bude pouze Krátce popište GetRows je mimo rozsah této technické poznámky.
DAO GetRows pracovat v několika způsoby.
Je možné načíst více záznamů a více polí dat současně.To umožňuje rychlejší přístup k datům s complication vyřizování velké datové struktury a příslušná pořadová čísla pro každé pole a pro každý záznam dat ve struktuře.MFC nesmí využívat více záznam mechanismus pro načítání.
Dalším způsobem GetRows lze práce je umožnit programátorům určit adresy vazby pro načtená data pro jeden záznam dat každého pole.
DAO, budou také "zpětného volání" do volajícího pro proměnné délky sloupce Pokud chcete povolit volajícímu přidělit paměť.Tato druhá funkce má výhodu minimalizace počtu kopií dat a také umožňuje přímé ukládání dat do členy třídy ( CDaoRecordset odvozené třídy).Tento druhý mechanismus je metoda MFC používá svázat datové členy v CDaoRecordset odvozené třídy.
Nemá své vlastní rutina DFX
Je zřejmé z této diskuse, 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ě volání GetRows.Počet 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ána v dokumentaci online.Jsou v podstatě dva požadavky.Členové musí být nejprve 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.Poznámka: typ dat člena je důležité.Je odpovídající data z pole v databázi nebo být alespoň konvertibilní typu.Například číselné pole v databázi, například dlouhé celé číslo vždy můžete převést na text a vázané na CString členských, ale textové pole v databázi může nemusí být převedena na číselná, například dlouhé celé číslo a vázána na člena dlouhé celé číslo.DAO a databázový stroj Microsoft Jet jsou odpovědné za převod (nikoli MFC).
Podrobnosti o DFX_Text
Jak bylo uvedeno dříve, je nejlépe vysvětlit Princip DFX práce příkladu.Pro tento účel prostřednictvím interní položky DFX_Text by umožňují alespoň základní znalosti DFX poměrně dobře pracovat.
AddToParameterList
Tato operace se vytvoří SQL Parametry klauzule ("Parameters <param name>, <param type> ... ;") vyžadované Jet.Každý parametr s názvem a zadali (podle RFX volání).Funkce CDaoFieldExchange::AppendParamType funkce Zobrazit názvy jednotlivých typů.U DFX_Text, je použit typ text.AddToSelectList
SQL vytvoří Vyberte klauzule.To jsi přímým voláním DFX zadaný název sloupce je jednoduše připojeny ("SELECT <column name>, ...").BindField
Nejvíce komplexní operací.Jak bylo uvedeno dříve je kde používá strukturu vazby DAO GetRows nastaven.Jak je vidět z kódu v DFX_Text zahrnují typy informací ve struktuře použitý typ DAO (DAO_CHAR nebo DAO_WCHAR u DFX_Text).Navíc typ vazby se používá také nastaven.V předchozí části GetRows byl pouze stručně popsán, ale byl dostatečně popisují typ vazby se používá MFC je vždy vazbu adresy přímé (DAOBINDING_DIRECT).Navíc pro vazbu sloupce s proměnnou délkou (stejně jako DFX_Text) zpětné vazby se používá tak, že lze řídit přidělování paměti a určit adresu správnou délku MFC.To znamená že MFC vždy poznáte DAO "kde" dat, takže vazby přímo do proměnné členů.Zbytek struktury vazbu vyplněn jako adresu funkce zpětného volání přidělení paměti a typ sloupce vazby (vazba název sloupce).BindParam
Jedná se o jednoduché operace, která volá SetParamValue s hodnotou parametru určenou v svůj parametr člen.Opravu
Vyplní NULL stav každého pole.SetFieldNull
Tato operace pouze označí stav každého pole jako NULL a nastaví hodnotu proměnné členů na PSEUDO_NULL.SetDirtyField
Volání SetFieldValue pro každé pole označen za nečistý.
Zbývajících operací zabývat pouze použití mezipaměti data.Mezipaměť dat je navíc vyrovnávací paměti dat v aktuální záznam, který slouží k 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ěť využívá mapy.Mapa používá při párování až dynamicky přiřazené kopie dat s adresou "vázaná" pole (nebo CDaoRecordset odvozené datový člen).
AllocCache
Přidá do mapy a dynamicky přiděluje mezipaměti pole hodnota.FreeCache
Odstraní hodnotu pole v mezipaměti a odebere z mapy.StoreField
Aktuální hodnota pole se zkopíruje do mezipaměti data.LoadField
Hodnota uložená v mezipaměti se zkopíruje do pole členské.MarkForAddNew
Kontroluje, pokud je aktuální hodnota pole bez-NULL a označí dirty, pokud je to nutné.MarkForEdit
Porovná aktuální hodnoty pole s mezipaměť dat a označí dirty, pokud je to nutné.
Tip
Vaše vlastní rutiny DFX model na existující DFX rutiny pro standardní datové typy.