You are on page 1of 4

ADO.

NET

Obiecte conectate Obiecte deconectate


Connection DataSet
Transaction DataTable DataView
DataAdapter (nu depinde de Connection) DataRow
Command DataColumn
Parameter Constraint
DataReader DataRelation

Metoda Fill.DataAdapter pentru a completa un DataSet.


Metoda Update.DataAdapter pentru a face modificarile in baza de date.
Furnizori de date .NET (.NET Data Providers)
Ole DB .NET Data Provider, ADO.NET Data Provider, etc.

Obiectul Connection
Un obiect Connection reprezinta o conexiune la sursa de date. Putem specifica tipul sursei de date, locul unde se afla,
user, password, obiecte de securitate, etc.
Un obiect de conexiune este folosit de obiectele DataAdapter, Command.

//Open and close a connection using the OLE DB .NET Data Provider.
OleDbConnection cnOleDb = new OleDbConnection();
cnOleDb.ConnectionString = "Provider=Provider=SQLOLEDB;
"Data Source=(local); InitialCatalog=Northwind;...";
cnOleDb.Open();
...
cnOleDb.Close();
//Open and close a connection using the SQL Client .NET Data Provider.
SqlConnection cnSql = new SqlConnection();
cnSql.ConnectionString = "Data Source=(local);" +"Initial Catalog =Northwind;...";
cnSql.Open();
...
cnSql.Close();

exemplu
public void InsertRow(string myConnectionString)
{
// If the connection string is null, use a default.
if(myConnectionString == "")
{
myConnectionString = "Initial Catalog=Northwind;Data
Source=localhost;Integrated Security=SSPI;";
}
SqlConnection myConnection = new SqlConnection(myConnectionString);
string myInsertQuery = "INSERT INTO Customers (CustomerID,
CompanyName) Values('NWIND', 'Northwind Traders')";
SqlCommand myCommand = new SqlCommand(myInsertQuery);
myCommand.Connection = myConnection;
myConnection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
}

Obiectul Command
Aceste obiecte sunt similare in structura cu cele folosite de ADO Command sau DAO QueryDef.
Aceste obiecte pot reprezenta o cerere la baza de date, un apel de procedura stocata, sau o cerere directa pentru a returna
continutul unei anumite tabele din baza de date.
Cererile pot fi de tip Select, Insert, Update, Delete sau de creare / modificare / stergere tabele, view-uri, proceduri stocate,
triggere, constrangeri.
Obiectul Command prezinta diferite modalitati de a executa o cerere:
ExecuteNonQuery, ExecuteReader, ExecuteXmlReader.

Obiectul DataReader
Este proiectat pentru a regasi si examina inregistrarile returnate de cererea facuta serverului bazei de date.
Cand navigam printre inregistrari, inregistrarea anterioara este descarcata, nu mai avem acces la ea. DataReader nu
suporta update.
Valorile returnate de DataReader sunt read only.
Obiectul Transaction
Obiectul Connection poseda o metoda BeginTransaction pe care o putem utiliza pentru a crea obiecte Transaction.
Obiectul Parameter
Folosit pentru parametrizarea cererilor.
SELECT CustomerID, CompanyName, CompanyName, Phone FROM Customers WHERE CustomerID = ?
Se creaza un obiect Parameter pentru fiecare parametru din cerere si apoi adaugam aceste obiecte la colectia de obiecte
Parameter al obiectului Command.
Se pot defini tipurile de data si valorile parametrilor.
Obiectul DataAdapter
Obiectele DataAdapter actioneaza ca un “pod” intre baza de date si obiectele deconectate.
Metoda Fill.DataAdapter va plasa rezultatele cererii intr-un DataSet sau DataTable, pasata ca parametru in aceasta
metoda.
Modificarile facute intr-un DataSet pot fi transferate in baza de date prin diverse mecanisme puse la dispozitie de
DataAdapter.
Vezi colectiile TableMappings, ColumnMappings.

Obiecte deconectate
Obiectul DataTable
The DataTable is a central object in the ADO.NET library. Other objects that use the DataTable include the DataSet and
the DataView.
The DataSet and DataTable objects inherit from MarshalByValueComponent, and support the ISerializable interface for
remoting. These are the only ADO.NET objects that can be remoted.
Obiectul DataRow
Pentru a accesa valorile memorate intr-un obiect DataTable va trebui sa folosim obiecte Row ce contin o colectie de
obiecte DataRow.
Examinarea datei dintr-o coloana specifica a unei inregistrari se face folosind proprietatea Item a obiectului DataRow.
Automatic Memory Management - Garbage Collection
Creare obiecte, gestiune memorie heap. eliberare memorie heap (distragere obiecte). Etapele necesare pentru a accesa o
resursa:
1. Creare resursa (operatorul new).
2. Iniţializare memorie pentru a seta starea iniţiala a obiectului înainte de a o utiliza (operaţiile se realizează
in constructor).
3. Utilizare resursa prin accesarea membrilor tipului respectiv.
4. Eliberare resursa (eliberarea zonei de memorie ocupata de resursa).
Managementul automat al memoriei încearcă sa rezolve problemele legate de accesarea obiectelor inexistente (bug de
programare) precum si menţinerea memoriei heap intr-o stare consistenta (pierderi de memorie la nivel de aplicaţie).
Programatorul este degrevat de sarcina gestionarii memoriei: momentul când va trebui sa elibereze memoria ocupata de
un anumit obiect.
Garbage collector nu are informaţii suficiente despre resursa ce reprezintă un anumit tip in memorie.
Pentru ca o resursa sa se poate elibera corect din memorie, dezvoltatorul trebuie sa scrie cod in metodele Finalize, Dispose
si Close in cazul cand acel obiect foloseşte resurse unmanaged.
Tipurile preconstraite. cum ar fi Int32, Point, Rectangle. String. ArrayList si Serializationlnfo. reprezintă resurse ce nu au
nevoie de cod special pentru a fî eliberate din memorie.
Tipurile ce reprezintă (sau wrap) resurse negestionate (unmanaged) cum ar fi fişiere, socket-uri. mutexuri. bitmap. etc. au
nevoie de execuţia unui cod de eliberare (clean up) din memorie cand obiectul este distras.

Alocare memorie si iniţializare resurse.


Cerinţa principala a CLR-ului este ca toate resursele sa fie alocate intr-o memorie heap numita maitagead heap. Din
aceasta memorie managed heap. dezvoltatoml nu va elibera obiectele, acestea vor fi dealocate automat cand aplicaţia nu
mai are nevoie de ele.
Cand stie managed heap ca un obiect nu mai este necesar in aplicaţie si trebuie eliberat?
Exista mai mulţi algoritmi pentru a realiza acest lucru, fiecare lucrând bine intr-un anumit mediu.
Cand un proces este iniţializat. CLR rezerva o zona contigua de memorie (adrese) care iniţial nu conţine nici un obiect.
Aceasta zona (heap) este gestionata cu ajutorul uni pointer. numit in cazul de fata, NextObjPtr.
Acest pointer indica adresa următorului bloc liber in heap. deci unde se va aloca următorul obiect nou creat.
Iniţial, NextObjPtr conţine adresa de inceput a zonei rezervate pentru heap.
Operatorul new este folosit pentru alocarea unui obiect in heap. iar in IL (limbaj intermediar) ii corespunde instrucţiunea
newobj.

CLR-ul executa urmatorele lucruri caud se creaza un nou obiect:


1. Calculează numărul de octeţi necesari pentru noul tip si toate tipurile sale de baza :
2.Fiecare obiect mentine doua câmpuri speciale (32 biti lungime): un camp ce mentine un pointer la o tabela de
pointeri la metode si un SyncBlocklndex. Pe un sistem pe 32 biti se mai adaugă in plus 8 octeţi pentru fiecare
obiect, iar pe un sistem 64-biti se adaugă 16 octeţi pentru fiecare obiect.
3.Verifica daca exista memorie suficienta in heap. Daca exista memorie, obiectul este alocat la adresa data de
NextObjPtr.
4.Se apelează constructorul obiectului (valoarea lui this este egala cu valoarea lui NextObjPtr) si se obţine adresa
unde este memorat obiectul (pointeml this).
5.Se modifica valoarea lui NextObjPtr. astfel incat acesta sa puncteze la următoarea zona de memorie, libera.
Clasa GC
Garbage collector ii|u poate determina referinţele la obiecte ce sunt făcute din cod unmanaged.
Metoda KeepAlive furnizează im mecanism ce previne garbage collector sa colecteze obiecte ce sunt iuca in folosinţa in
cod unmanaged (de ex obiectele din COM - exista un contor de referinţe ce indica daca un obiect este in uz sau nu).
Cand iui obiect foloseşte resurse unmanaged (in general obiecte nucleu : id fişiere, mutex-uri, conexiuni la baza de date,
etc.) ce trebueisc eliberate inainte ca instanţele tipului sa fie eliberate din memorie, tipul trebuie sa implementeze un «
finalizer ».
In majoritatea cazurilor, daca un obiect are un "finalizer" (metoda Finalize override). garbage collector va apela aceasta
metoda Finalize inainte ca obiectul sa fie eliminat din memorie. Daca dorini ca garbage collector sa nu apeleze Finalize
pentru un anumit obiect, vom apela metoda
GC. SuppressFinalize.
In situaţia cand resursele trebuie eliberate la un moment de timp specificat (eliberare detenninista). clasa poate
implementa interfaţa I Disposable, interfaţa ce conţine metoda Dispose, metoda ce va implementa codul pentru ştergere.
Aceasta metoda trebuie sa fie explicit apelata in cod. locul unde dorini eliberarea obiectului, ea nu este apelata de garbage
collector. In metoda Dispose din interfaţa IDisposable se pot apela metode din clasa GC.

Pentru resurse unmanaged este obligatoriu folosirea metodei Finalize

Recapitulând putem spune


1. Nu trebuie scris cod pentru sincronizare in cadrul acestei metode.
2. In Finalize trebuiesc tratate excepţiile.
3. In Finalize nu trebuie sa facem referire la obiecte managed sau metode statice managed. este posibil ca
aceste obiecte sa nu mai existe sau metodele statice sa faca referire la obiecte ce nu mai exista.

Paternul Dispose. Interfaţa Idisposable. Forţarea unui obiect sa se şteargă


Metoda Finalize se foloseşte in special pentru resurse unmanaged si se aplica pentru tipurile
referinţa.
Metoda nu poate fi apelata direct.
Tipurile ce oferă posibilitatea de a fi in mod determinist "dispose" sau incluse implementează ceea ce se numeşte "dispose
pattem".
Pentru a implementa acest patern tipul trebuie sa fie derivat din interfaţa IDisposable.

You might also like