Accesarea datelor utilizând tehnologia ADO.NET referat






Majoritatea aplicaţiilor din zilele noastre interacţionează cu bazele de date. Pachetul .Net Framework furnizează un set variat de obiecte pentru a organiza interacţiunea cu bazele de date; referirea la aceste clase se face prin ADO.NET.
ADO (provine de la ActiveX Data Objects de la Microsoft) a fost o librărie a componentelor COM şi a avut multe variante intermediare în ultimii ani. Ultima variantă, conţine în principiu obiectele Connection, Command, Recordset şi Field. Se deschide o conexiune la baza de date, datele sunt selectate în recordset-uri, care conţin field-uri, se fac modificările dorite asupra datelor, se actualizează pe server, iar apoi se închide conexiunea. ADO a mai introdus conceptul de recordset-uri deconectate, concept care a fost folosit atunci când nu se doreau conexiuni deschise pentru perioade lungi de timp, dar acest lucru era foarte greu de realizat de vreme ce acest lucru nu a fost conceput iniţial.
Existau numeroase probleme pe care ADO nu le rezolva satisfăcător, cea mai notabilă fiind masivitatea recordset-urilor deconectate. Rezolvarea acestei probleme era necesară datorită evoluţiei programării "centrate pe web", deci a fost necesară o nouă abordare. Actualizarea de la ADO la ADO.NET nu este foarte grea. Dacă se utilizează SQL Server, există un set de clase noi care sunt foarte potrivite pentru a obţine performanţe ridicate, acesta fiind un motiv suficient pentru a face trecerea de la ADO la ADO.NET.



ADO.NET se aseamană foarte mult cu predecesorul său, ADO. Principala diferenţă este că ADO.NET este o arhitectură de date deconectată. Într-o architectură deconectată datele sunt extrase din baza de date şi stocate pe calculatorul local. Datele se manipulează pe computerul local, iar conectarea la baza de date se realizează doar când se doreşte modificarea inregistrărilor sau extragerea de noi date.
Separarea arhitecturii de date de baza de date prezintă avantaje semnificative. Cel mai mare avantaj ar fi evitarea problemelor asociate cu obiectele de date care nu se mapează corect. Este dificil să avem mii sau sute de mii de conexiuni continue la bazele de date deoarece aceste conexiuni sunt consumatoare mari de resurse. O arhitectură deconectată face economie de resurse.
ADO.NET furnizează un acces consistent la surse de date cum ar fi Microsoft SQL, precum şi resurse aflate in OLE DB şi XML. Aplicaţiile care folosesc aceleaşi date, pot folosi ADO.NET pentru a se conecta la aceste date pentru a le extrage, modifica şi apoi să le aduca la zi.
Cu cât aplicaţiile s-au dezvoltat, acestea au devenit asemănătoare aplicaţiilor Web. Aplicaţiile din zilele noastre folosesc XML pentru a coda datele ce trebuie trimise prin reţele. Aplicaţiile Web folosesc HTTP pentru a comunica între diferite nivele, de aceea trebuie întreţinute legăturile dintre cereri. Acest nou model este foarte diferit de stilul de programare conectat, strâns legat care caracteriza era client/server, unde conexiunea era menţinută deschisă pe toată durata de viaţă a programului şi nu se cerea tratarea specială a acestei legături.
Cu apariţia mediului .Net se asigură ca accesul la date să fie uniform - componentele să împărtăşească un sistem de tip comun, modele de design şi convenţiile de denumire.
ADO.NET a fost conceput pentru a întâmpina nevoile de programare ale acestui model: arhitectura de date deconectată, integrare solidă cu XML, reprezentarea de date comună cu posibilitatea de a combina date din surse multiple, şi facilităţi optimizate pentru integrarea cu bazele de date, toate acestea fiind native pachetului .NET Framework.
În acelaşi timp, modelul de programare rămâne cât se poate de asemănător ADO, pentru ca programatorii de ADO să nu fie nevoiţi să înveţe totul de la început. ADO.NET este o parte intrinsecă a pachetului .NET Framework fără a fi complet străină programatorului ADO. ADO.NET coexistă cu ADO. În timp ce aplicaţiile bazate pe .Net utilizând ADO.NET, ADO rămâne disponobil programatorului .NET prin serviciile de interoperabilitate COM .NET.


Fig 2.3 Arhitectura ADO.NET

ADO.NET este deci dotat cu două namespace-uri - unul pentru Server-ul SQL, iar celălalt pentru bazele de date accesate prin interfaţa OLE DB:
. System.Data - conţine clasele generice de acces al datelor
. System.Data.Common - clasele distribuite (sau extinse) de furnizorii de date individuali
. System.Data.OleDb - clasele furnizoare OLE DB
. System.Data.SqlClient - clasele furnizoare SQL Server
. System.Data.SqlTypes - tipuri de date SQL Server

3.7.1. Clasele distribuite
ADO.NET conţine clase utilizate indiferent dacă se folosesc clasele SQL Server sau OLE DB. Namespace-ul System.Data conţine următoarele clase:

. DataSet - acest obiect poate conţine un set de DataTables, poate include relaţii între bazele de date, şi este conceput pentru utilizarea deconectată
. DataTable - este un container de date. Un obiect DataTable este compus din unul sau mai multe obiecte DataColumns, iar atunci când e populat va avea unul sau mai multe obiecte DataRows conţinând date.
. DataRow - este un număr de valori, este înrudit cu liniile din bazele de date.
. DataColumn - conţine definirea unei coloane, prin nume şi tipul de date
. DataRelation - este o legătura între două DataTable din cadrul unui DataSet
. Constraint - Defineşte o regulă pentru un DataColumn (sau un set de coloane), cum ar fi valorile unice

3.7.2. Clasele specifice bazelor de date

Pe lângă clasele distribuite prezentate mai sus, ADO.Net conţine şi clase specifice bazelor de date. Aceste clase implementează un set de interfeţe standard definite în cadrul namespace-ului System.Data, oferind posibilitatea ca, clasele sa fie folosite la nevoie într-o manieră generică. De exemplu, ambele clase, SqlConnection şi OleDbConnection implementează interfaţa IDbConnection.

. SqlCommand, OleDbCommand - încapsulează apelările procedurilor stocate şi a comenzilor SQL
. SqlCommandBuilder, OleDbCommandBuilder - clasă utilizată pentru a genera comenzi SQL (cum ar fi INSERT, UPDATE şi DELETE) dintr-o comandă SELECT
. SqlConnection, OleDbConnection - conexiunea la baza de date, este similară cu conexiunea ADO
. SqlDataAdapter, OleDbDataAdapter - clasă utilizată sa stocheze comezile select, insert, update şi delete, care apoi sunt folsite pentru a popula obiectele DataSet şi a actualiza baza de date
. SqlDataReader, OleDbDataReader - este un citior de date conectat, pe o singură direcţie
. SqlParameter, OleDbParameter - defineşte un parametru pentru o procedură stocată
. SqlTransaction, OleDbTransaction - o tranzacţie SQL încapsulată într-un obiect


3.7.3. Componente ADO.NET

Pentru a executa operaţii în bazele de date, se execută declaraţii SQL sau proceduri stocate (care conţin declaraţii SQL). Se utilizează declaraţiile SQL sau procedurile stocate pentru a citi sau scrie în baza de date şi a executa funcţii agregate, cum ar fi adunări sau medieri. De asemenea se utilizează declaraţii SQL sau proceduri stocate pentru a crea, modifica tabele sau coloane, a efectua tranzacţii, etc..
În ADO.NET se utilizează comenzi de date pentru încapsula declaraţiile SQL sau procedurile stocate. De exemplu dacă dorim să citim un set de linii dintr-o baza de date, creăm o comandă de date şi o configurăm cu ajutorul textului unei declaraţii SQL Select, sau cu numele procedurii stocate care conţine declaraţia.
Când dorim extragerea unor date urmăm următorii paşi:
- deschidem conexiunea
- apelam o metoda de execuţie a comenzii care :
o execută declaraţia SQL sau procedura stocată la care are referinţă comanda
- închidem conexiunea


Figura 2.4 Componentele ADO.NET


Conexiunea va fi deschisă doar atâta timp cât se executâ declaraţia sau procedura stocată. Cănd se apelează metoda de execuţie a comenzii, aceasta returnează o valoare. Comenzile care actualizează baza de date, returnează numărul de linii afectate; celelalte tipuri de comenzi vor returna un cod de eroare. Dacă comanda interoghează baza de date cu o declaraţie Select, comanda poate returna un set de linii. Putem extrage liniile folosind un cititor de date (data reader), care se comportă ca instrument de citire foarte rapid, unidirecţional.
Dacă dorim să efectuăm mai multe operaţii - de exemplu să citim nişte linii apoi să le actualizăm - vom folsi mai multe comenzi de date, câte una pentru fiecare operaţie. Fiecare operaţie este executată separat. De exemplu, ca să citim liniile, deschidem conexiunea, citim liniile şi închidem conexiunea. Când dorim să actualizăm datele, deschidem din nou conexiunea, efectuam actualizările, iar apoi închidem din nou conexiunea.
Cele mai comune operaţii cu date sunt extragerea lor din baza de date, afişarea, procesare, trimiterea către alte componente. Frecvent, aplicaţiile procesează mai multe înregistrări. Deseori setul de înregistrări pe care le necesită aplicaţia provine din mai multe tabele. O dată ce aceste înregistrări sunt extrase, aplicaţia lucrează cu ele în grup.
În cele mai multe cazuri nu este practic să ne întoarcem la baza de date de fiecare dată când aplicaţia trebuie să proceseze înregistrarea următoare. Soluţia este deci să stocăm înregistrările extrase din baza de date şi să lucrăm cu cu aceste seturi temporare.
Aceste seturi temporare au denumirea de DataSet. Dataset-ul este un depozit de înregistrări extrase din baza de date curentă, şi poate conţine informaţii despre relaţiile dintre tabele şi constrângerile pe care le conţin datele din tabele.
Datele din DataSet sunt o versiune mult mai redusă a ceea ce se găseşte în baza de date, dar putem lucra cu ele ca şi cum am lucra cu datele reale din baza de date. În timp ce facem modificări pe ele, nu suntem conectaţi la baza de date, ceea ce permite realizarea de alte sarcini.


Evident, suntem nevoiţi să facem actualizările în baza de date (deşi nu aşa de des ca şi extragerea datelor). Operaţiile se pot efectua asupra Dataset-ului, iar acestea pot fi înscrise în baza de date.
Trebuie ţinut minte că Dataset-ul este un container pasiv de date. Pentru a scoate datele din baza de date, şi opţional să le înscriem înapoi, folosim adaptoarele de date (DataAdapter). Un adaptor de date conţine una sau mai multe comenzi de date folosite pentru a popula un singur tabel din dataset, şi apoi a actualiza tabelele corespunzătoare din baza de date (un adaptor de date conţine în mod tipic patru comenzi, câte una pentru a selecta, introduce, actualiza şi şterge linii din baza de date ). De aceea , metoda Fill a adaptoarelor de date execută de fapt declaraţiile SQL.
Deoarece Dataset-ul este o copie privată a datelor din baza de date, nu este necesară reflectarea stării curente a bazei de date. Dacă dorim setarea ultimelor modificări făcute de alţi utilizatori, putem reactualiza datasetul apelând metoda Fill adecvată.
Dataseturile sunt independente de sursele de date.
Deşi datasetul se comportă ca şi un depozit de date extrse din baza de date, acesta nu are de fapt o legătura cu baza de date. Datasetul este un container, el conţine comenzile SQL sau porcedurile stocate executate prin adaptoarele de date.
Deoarece datasetul nu este legat direct de sursa de date, este util pentru date care provin din mai multe surse. De exemplu, unele date pot proveni din baza noastră de date, iar altele pot preveni din alte baze de date sau surse care nu sunt baze de date. Datele dintr-un dataset pot proveni dentr-un şir trimis de o altă componentă. Odată ce datele se află în format dataset, putem lucra cu ele, utilizând un model obiect, indiferent de sursa originală.
Chiar dacă nu trebuie să ştim nimic despre XML pentru a citi şi scrie în baza de date şi a lucra cu dataseturi, există situaţii în care nu accesăm datele dar ne ocupăm de designul datelor. În aceste situaţii folosim XML pentru a lucra cu metadata.

3.7.3.1. DataSet
Datasetul stochează datele într-un depozit deconectat. Structura unui dataset este asemănătoare cu cea a unei baze de date relaţionale, expune modelul obiect ierarhic al tabelelor, liniilor, şi coloanelor. În plus, conţine constrângeri şi relaţii definite pentru baza de date.
Putem crea şi manipula dataseturi utilizând următoarele clase din libraria de bază a .Net Framework:

Figura. 2.5


Părţile fundamentale ale datasetului sunt expuse în figura,
Clasa DataSet include colecţii de tabele şi colecţii de relaţii.
Clasa DataTable include colecţii de linii, colecţii de coloane şi colecţii de relaţii.
Clasa DataRow include proprietea RowState, care indică dacă şi cum a fost modificată linia din momentul în care a fost încărcată în dataset. Posibilele valori ar putea fi Deleted, Modified, New, şi Unchanged.

3.7.3.2.Adaptoarele de date

Adaptoarele de date sunt parte integrată a furnizorilor ADO.NET, şi sunt un set de obiecte utilizate pentru a comunica între sursa de date şi dataset.
Adaptoarele de date sunt folosite pentru a schimba datele între sursa de date şi dataset. În multe aplicaţii acest lucru înseamnă să citim datele din baza de date într-un dataset, iar apoi să scriem datele modificate în dataset înapoi în baza de date. Adaptorul de date poate muta date între orice sursă şi un dataset.
Putem crea şi manipula adaptoare utilizând următoarele clase din libraria de bază a .Net Framework:


Figura 2.6 Figura 2.7


În general, fiecare adaptor de date schimbă date între o singură sursă de date şi un singur obiect DataTable din dataset. Dacă datasetul conţine mai multe tabele de date, se utilizează mai multe adaptoare de date.
Când dorim să populăm un tabel dintr-un dataset, apelăm metoda care execută declaraţii SQL sau proceduri stocate. Adaptorul crează obiectul de citire a datelor (SqlDataReader, OleDbDataReader, OdbcDataReader, sau OracleDataReader) pentru a citi datele în dataset.
Similar, cănd vom dori să actualizăm baza de date, invocăm metoda care apelează declaraţia SQL sau procedura stocată adecvată pentru a face actualizarea la baza de date.


Componentele ADO.NET au fost concepute pentru a mijloci accesul la date şi gestionarea datelor. Există două componente centrale ale ADO.NET care realizează acest lucru: obiectele DataSet, şi furnizorul de date .Net Framework, care este un set de componente incluzănd obiectele Connection, Command, DataReader, şi DataAdapter.
Obiectul DataSet este miezul arhitecturii deconectate a ADO.NET. Acest obiect este conceput explicit pentru accesarea datelor independent de sursă. Ca urmare se poate utiliza cu surse multiple şi diferite, împreună cu date XML, sau pentru a gestiona date ale aplicaţiei locale. Un obiect DataSet conţine o colecţie de unul sau mai multe obiecte DataTable formate din linii şi coloane de date, precum şi informaţii despre chei primare, chei străine, constrângeri şi relaţii, ale datelor din obiectele DataTable.
Un alt element de bază a arhitecturii ADO.NET este furnizorul de date .Net Framework, ale carei componente sunt concepute explicit pentru gestionarea datelor şi accesul la date rapid, unidirecţional şi read-only.
Obiectul Connection realizează conectarea la sursa de date. Obiectul Command permite accesul la comenzile bazelor de date pentru a returna date, a modifica date, a apela proceduri stocate, şi a trimite sau extrage parametri. Obiectul DataReader furnizează un şir performant de date de la sursa de date. În final, obiectul DataAdapter asigură puntea între obiectul DataSet şi sursa de date. DataAdapter foloseşte obiectele Command pentru a executa comezi SQL atât pentru a încărca datele în DataSet cât şi pentru a actualiza modificările ce au fost făcute în DataSet, în sursa de date.
Se pot utiliza furnizorii de date .Net Framework pentru orice surse de date. .Net Framework conţine doi furnizori: furnizor .Net Framework pentru SQL Server şi furnizor .Net Framework pentru OLE DB.

3.7.3.3. ADO .NET - Strategii de lucru cu bazele de date
ADO .NET porneşte de la un model in care utilizatorul deschide o conexiune, execută operaţiile dorite (selectare date, modificare date) apoi închide conexiunea.

Strategii:
1. Stocarea datelor în memorie, într-un obiect de tip DataSet (obiect păstrat în memorie, cu care se poate lucra şi după deconectarea de la sursa de date). Această strategie implică şi crearea unui obiect de tip DataAdapter cu care se preiau datele de la sursa de date. În final datele pot fi scrise in baza de date utilizând, de asemenea, un obiect de tip DataAdapter.

. Avantaje:
- posibilitatea de a lucra cu mai multe tabele simultan;
- manipularea datelor din mai multe surse de date simultan (din baze de date diferite, fişiere XML etc.);
- facilitarea schimbului de date cu alte aplicaţii (componente) prin XML;
- legarea usoară la diverse controale (data-binding);
- utilizarea datelor fără reinterogarea bazei de date;
- posibilitatea generării unor clase care să reprezinte structura DataSet-ului. Obiectele astfel definite fac lucrul cu datele extrem de uşor.

Aceasta strategie este mai potrivită aplicaţiilor de tip desktop (în arhitecturile client-server), atunci când se lucrează, în mod repetat, cu aceleaşi mulţimi de date sau când se lucrează cu arhitectura \"data-binding\" care este concepută sa lucreze cu DataSet-uri.

2. Executarea operaţiilor direct în baza de date. Pentru aceasta se utilizează un obiect de tip Command. Daca obiectul Command returnează date (SELECT ...), acestea pot fi stocate într-un obiect de tip DataReader.

. Avantaje:
- posibilitatea execuţiei comenzilor SQL de tip DDL;
- overhead redus (obiectele de tip DataSet utilizează cantităţi mari de memorie);
- productivitate la programare (în cele mai multe cazuri).

Această strategie este potrivită pentru aplicaţiile web sau în cazurile în care datele selectate sunt utilizate doar o singură dată (rapoarte, vederi etc.).









Copyright © Contact | Trimite referat