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.