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