Un obiect CDaoDatabase reprezinta o conexiune la o baza de date prin care se poate opera cu datele stocate intr-un anumit format. Pot exista unul sau mai multe obiecte CDaoDatabase active la un moment dat intr-o aplicatie, reprezentata de un obiect CDaoWorkspace. Aplicatia intretine o colectie de obiecte baza de date deschisa, numita colectie de baze de date.
Clasele de baze de date MFC DAO sunt distincte de clasele bazelor de date MFC ODBC. Clasa CDaoDatabase ofera o interfata similara cu cea a clasei CDatabase a ODBC. Diferenta pricipala consta in aceea ca CDaoDatabase acceseaza obiectele tip baza de date prin Data Access Objects (DAO) al motorului de baze de date Microsoft Jet. In general, clasele MFC DAO sunt mai eficiente decat clasele ODBC - clasele bazate pe DAO pot accesa date, inclusiv prin driverele ODBC, prin propiul motor de baze de date. DAO suporta de asemenea operatiile Data Definition Language (DDL), cum ar fi adaugarea de tabele cu ajutorul claselor, fara a se apela direct DAO.
Se pot crea implicit obiecte baze de date, cand se creaza obiectele recordset. Dar se pot crea obiecte baze de date in mod explicit. Pentru a folosi o baza de date existenta, se procedeaza astfel :
-se construieste un obiect CDaoDatabase, pasandu-se un pointer la un obiect CDaoWorkspace deschis;
-sau, se construieste un oboiect CDaoDatabase fara a se specifica spatiul de lucru (MFC creaza un spatiu de lucru temporar).
Pentru a crea un obiect Microsoft Jet (*.MDB) nou, se construieste un obiect CDaoDatabase si se apeleaza functia membru Create. Nu se apeleaza Open dupa Create.
Pentru a deschide o baza de date existenta, se construieste un obiect CDaoDatabase si se apeleaza functia membru Open.
Oricare dintre aceste tehnici adauga obiectul baza de date DAO la spatiul de lucru al colectiei de baze de date si deschide o conexiune catre date. Cand se construieste obiectul CDaoRecordset, CDaoTableDef, sau CDaoQueryDef pentru operare la o baza de date conectata, se paseaza constructorilor acestor obiecte un pointer la obiectul CDaoDatabase. Cand s-a terminat folosirea conexiunii, se apeleaza functia membru Close si se distruge obiectu 343h75d l CDaoDatabase. Functia Close inchide orice recordset care nu a fost inchis anterior.
Baze de date accesabile cu DAO
Folosind DAO si clasele MFC DAO, pot fi accesate urmatoarele surse de date :
-baze de date care folosesc Microsoft Jet, create cu Microsoft Access sau Microsoft Visual Basic, versiunile 1.x, 2.x, 3.0 ale motorului de baze de date.
-baze de date ISAM instalabile, incluzand Microsoft FoxPro 2.0, 2.5, si 2.6 (se pot importa/exporta din/spre versiunea 3.0, dar nu se pot crea obiecte), dBase III, dBase IV si dBase 5.0, Paradox 3.0, 4.0, 5.0.
-baze de date Open Database Connectivity (ODBC), incluzand Microsoft SQL Server, SYBASE SQL Server si ORACLE Server. Pentru a accesa o baza de date ODBC, trebuie un driver ODBC potrivit bazei de date dorite a fi accesate.
-Microsoft Excel 3.0, 4.0, si 7.0.
-Lotus WKS, WK1, WK3, si WK4.
-fisiere text.
DAO este cel mai bine folosit cu bazele de date pe care Microsoft Jet le poate citi. Asta include tot ce a fost indicat mai sus, exceptand sursele de date ODBC. Cea mai buna performanta este obtinuta cu bazele de date Microsoft Jet (.MDB). Atasarea de tabele externe, in special surse de date ODBC, la o baza de date .MDB este mult mai eficient decat deschiderea bazei de date externe direct prin clasele MFC DAO.
In DAO fiecare obiect de tip spatiu de lucru contine o colectie de baze de date deschise si fiecare obiect DAO baza de date contine o colectie de tabele, interogari, inregistrari si relatii. Colectiile DAO nu sunt colectii in sensul claselor MFC. Ele sunt parte integranta a DAO. MFC expune toate colectiile bazelor de date, exceptie face colectia de recordset-uri. In MFC, exista un obiect CDaoRecordset explicit pentru fiecare recordset creat si depinde doar de programator urmarirea acestora.
CDaoDatabase permite :
-creare de noi baze de date Microsoft Jet.
-stocare de obiecte tabela-definitie folosite pentru manipularea tabelelor bazei de date.
-stocare de obiecte interogari-definitie pentru folosirea ulterioara a interogarilor.
-lucru cu datele intr-o baza de date locala sau in retea.
-lucrul cu colectia bazei de date.
Baza de date exista in memorie pe durata unei sesiuni a motorului de baze de date. Cand sesiunea se termina, spatiul de lucru, colectia din spatiul de lucru, colectia de baze de date deschisa si obiectele tip baza de date din colectie inceteaza sa existe. Aceste obiecte soft nu sunt stocate pe harddisk sau intr-o baza de date. Cand se incepe cu o noua sesiune a motorului de baza de date si se doreste folosirea spatiilor de lucru si a bazelor de date folosite in ultima sesiune, trebuie recreat orice obiect spatiu de lucru explicit, si redeschise orice baza de date folosita in spatiul de lucru.
Date membru ale clasei CDaoDatabase
m_pWorkspace - pointer la un obiect CDaoWorkspace care contine baza de date si defineste spatiul tranzactiilor.
m_pDaoDatabase - pointer la un obiect baza de date legat cu DAO.
CDaoDatabase - construieste un obiect CDaoDatabase. Dupa construirea obiectului, daca se creaza o baza de date Microsoft Jet noua, se apeleaza functia membru Create. Daca se deschide o baza de date existenta, se apeleaza functia membru Open. Dupa terminarea utilizarii obiectului, se apeleaza functia membru Close si se distruge obiectul CDaoDatabase.
CanTransact - returneaza nonzero daca baza de date suporta tranzactiile.
CanUpdate - returneaza nonzero daca obiectul CDaoDatabase poate fi modificat.
GetConnect - returneaza sirul de conectare folosit intre obiectul CDaoDatabase si o baza de date. Este folosit pentru ODBC.
GetName - returneaza numele bazei de date folosite in mod curent.
GetQueryTimeout - returneaza numarul de secunde dupa care operatiile de interogare vor expira. Afecteaza toate operatiile de deschidere, adaugare, modificare si editare si alte operatii cu surse de date ODBC cum ar fi apelurile functiei Execute.
GetRecordsAffected - returneaza numarul de inregistrari afectate de ultima improspatare a datelor,editare sau adaugare sau un apel Execute.
GetVersion - returneaza versiunea motorului de baze de date asociat cu o baza de date.
IsOpen - returneaza nonzero daca obiectul CDaoDatabase este conectat momentan la o baza de date.
SetQueryTimeout - seteaza numarul de secunde dupa care operatiile de interogare (pe sursa ODBC doar) vor expira. Afecteaza toate operatiile de deschidere, editare, adaugare, stergere.
Close - inchide conexiunea la baza de date.
Create - creaza o legatura intre obiectul DAO si baza de date si initializeaza obeictul CDaoDatabase.
CreateRelation - defineste o relatie noua intre tabelele unei baze de date.
DeleteQueryDef - sterge un obiect definitie de interogare salvat in colectia bazei de date QueryDefs.
DeleteRelation - sterge o relatie existenta intre doua tabele din baza de date.
DeleteTableDef - sterge definitia unei tabele din baza de date. Acesta sterge definitia tabelei si toate datele ei.
Execute - executa o interogare. Executarea unei interogari care returneaza rezultate va genera o exceptie.
GetQueryDefCount - returneaza numarul de interogari definite pentru baza de date.
GetQueryDefInfo - returneaza informatii despre o interogare specificata definita in baza de date.
GetRelationCount - returneaza numarul de relatii intre tabelele unei baze de date.
GetRelationInfo - returneaza informatii despre o relatie specificata inter tavele in baza de date.
GetTableDefCount - returneaza numartul de tabele definite in baza de date
GetTableDefInfo - returneaza informatii despre o tabela specificata din baza de date.
Open - stabileste o conexiune la o baza de date.
Spatiul de lucru
Un spatiu de lucru DAO, reprezentat in MFC de clasa CDaoWorkspace, intretine o sesiune cu motorul de baze de date Microsoft Jet. Un spatiu de lucru poate contine unul sau mai multe obiecte deschise tip baza de date DAO, repezentate in aplicatie implicit sau explicit, de obiectul CDaoDatabase. In DAO, spatiile de lucru intretin un singur spatiu de tranzactionare in care orice tranzactie se aplica tuturor bazelor de date si inregistrarilor dechise. Spatiul de lucru DAO intretine si securitatea bazei de date.
In MFC, spatiile de lucru sunt in primul rand spatii de tranzactionare; MFC nu expune facilitatile de securitate DAO, putand fi programate prin apel direct DAO.
In DAO, un obiect separat DBEngine intretine proprietatile unei singure instante a motorului de baze de date Microsoft Jet legand multiple spatii dechise. In MFC, accesul la proprietatile motorului de baze de date se fac prin functiile membrii statici ai CDaoWorkspace.
In DAO :
-obiectul DBEngine contine o "colectie" de spatii de lucru deschise, numite spatii colectii.
-fiecare obiect spatiu de lucru DAO contine colectii de baze de date deschise, useri activi, si grupuri active de useri.
In MFC, accesul atat la colectie spatiiilor de lucru ale DBEngine si colectia de baze de date a oricarui spatiu este facuta prin functii membru a obictului CDaoWorkspace. MFC nu furnizeaza acces direct la colectia utilizatorilor sau colectia grupurilor, care sunt parte din suportul de securitate DAO; si MFC nu expune facilitatile de securitate DAO.
In DAO, primul spatiu de lucru apelat din colectia de spatii de lucru este spatiul de lucru predefinit. Prin definitie, daca se deschide o baza de date, ea exista in spatiul predefinit de lucru. In MFC, daca se deschide o baza de date fara a specifica spatiul de lucru, sau se deschide un recordset fara a specifica un obiect baza de date, MFC implicit foloseste legatura DAO catre spatiul de lucru predefinit.
Rareori trebuie creat explicit un obiect CDaoWorkspace, dar se pot crea explicit aceste obiecte daca sunt necesare in activitatea aplicatiei.
CDaoWorkspace furnizeaza :
-acces explicit la spatiul DAO predefinit de lucru.
-acces la colectia de spatii de lucru sau la colectia predefinita de baze de date a spatiului de lucru.
-un spatiu separat de tranzactii daca se doreste separarea tranzacttilor pentru o baza de date fata de tranzactiile altei baze de date.
-acces la proprietatile unui motor de baze de date.
MFC creaza implicit un obiect CDaoWorkspace, spatiul legat DAO, cand :
-construieste un obiect CDaoDatabase fara a specifica spatiul de lucru.
-construieste un obiect CDaoRecordset fara a specifica baza de date.
Spatiile de lucru exista in memorie pe durata timpului de viata a sesiunii motorului de baze de date. Cand sesiunea se termina, spatiul de lucru predefinit, colectia de spatii de lucru, si colectia de baze de date a oricarui spatiu de lucru inceteaza sa existe Aceste obiecte software nu sunt stocate pe harddisk sau intr-o baza de date.
Un scenariu tipic in spatiul de lucru
In majoritatea aplicatiilor cu date de acces, se lucreaza la un nivel inferior celui la care lucreaza o baza de date sau un recordset. Ar putea parea un lucru normal construirea explicita a obiectului CDaoWorkspace, apoi din el construirea unui obiect CDaoDatabase, apoi construirea unui obiect CDaoRecorset, CDaoQueryDef, si CDaoTableDef. Dar cea mai tipica modalitate este una din urmatoarele :
-construirea unui obiect CDaoDatabase, probabil stocat intr-o clasa derivata din CDocument. Apoi din acest obiect se construiesc obiectele recordset necesare si celelalte obiecte. Se va proceda astfel daca se doreste mentinerea o conexiune la o singura baza de date pe durata aplicatiei sau pe durata de viata a documentului.
-construirea de recordset-uri necesare, lasand in seama MFC sa creeze obiectele CDaoDatabase si CDaoWorkspace necesare. Se va proceda astfel daca se prefera construirea de recordset-uri pentru functii scop, de exemplu executia unei interogari bazate pe o comanda din meniu.
De notat, ca cele de mai sus se dovedesc ineficiente daca se deschide si inchide in mod contiunuu aceeasi baza de date. In acest caz, este indicata crearea explicita a obiectului CDaoDatabase si folosirea lui pe durata de viata a aplicatiei.
Prima actiune asupra spatiului de lucru care poate fi numita tipica este folosirea tranzactiilor asupra unei sau mai multor baze. Comenzile de tranzactii in MFC sunt membri ai clasei CDaoWorkspace.
Pentru a accesa comenzile tranzactiilor intr-un caz tipic, se poate folosi spatiul de lucru implicit pe care MFC il creaza in spatele obiectelor CDaoDatabase si CDaoRecordset (un spatiu de lucru implicit pentru mai multe obiecte). Pentru a evita comenzi de tranzactii, ca BeginTrans, CommitTrans, sau Rollback, se poate alege apelul la functiile membru ale clasei CDaoWorkspace prin pointerul stocat in obiectul CDaoRecordset sau CDaoDatabase.
De exemplu, dintr-un obiect recordset, se poate apela :
// prs este un pointer la un obiect deja deschis
// CDaoRecordset
prs->m_pDatabase->m_pWorkspace->BeginTrans( );
Accesarea implicita a spatiului de lucru
Acesta sectiune descrie cum se acceseaza un obiect implicit MFC DAO pe care MFC il creaza in diferite situatii. Exemplul clasic este obiectul spatiu de lucru asociat cu un obiect CDaoDatabase sau CDaoRecordset. In mod normal nu e nevoie de un obiect explicit CDaoWorkspace, astfel ca se permite MFC sa creeze in mod implicit un astfel de obiect.
In cele mai obisnuite cazuri - in care exista deja un obiect CDaoDatabase sau CDaoRecordset asociat cu un spatiu de lucru care se doreste a fi accesat - se pot folosi datele membru ale acestor obiecte pentru a obtine un pointer la obiectul CDaoWorkspace implicit carora le apartin. Iata doua scenarii de lucru :
-un obiect baza de date (scenariul 1).
-un obiect recordset (scaenariul 2).
Scenariul 1 reprezinta indirectarea pe un nivel. Exista obiectul CDaoDatabase bazat pe spatiul de lucru. Se acceseaza data membru m_pWorkspace a obiectului CDaoDatabase astfel pentru a obtine un pointer CDaoWorkspace :
// pdbAccounts este un pointer la un obiect deja deschis
// pentru baza de date Accounts
CDaoWorkspace* pws = pdbAccounts->m_pWorkspace;
Sau poate fi folosit spatiul de lucru implicit pentru apelul unei functii membru a CDaoWorkspace :
pdbAccounts->m_pWorkspace->BeginTrans( );
Este obisnuit apelul functiilor in acest mod.
Scenariul 2 reprezinta indirectarea pe doua nivele. Exista un obiect CDaoRecordset bazat indirect pe spatiul de lucru (printr-un obiect CDaoDatabase). Se urmeaza acesti pasi :
Se acceseaza data membru m_pDatabase a obiectului CDaoRecordset pentru a obtine un pointer CDaoDatabase.
Se acceseaza data membru m_pWorkspace a obiectului baza de date pentru a obtine un pointer la CDaoWorkspace, astfel :
// rsDelinquentAccts este un CDaoRecordset existent
// bazat pe o baza de date Accounts
CDaoDatabase* pdbAccounts = rs.m_pDatabase;
CDaoWorkspace* pws = pdbAccounts->m_pWorkspace;
Sau se poate folosi spatiul implicit in spatele bazei de date implicita a recordset-ului pentru a apela functia membru a CDaoWorkspace :
pdbAccounts->m_pWorkspace->CommitTrans( );
Acesta este o metoda recomandata pentru accesarea unor astfel de functii deoarece nu se creaza o copie a pointerului implicit al obiectului. Copiile unor astfel de pointeri pot fi periculoase.
Se poate folosi pointerul la spatiul de lucru in acest mod indirect pentru a accesa colectia spatiilor de lucru, colectia bazelor de date, proprietatile motorului de baze de date, etc. De notat ca in majoritatea cazurilor spatiilor accesate in acest fel sunt spatiile implicite DAO.
Creare , deschidere si inchidere de obiecte DAO
Pentru a crea un obiect nou MFC DAO :
Se construieste obiectul (pe stiva sau heap, folosind operatorul new).
Se apeleaza functia membru Create a obiectului.
In unele cazuri, se apeleaza functia membru Append pentru a adauga obiectul la colectia potrivita.
Obiectele baze de date sunt adaugate la colectie automat dupa creare. CDaoDatabase nu are functia Append. Spatiile de lucru si definitiile de interogare pot fi create ca obiecte temporare. Obiectele temporare nu sunt adaugate. Trebuie adaugate obiectele care persista intre doua sesiuni ale motorului de baze de date.
Pentru a deschide un obiect MFC DAO :
Se construieste obiectul (pe stiva sau heap, folosind operatorul new).
Se apeleaza functia membru Open a obiectului.
Inainte de apelul Open obiectul este neinitializat se de neutilizat. Acest exemplu arata modul de construire si deschidere a unui obiect CDaoRecordset :
// CDelinquentSet este derivat din CDaoRecordset
// Constructia recordset folosind baza de date implicita
CDelinquentSet rsDelinquentAccts;
// Setarea proprietatilor ...
rsDelinquentAccts.Open( ); // parametri impliciti
Pentru a deschide un spatiu separat de tranzactionare :
Se construieste un obiect CDaoWorkspace.
Se apeleaza functia membru Create a obiectului. Se specifica un nume unic in parametrul lpszName pentru a face distinct acest spatiu de lucru de spatiul de lucru predefinit sau orice alt spatiu de lucru. Fiecare spatiu de lucru creat are un nume diferit.
Se deschid una sau mai multe baze de date in spatiul de lucru.
Se ruleaza tranzactii in spatiul de lucru nou.
Tranzactiile in spatiul de lucru nou vor fi distincte de cele ale altor spatii de lucru.
Structura CDaoWorkspaceInfo
Structura CDaoWorkspaceInfo are urmatoarea forma :
struct CDaoWorkspaceInfo
Structura CDaoWorkspaceInfo contine informatii despre spatiul de lucru definit pentru accesul la baze de date folosind DAO. Obiectul este un obiect al clasei CDaoWorkspace. Referintele la primary, secondary si all de mai sus indica modul de return al informatiei al functiei membru a clasei CDaoWorkspace.
m_strName - denumeste in mod unic obiectul spatiu de lucru. Pentru a returna aceasta proprietate in mod direct, se apeleaza functia membru de definire a interogarilor obiectului GetName.
m_strUserName - o valoare care reprezinta detinatorul obiectului spatiu de lucru.
m_bIsolateODBCTrans - o valoare care indica daca tranzactii multiple care implica aceeasi baza de date ODBC sunt izolate.
Accesarea motorului bazei de date
Daca este necesara setarea sau citirea proprietatilor motorului bazelor de date in spatele spatiului de lucru, va fi nevoie de un obiect CDaoWorkspace a carui functie membru statica furnizeaza acces la aceste proprietati.
Pentru a accesa proprietatile unui motor de baze de date :
Se construieste un obiect CDaoWorkspace, sau se foloseste un pointer furnizat de un obiect CDaoRecordset sau CDaoDatabase.
Se apeleaza orice functie membru statica a spatiului de lucru. Nu e nevoie de un apel al functiei Open sau Create pentru a apela aceste functii.
Functii membru pentru accesul la proprietatile motorului bazelor de date :
Proprietatea DAO |
Functia membru |
Descriere |
Versiunea |
GetVersion |
Returneaza numarul versiu-nii fisierului baza de date Microsoft Jet. |
Parola predefinita |
GetDefaultPassword |
Specifica parola predefinita pe care motorul de baze de date o foloseste cand se creaza noi spatii de lucru fara a se specifica o parola. Setarea acestei proprietati este optionala. Se poate cere in schimb ca spatiile de lucru sa necesite o parola. |
Utilizatorul prede-finit |
SetDefaultUser |
Se specifica numele predefinit al utilizatorului cand se creaza spatii noi de lucru fara a se specifica un nume de utilizator. Ca si SetDefaultPassword, aceasta este o proprietate optionala. |
Timpul de login |
GetLoginTimeout, SetLoginTimeout |
Specifica num de secunde de asteptare inainte de inchide-rea conexiunii ODBC. |
Calea ini |
GetIniPath, SetIniPath |
Specificarea unei chei Windows registry sub care sunt stocate optiuni specifice aplicatiei legate la setari speciale ale motorului de baze de date. Setarea acestei proprietati este optionala si nu este folosita prea des. |
CDaoWorkspace furnizeaza de asemenea pentru compactare (sau copiere) a unei baze de date Microsoft Jet (.MDB) si pentru incercarea de reparare a unui fisier corupt al unei baze de date.
|