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
|