CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
||||||
|
||||||
Data Acces Objects
Data Acces Objects (DAO) furnizeaza un set bogat de obiecte, colectii, proprietati si metode care ne permit un acces in timpul rularii aplicatiei la Microsoft Jet, ODBC si servicii de baze de date. Multi utilizatori de Acces vad Microsoft Jet-ul si DAO-ul ca facand parte exclusiv din Microsoft Acces. In realitate DAO este doar o componenta care impreuna cu alte componente, formeaza o aplicatie Acces. Dar DAO este mult mai mult decat o parte a Microsoft Acces; este o componenta de acces si management de date disponibila din orice aplicatie care suporta Automation. Daca dorim un control prin program asupra datelor dintr-o baza de date din Microsoft Acces, Word, Microsoft Excel, Visual Basic sau din alte aplicatii, atunci acest acces il obtinem folosind DAO.
Rezumand cele spuse anterior, DAO poate fi caracterizat ca fiind o componenta "independenta de aplicatie" care furnizeaza o interfata prin program, in timpul rularii aplicatiei, cu Microsoft Jet-ul sau servicii de baze de date ODBC.
Interfata |
Versiune in care apare |
Capacitati majore |
nu are nume |
Visual Basic 2.0 |
Acces limitat la date, doar prin ODBC. |
DAO 1.0 |
Microsoft Access 1.0 |
Interfata la tabele si query-uri, obiect pentru a reprezenta tabele, dynaset-uri si snapshot-uri cu un numar limitat de proprietati. |
Data Access Objects 1.0 |
Visual Basic 3.0 |
S-au adaugat obiectele TableDef, QueryDef si Field. |
Data Access Objects 2.0 |
Microsoft Access 2.0 |
Introdus OLE Automation, acces total din program la aproape toata functionalitatea Microsoft Jet-ului. O ierarhie de obiecte bine pusa la punct, cu un set mare de obiecte si proprietati. |
Data Access Objects 2.5 |
ODBC Desktop Database Drivers |
Creat atat pentru platforme pe 16 si 32 de biti. Proiectat pentru folosirea cu ODBC Desktop Database Drivers 2.0. |
Data Access Objects 3.0 |
Microsoft Access pentru Win 95, Visual Basic 4.0 (32 bit), Microsoft Excel 7.0, Visual C++ |
Suporta o inerfata stand-alone pentru orice aplicatie gazda. |
Data Access Objects 3.5 |
Microsoft Access 97 pentru Win 95(98), |
Dezvoltare de aplicatii WWW pentru INTERNET sau INTRANET |
Tabel
II.1 O scurt` istorie DAO
DAO este implementat sub forma unei ierarhii de colectii si obiecte. Toate tabelele, campurile, indecsii, query-urile etc. sunt reprezentate ca obiecte organizate in colectii. Fiecare obiect are un set de proprietati care ii definesc caracteristicile si una sau mai multe metode pe care le putem folosi pentru a executa diferite operatii cu obiectele. In continuare, dorim sa prezentam fiecare colectie in parte, precum si obiectele pe care le contin.
Colecii de obiecte ce au propriet` ]i metode
In ierarhia DAO, toate obiectele sunt derivate dintr-un singur obiect care reprezint` motorul pentru baze de date din Microsoft Jet. Figura prezint` fiecare colecie care este derivat` din obiectul DBEngine.
DBEngine
DBEngine
Obiectul DBEngine reprezinta motorul de baze de date Microsoft Jet. Acest obiect contine si controleaza toate celelalte obiecte din ierarhia DAO; el nu are asociata nici o colectie.
Nota: La versiunile anterioare de 3.0, Microsoft Jet era limitat la 10 instante pe sistem, adica se puteau executa simultan pana la 10 aplicatii folosind Jet. Incepand cu versiunea 3.0, se pot rula atatea procese (executia de engine-uri, alte aplicatii etc.) cat ne permit resursele sistemului. In plus, in cadrul fiecarui proces putem avea pana la 64 de instante ale engine-ului. De exemplu, noi putem crea 64 de obiecte DBEngine in cadrul unei aplicatii.
}i folosind DAO pot apare erori. Insa acestea, in caz ca apar sunt stocate automat in colectia Errors, sub forma unor obiecte. Putem folosi aceste informatii pentru a determina ce a cauzat eroarea si pentru a afisa mesaje de eroare pentru utilizatorii aplicatiei. Este important de retinut ca la fiecare eroare DAO, colectia Errors este resetata si noul obiect Error este plasata in colectia Errors. La un moment dat pot exista mai multe obiecte Error in colectie, in cazul in care o singura operatie a provocat mai multe erori. Operatiile DAO care nu genereaza eroare, nu au nici un efect asupra colectiei Errors.
Un obiect Workspace exista pentru fiecare sesiune activa Jet. O sesiune descrie o secventa de operatii efectuate de engine. O sesiune incepe atunci cand un utilizator intra ca utilizator in sistem (log-in) si se termina cand utilizatorul paraseste sistemul (logout). Workspace-ul a fost creat astfel incat sa permita crearea unui "spatiu" utilizator/parola si a unui "spatiu" de tranzactii, in cadrul carora un anumit utilizator opereaza. Colectia Workspaces contine toate obiectele Workspace definite de Microsoft Jet-ul activ. Abilitatea de a crea workspace-uri multiple prin program este importanta, deoarece astfel ne putem loga la Microsoft Jet ca un alt utilizator. De exemplu, la inceperea sesiunii m-am logat ca fiind utilizatorul "Paul", iar din program sa ma logez din nou, ca fiind un alt utilizator: "Popescu", de exemplu. De asemenea, aceasta posibilitate de a crea mai multe workspace-uri este importanta si prin prisma faptului ca fiecare Workspace isi mentine tranzactiile independent de alte workspace-uri, astfel utilizarea mai multor workspace-uri putand fi utila atunci cand avem de administrat multiple seturi de tranzactii independente. Dar despre tranzactii vom vorbi ceva mai incolo.
Atunci cand pornim Microsoft Jet-ul, ceea ce se intampla depinde daca avem sau nu avem setata securitatea. Daca nu avem setata securitate, atunci Microsoft Jet-ul creaza automat un Workspace implicit, DBEngine.Workspaces(0). Valorile proprietatilor Name si UserName ale Workspace-ului implicit sunt "#Default Workspace" respectiv "Admin". Daca dorim sa folosim securitatea, atunci trebuie sa setam proprietatile SystemDB, DefaultUserName si DefaultPassword. Atunci cand folosim metoda OpenDatabase fara sa specificam un obiect Workspace, atunci obiectul DBEngine.Workspaces este creat implicit.
Microsoft Jet furnizeaza serviciu de securitate cu care ne putem proteja obiectele din baza de date. Modelul de securitate se bazeaza pe utilizatori si grupuri definite intr-o baza de date workgroup. Colectia Users contine toate obiectele User #Default Workspace# "and" Admin pentru un workspace. Un obiect User defineste un cont pentru utilizator; de asemenea fiecare obiect User are o colecaie Groups, care contine un obiect Group reprezentand fiecare grup de care apartine utilizatorul.
Ca si colectia Users, colectia Groups este folosita de Microsoft Jet in modelul de securitate pentru a controla accesul la obiecte. Colectia Groups defineste un grup de utilizatori in obiectul Workspace existent. Fiecare obiect Group are de asemenea o colectie Users care contine un obiect User pentru fiecare din utilizatorii in parte din grup.
In DAO, un obiect Database reprezinta o baza de date deschisa. Aceasta poate fi o baza de date nativa Microsoft Jet sau o baza de date externa. Putem avea mai multe baze de date deschise in acelasi timp, chiar baze de date de diferite tipuri. Colectia Databases contine toate obiectele Database pentru un workspace. In versiunea Microsoft Acces 2.0 si in versiunile anterioare, un numar de baze de date sunt deschise automat atunci cand deschidem baza de date cu interfata Microsoft Acces-ului. Acestea includ o serie de wizard-uri si biblioteci cu utilitare pe care Acces-ul le foloseste pentru a-si realiza propriile functii. Atunci cand deschidem o baza de date folosind interfata utilizator, adica selectand optiunea Open Database din meniul File. Acces-ul asigneaza aceasta baza de date la prima pozitie din colectia Databases, Databases(0). Celelalte baze de date pe care Acces-ul le deschide sunt folosite intern de Acces si nu fac parte din colectia Database. In Microsoft Acces pentru Windows 95, bazele de date de tip biblioteca sunt identificate prin referinte VBA, dar nu sunt incarcate pana nu sunt folosite prima data.
Microsoft Acces atribuie de asemenea obiectul implicit Workspace, Workspaces(0), utilizatorului care s-a logat.
Obiectul TableDef reprezinta o tabela care este salvata in baza de date. Acesta include tabele din baza de date curenta, precum si pe cele legate (cunoscute si sub numele de tabele atasate in versiunile anterioare de Microsoft Jet). Este important de retinut ca obiectele TableDef nu reprezinta date stocate in tabela - ele reprezinta structura unei tabele. Colectia TableDefs contine toate obiectele TableDef pentru o baza de date.
Obiectul QueryDefs reprezinta un query salvat in baza de date si mentine informatii despre proprietatile query-urilor, incluzand reprezentarea SQL. Colectia QueryDefs contine toate obiectele QueryDefs pentru o baza de date.
Obiectele Field definesc un anumit camp (sau coloana). Obiectele TableDef, QueryDef, Index, Relation si Recordset contin colectii Fields.
Colectie |
Descriere |
TableDefs |
Defineste campurile dintr-o tabela, dar nu contine date |
QueryDefs |
Defineste campurile dintr-un query, dar nu contine date |
Indexes |
Defineste caracteristicile acelor campuri care sunt indecsi in tabela |
Relations |
Defineste caracteristicile acelor campuri care fac parte dintr-o relatie |
Recordsets |
Definesc campurile care exista in tabelele sau query-urile pe care Recordset-ul este bazat |
Tabel
II.2. Explic` reprezentarea obiectului Field pentru fiecare tip de obiect care
conine o colecie Fields.
Cu query-urile Microsoft Jet-ului, putem defini parametri formali. Acesti parametri reprezinta valori necunoscute care trebuie sa fie furnizate de utilizatorul care ruleaza query-ul sau de programul care executa query-ul. Parametri formali ai unui query sunt reprezentati de obiecte Parameter in colectia Parameters a QueryDef-ului.
Obiectul Recordsets este diferit de obiectele DAO prezentate pana acum, prin faptul ca acesta exista atata timp cat aplicatia ruleaza. Un obiect Recordset reprezinta, in memorie, un set de articole din una sau mai multe tabele. Obiectele Recordset sunt unele dintre cele mai puternice construite in Microsoft Jet, deoarece acestea ne permit sa accesam din program nu numai tabele native Microsoft Jet, ci si tabele ISAM, cum ar fi Microsoft FoxPro sau surse de date ODBC, cum ar fi Microsoft SQL Server. In plus, oiectele Recordset pot fi bazate pe query-uri care contin multiple tabele din surse eterogene.
Colectia Recordsets contine toate obiectele Recordset deschise in obiectul Database curent. Subliniem inca o data, ca obiectele Recordset sunt obiecte pe care le putem deschide doar din cod. De exemplu, cand dorim sa vizualizam o tabela in Acces cu ajutorul interfetei utilizator, atunci aceasta tabela nu este un obiect Recordset. In acest caz, Microsoft Jet creaza un obiect recordset pentru a accesa datele, dar acest recordset nu face parte din colectia Recordsets.
Microsoft Jet furnizeaza facilitati puternice de integritate relationala si referentiala, folosind relatiile. Un obiect Relation reprezinta o relatie intre coloanele dintre doua sau mai multe tabele. Colectia Relations contine toate obiectele Relation pentru un obiect Database dat.
Una dintre cerintele importante ale engine-ului este faptul ca trebuie sa pastreze independenta aplicatiei: engine-ul nu trebuie sa fie specific unei anumite aplicatii. In orice caz, Microsoft Jet furnizeaza o colectie de obiecte si obiecte generice, astfel incat o aplicatie poate sa-si stocheze obiectele in baza de date. Acest obiect generic este cunoscut ca fiind un container. Colectia Containers pastreaza toate obiectele container pentru un obiect DataBase. Ca un exemplu, Microsoft Acces se bazeaza pe Microsoft Jet pentru a-i stoca obiectele specifice aplicatiei, cum ar fi form-urile, macro-urile si modulele. Microsoft Jet stocheaza aceste obiecte straine cu ajutorul colectiei Containers.
Obiectul Document reprezinta un anumit obiect in colectia Documents. In paragraful anterior am dat un exemplu in care Microsoft Acces folosea colectia Containers pentru a-si organiza propriile obiecte. Obiectul Document stocheaza o instanta specifica a unui obiect specific aplicatiei. De exemplu, cand Microsoft Acces creaza o baza de date, el creaza o varietate de obiecte Container, un obiect pentru form-uri, altul pentru rapoarte etc. Cum utilizatorul creaza form-uri (machete), acestea sunt stocate in obiecte Document individuale in containerul Forms adaugat bazei de date de Microsoft Acces.
Fiecare obiect DAO are o colectie Properties. Un obiect Property contine informatii caracteristice unui anumit obiect. Noi putem citi valorile acestor proprietati pentru a obtine informatii despre un anumit obiect sau putem seta o proprietate pentru a defini caracteristicile obiectului. De asemenea, putem sa ne definim propriile proprietati.
Cu aceasta descriere destul de detaliata, credem noi, speram ca asi inteles cat de cat ce este DAO si ce putem face cu el. Citind in continuare materialul, speram sa intelegeti si mai bine.
Fundamentele DAO
Acum, fiind familiarizati cu tipurile de obiecte reprezentate in DAO este timpul sa trecem la bazele utilizarii DAO. In ceea ce urmeaza, vom prezenta cum se lucreaza cu obiectele si colectiile DAO, cum sa referim aceste obiecte si cum sa reprezentam obiecte utilizand variabile.
Asa dupa cum am vazut din discutarea ierarhiei DAO, conceptele de obiect si colectie sunt foarte importante. Cele mai multe tipuri de obiecte au colectii ce contin fiecare dintre tipurile membrilor. De exemplu, colectia TableDefs reprezinta un set al tuturor obiectelor tabela din baza de date si contine toate obiectele individuale TableDefs. De obicei, ne referim la un obiect prin ierarhia de colectie; se porneste cu obiectul DBEngine apoi se continua calea prin ierarhie:
DBEngine. ColectiaParinte. ColectiaFiu!Nume
Exista patru forme sintactice utilizate pentru a face referire la un obiect dintr-o colectie:
Colectia!Nume, sau Colectia!/[Numes/ daca obiectul Nume contine caractere non-standard, cum ar fi spatiile de exemplu.
Colectia("Nume")
Colectia(string) unde string este o expresie sau o variabila ce contine numele obiectului.
Colectia(index) unde index este pozitia obiectului in cadrul colectiei.
Utilizand prima forma, sintaxa Colectia!Nume sau Colectia!/[Numes/, va puteti referi direct la un obiect prin numele sau. Aceasta forma este mai compacta si face ca referirile lungi ale unor obiecte sa fie mai usor de citit decat in alte forme. De exemplu, comparati cele doua referiri care urmeaza:
TableDefs("Clienti").Indexes("PrimaryKey").Fields("Nume")
TableDefs! Clienti.Indexes!PrimaryKey.Fields!Nume
Cu forma a doua, sintaxa Colectia("Nume"), puteti sa referiti un obiect utilizand o expresie string. Urmatoarele doua exemple sunt echivalente:
TableDefs("Clienti")
TableDefs("Clie" & "nti")
Utilizand forma a treia, sintaxa Colectia(string), puteti referi un obiect utilizand o variabila:
Dim strNume As String
StrNume = "Clienti"
TableDefs(strNume)
Cu forma a patra, sintaxa Colectia(index), puteti face referire la un obiect in functie de pozitia sa in colectie. De exemplu:
'Tipareste primele zece nume TableDef,
For intX = 0 To 9
Debug.Print Workspace(0).Databases(0).TableDefs(intX).Name
Next intX
Indecsii in colectiile DAO sunt bazati pe zero, adica primul element intr-o colectie este zero.
Utilizarea sintaxei semn de exclamare (!) si punct (.)
In sintaxa DAO, cand se face referire la un obiect, acesta se desparte de celalalt obiect la care se refera utilizand caracterul semn de exclamare (!) sau caracterul punct (.). Utilizarea unuia sau a altuia din cele doua caractere depinde de contextul in care se utilizeaza.
Folositi punctul pentru a face referire la un membru sau la o proprietate care este creata cu Microsoft Jet.
Folositi semnul exclamarii pentru a va referi la un membru sau o proprietate pe care ati creat-o dvs. singuri.
Determinarea limitelor colectiilor
In exemplul anterior, care listeaza numele primelor 10 TableDef-uri, se presupune ca exista cel putin 10 tabele in baza de date si aceasta secventa nu ofera posibilitatea de a afisa toate numele tabelelor. Daca se lucreaza efectiv cu colectii, este important de inteles cum sunt acestea ordonate si cum se pot determina limitele lor.
Pentru a determina limitele colectiilor, se poate folosi proprietatea Count a colectiilor. Valoarea acestei proprietati reflecta numarul de obiecte din colectia respectiva, de exemplu daca proprietatea Count a unei colectii are valoarea 6 atunci vor fi 6 obiecte in colectia respectiva. Datorita faptului ca colectiile DAO sunt bazate-zero, adica primul obiect din colectie va ocupa pozitia 0, cand se va face comparatia cu indexul pozitiei curente va trebui sa se scada din Count valoarea 1. Urmatorul exemplu va tipari numele tuturor tabelelor din baza de date folosind proprietatea Count.
For intX = 0 to Workspaces (0).Databases (0) TableDefs. Count - 1
Debug. Print Workspaces (0).Databases (0) TableDefs (intX). Name
Next intX
In acest exemplu se observa cum se scade 1 din proprietatea Count pentru a functiona corect comparatia. Aceasta problema se poate evita folosind structura For Each in locul ciclului For.Next. Urmatoarea secventa de cod realizeaza acelasi lucru ca cea anterioara, dar acum nu se mai verifica explicit limitele colectiei.
For Each tb1 In Workspaces (0). Databases (0).TableDefs
Debug. tb1.Name
Next tb1
Cand unul din obiecte este sters, proprietatea Count pentru colectia respectiva este decrementata.
Colectii implicite
Aproape toate obiectele DAO au colectii implicite. De exemplu, colectia implicita pentru obiectul Workspace este Databases. Folosind sintaxa normala, se poate face referire la o baza de date in urmatorul mod: DBEngine.Workspaces(0).Databases(0). Folosind colectiile implicite ale obiectului Workspace aceasta linie se poate scrie mai scurt astfel: DBEngine.Workspaces(0). De asemenea, colectia implicita a obiectului DBEngine este Workspaces si folosind acest lucru linia de mai sus se poate scrie intr-o forma si mai scurta: DBEngine(0).
In tabelul de mai jos sunt incluse lista obiectelor DAO si colectiile implicite.
Obiect DAO |
Colectie implicita |
DBEngine |
Workspaces |
Workspace |
Databases |
User |
Groups |
Group |
Users |
Database |
TableDefs |
Recordset |
Fields |
TableDef |
Fields |
QueryDef |
Parameters |
Index |
Fields |
Relation |
Fields |
Container |
Documents |
Setarea si utilizarea variabilelor obiect
Lucrul cu DAO poate duce uneori la situatia ca secventele de cod sa devina greoaie datorita referirii dese la obiecte prin specificarea pozitiei lor in cadrul ierarhiei DAO. De exemplu, vom considera secventa de cod ce afiseaza numele tuturor campurilor din tabela Clienti:
Function AfisareNumeCampuri()
Dim intX As Integer
For intX = 0 To DBEngine(0) (0).TableDefs("Clienti"). Fields.Count - 1
Debug.Print DBEngine(0) (0).TableDefs("Clienti"). Fields(intX).Name
Next intX
End Function
Acest tip de programare prezinta doua dezavantaje. Primul este acela ca trebuie introduse si intretinute linii de cod lungi datorita referirii la obiecte. A doua problema consta in faptul ca performanta aplicatiei va suferi, pentru ca fiecare referinta din cadrul ierarhiei este parcursa si rezolvata. Solutia acestor probleme este utilizarea variabilelor obiect.
Variabilele obiect sunt un tip special de variabile suportate de VBA; prin utilizarea lor se seteaza referinta spre obiect doar o data iar apoi se va face referirea la variabila obiect in locul unei referiri explicite in ierarhia DAO. Fiecarui tip de obiect DAO ii corespunde un tip de variabila obiect. De exemplu, obiectului Workspace ii corespunde o variabila obiect de tip workspace, obiectului Database ii corespunde o variabila de tip database s.a.m.d. Pentru utilizarea variabilelor obiect, trebuie declarat prima data tipul de variabila, iar apoi ii trebuie asociat un obiect. Forma generala a declaratiei este:
Dim NumeVariabila As NumeObiect
Set NumeVaraiabila = ObiectDAO
Folosind variabilele obiect, exemplul anterior se va modifica astfel:
Function AfisareImbunatatitaNumeCampuri ()
Dim intX as Integer
Dim tb1Clienti As TableDef
Set tb1Clienti =DBEngine(0).(0).TableDefs("Clienti")
For intX=0 To tb1Clienti.Fields.Count - 1
Debug.Print tb1Clienti.Fields(intX).Name
Next intX
End Function
Comparand cele doua variante de cod vom observa ca variabilele obiect permit un stil de programare ce reduce numarul de referinte directe la obiecte, iar codul este usor de citit si de intretinut. In plus, pentru ca Microsoft Jet face o referinta la tabela Clienti doar o singura data, codul va rula mai repede. Este important de retinut ca variabilele obiect difera de variabilele obisnuite, pentru ca ele nu au o valoare intrinseca, ci fac referire la reprezentarea unui obiect din memorie; de asemenea, toate variabilele obiect ce sunt atasate unui obiect fac referire la aceasta instanta.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2361
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved