Seriál - 12. díl
Databáze - 4. část
14. Databáze
14.4 Prvek ADO Data a datové prvky s ním spolupracující
14.5 ADO pomocí kódu
Databáze
Množina záznamů
14. Databáze
Dnešní díl, poslední týkající se databází, bude o druhém objektovém modelu ve Visual Basicu, ADO (Active Data
Objects). Nejdříve si ukážeme práci s prvkem ADO Data, který slouží ke stejnému účelu jako prvek Data (DAO), až na to,
že používá jiné techniky samotného přístupu k datům. Dále si ukážeme práci s databází pouze pomocí kódu,
jen pomocí objektů ADO.
Oproti minulým dvěma dílům jsme spojili vše dohromady, tj. i prvky i pouze kód, protože spousta technik je u DAO
i u ADO stejná a ukážeme si spíše rozdíly.
14.4 Prvek ADO Data a datové prvky s ním spolupracující
Povídání o těchto prvcích nebude příliš dlouhé, neboť práce s nimi je velmi podobná práci s prvky spolupracujícími s DAO.
Prvek ADO Data musíte do projektu přidat pomocí dialogu z nabídky Project -> Components, položka Microsoft
ADO Data Control.
Nastavení databáze se provádí vlastností ConnectionString . Pokud se v ADO umíte už více
pohybovat (to ale asi nečtete tento seriál), můžete jej zadat sami. Určuje providera (knihovnu), cestu k databázi, uživatele, heslo atd. (bližší informace v kapitole 14.5). Jednodušší je však použít průvodce, který se spustí
kliknutím na tlačítko u vlastnosti ConnectionString . Tento vám nabídne buď připojení na soubor, který
obsahuje informace o spojení, ODBC zdroj nebo přímo tvorbu řetězce připojení, neboli ConnectionString. Chcete-li
jej tedy vytvořit, klikněte na tlačítko Build. Zde už nemá moc cenu popisovat další kroky, protože jsou jiné
pro každého providera. Např. pro databázi MS Access stačí vybrat providera Microsoft Jet 3.51 OLE DB Provider, kliknout
na tlačítko další, vybrat cestu k databázi, zadat uživatele a hotovo.
Po nastavení databáze musíte také určit, s jakým zdrojem dat bude prvek pracovat a to pomocí vlastnosti RecordSource . Opět máte možnost využít průvodce. Můžete si vybrat mezi tabulkou, SQL dotazem nebo uloženou
procedurou (v Accessu dotazem).
Dále už je práce s tímto prvkem stejná (samozřejmě až na jiné vlastnosti v chování apod.). Použití ostatních prvků
ve spojení s databází je také stejné jako u DAO. Pouze místo prvků DBList, DBCombo a DBGrid musíte použít nové,
navržené speciálně pro ADO. Najdete jej v prvcích (Project -> Components) pod položkami Microsoft
DataList Controls 6.0 (OLEDB) a Microsoft DataGrid Control 6.0 (OLEDB).
14.5 ADO pomocí kódu
ADO je podobně jako DAO poskytuje vývojářům objektový model pro přístup k databázím. Tento vychází ze starších technologií, a to z již zmíněného DAO (i RDO) a je mnohem univerzálnější a rychlejší. Nevýhodou objektové knihovny ADO je, že přímo neposkytuje možnost pro vytváření a úpravy databáze a slouží tedy pouze pro práci s daty v již vytvořené databázi. Pokud tedy chcete pracovat se strukturou databáze, můžete tak učinit buď pomocí jazyka SQL nebo pomocí knihovny
Microsfto ADO Extension 2.1 for DDL and Security. Tu získáte buď instalací Microsoft Office 2000 nebo instalací
nové verze MDAC, kterou najdete na Internetu Microsoftu.
Rozdíly od DAO, o kterém jsme si psali v předchozích kapitolách, vám mohou někdy činit problémy, a to nejen díky odlišnému pojmenování, ale také odlišnému způsobu používání, který dává objektům ADO větší nezávislost.
Než začneme pracovat s ADO pomocí kódu, musíme nastavit odkaz na jeho objektovou knihovnu. Klikněte na menu Project a zde zvolte položku References. Ve zobrazeném okně zatrhněte ve výběru knihovnu Microsoft Activex Data Objects 2.0 Library (můžete narazit i na verzi 2.1 což není na překážku). A nyní se můžete pustit do poznávání ADO.
Databáze
Když se podíváme na objektový model DAO, vyčteme z něj, že na nejvyšším místě je objekt DBEngine a dále v pořadí je WorkSpace , Database atd. Chceme-li vytvořit podřízený objekt voláme metodu objektu nadřazeného, která vytvoří objekt daného typu a do zadané proměnné vrátí odkaz na něj. U ADO tomu tak není. Zde již při deklaraci proměnné vytvoříme skutečný objekt (pomocí fráze New ) a poté pomocí jeho vlastní metody jej můžeme svázat s daty v libovoné databázi. Tím se objekty stávají více nezávislými. Například otevřenou databázi nenajdete v kolekci Databases připadající pod příslušný pracovní prostor (Workspace ). Ekvivalenty k objektům DBEngine nebo WorkSpace zde navíc vůbec nenajdete.
Ekvivalentem k Database v DAO je objekt Connection . Pomocí jeho metody Open otevřeme existující databázi.
Dim db As New ADODB.Connection
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\mydb.mdb", "Admin", ""
V první části připojovacího řetězce, který je použit jako parametr metody open, je specifikován ovladač, který zprostředkovává přístup ADO, k danému typu dat. V našem případě je to Microsoft Jet ve verzi 3.51. Verzi, kterou v řetězci napíšete zavisí na verzi kterou máte nainstalovánu. Můžete se setkat i s jinými verzemi, např. 4.0.
Jelikož ADO nemá objekt Workspace ani nic podobného, je přihlášení zadáváno při otevírání datbáze pomocí objektu Connection . V druhém parametru metody Open je zadáno jméno uživatele a ve třetím heslo. Přihlašovací jméno a heslo lze zadávat i v připojovacím řetězci, pokud je však zadáte ve druhém a třetím parametru, mají tyto vyšší prioritu.
Zpět na obsah
Množina záznamů
Stejně jako u DAO slouží pro reprezentaci množiny záznamů třída s názvem Recordset . Otevření, podobně jako u objektu typu Connection , provedeme pomocí jeho vlastní metody Open . Při tom nesmíme zapomenout na to, aby byla proměnná deklarována s klíčovým slovem New . V následujícícm kódu si můžete všimnout jak je zajištěna návaznost množiny záznamů na objekt typu Connection . Toto je zajištěno pomocí druhého parametru, kde je předána otevřená databáze.
Dim db As New ADODB.Connection
Dim rs As New ADODB.Recordset
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=mydb.mdb"
rs.Open "Tabulka", db, adOpenKeyset, adLockOptimistic
V prvním parametru se může nalézat libovolná proměnná, která specifikuje data, která se mají v množině záznamů nacházet. Může to být jak název tabulky nebo SQL dotaz, tak i název uloženého dotazu nebo objekt typu Command . Třetí parametr obsahuje typ Recordsetu .
Název typu |
Nastavení |
Popis |
Dynamic |
adOpenDynamic |
Tento typ umožňuje vidět veškeré změny prováděné ostatními uživateli a to včetně přidávaných a odebíraných záznamů. |
Keyset |
adOpenKeyset |
Podobně jako typ Dynamic s tím rozdílem, že nejsou vidět nové záznamy, přidané jinými uživateli. |
Static |
adOpenStatic |
Tento typ nereflektuje změny prováděné ostatními uživateli. Jedná se o statickou kopii, která může posloužit k procházení záznamů a zpracování informací v nich uložených. |
ForwardOnly |
adOpenForwardOnly |
Tento typ je stejný jako typ Static s tím rozdílem, že záznamy je možné projít pouze v jednom směru, a to dopředu. |
V uvedené tabulce se nachází obecný a stručný popis jednotlivých typů. Ovšem ne vždy budou platit všechny charakteristiky, které jsou uvedeny. Problém je v tom, že dané možnosti (a to platí i pro mnohé další metody a vlastnosti) musí podporovat ovladače, pomocí kterých byla otevřena svázaná databáze. Něteré záležitosti proto nemusí být vůbec podporovány nebo fungují pouze částečně. Například použijte-li typ Dynamic u Microsoft Jet 3.51 (i 3.6) se ještě projeví změny v existujících záznamech nebo u smazaných záznamů vyskočí chyba (kterou je možné zachytit a patřičně se podle toho zařídit), ale nikdy se nedočkáte toho, že vám budou přibývat v množině záznamů záznamy nově přidané jinými uživateli. Tím vlastně dospějete k typu Keyset.
Práce s typem Recordset u ADO je velice podobná s DAO. Pro pohyb vpřed, vzad, na konec a na začátek použijete metod MoveNext , MovePrevious , MoveLast a MoveFirst . Metody FindFirst , FindNext atd. jsou nahrazeny jedinou metodou Find . Záznamy jsou pomocí ní vyhledávány od aktuální pozice ve směru zadaném ve třetím parametru (implicitní nastavení je vpřed). Získávání a nastavování hodnot položek množiny záznamů je stejný jako u DAO.
Co se týče změn v záznamech fungují zde stejné metody pro přidání záznamu (AddNew ), smazání záznamu (Delete ), potvrzení a zrušení provedených změn (Update a CancelUpdate ). Jediným rozdílem, který trochu zjednodušuje změny hodnot v záznamech, je vynechání metody Edit . Změny můžete začít provádět přímo aniž by jste museli volat tuto metodu nebo něco podobného. Výsledek pak stačí potvrdit pomocí metody Update .
Aby jste dobře pochopili rozdíly, které jsou mezi ADO a DAO, vytvoříme si tentokrát příklad, který bude identicky s tím, který se nacházel v minulém díle. Rozdíl zde samozřejmě bude, a to v použité technologii, kterou tentokrát bude ADO. Sami uvidíte, že se nejedná o nic složitého a že se tím některé postupy zjednodušili a mnoho zůstalo nezměněno. Příklad naleznete zde.
První změny se týkají události Load formuláře, a to z toho důvodu že je zde otevíráná databáze a Recordset se zaměstnanci.
Private db As New ADODB.Connection
Private rsZam As New ADODB.Recordset
Private Sub Form_Load()
Dim dotaz As String
db.Open "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=" & App.Path & "\data.mdb", "Admin", ""
dotaz = "SELECT * FROM Zamestnanci"
rsZam.Open dotaz, db, adOpenKeyset, adLockOptimistic
Kontrola
Vypln
End Sub
Jak je vidět je tu použito toho co bylo zmíněno v předchozím výkladu. Na další změnu narazíte při vytváření nového záznamu. Nejen, že přidáte-li nový záznam pozice v množině záznamů se na něj nastaví a zůstane zde i po případném zavolání metody Update , ale metodu Update už není třeba vůbec volat. Kód pro přidávání záznamů se nám tím značně zredukoval.
Private Sub cmdNovy_Click()
rsZam.AddNew
Kontrola
Vypln
txtJmeno.SetFocus
End Sub
Další úpravou, kterou je nutné provést v procedurách pro vyplnění políček a vypínání či zapínání tlačítek, je kontrola toho jestli je v Recordsetu nějaký záznam. Jelikož některé typy (Dynamic a ForwardOnly) nepodporují tuto vlastnost je pro větší univerzálnost použit způsob, který kontroluje zdali se aktuální pozice nachází zároveň na začátku a na konci.
Private Sub Vypln()
Dim prazdny As Boolean
prazdny = (rsZam.BOF And rsZam.EOF)
...
Private Sub Kontrola()
Dim zapnout As Boolean
zapnout = Not (rsZam.BOF And rsZam.EOF)
...
Poslední úpravou, která je nutná pro to aby příklad fungoval i v ADO se nachází v proceduře Zmena , kde je vynecháno volání metody Edit . Do příkladu bylo navíc doplněno jedno vylepšení. V příkladu, který byl uveden minule, docházelo k aktualizaci údajů v databázi i v případě kdy v textovém poli k žádné změně nedošlo.
Private Changed As Boolean
Private Sub Zmena(sloupec As String, hodnota As Variant)
If Not (rsZam.BOF Or rsZam.EOF) And Changed Then
rsZam(sloupec) = hodnota
rsZam.Update
Changed = False
End If
End Sub
Private Sub txtJmeno_Change()
Changed = True
End Sub
Private Sub txtPrijmeni_Change()
Changed = True
End Sub
Private Sub txtRC_Change()
Changed = True
End Sub
Zpět na obsah
|