Sunteți pe pagina 1din 24

Introducere n Visual Studio .

Net

7. Baze de date
Controalele de baze de date din Visual Basic permit utilizatorului s interacioneze cu aplicaia, aceasta afind date ctre utilizator, iar mediul de programare controlnd aplicaia. Controalele aduc datele din baza de date ctre aplicaie, permind acesteia s trimit napoi date ctre baza de date. Programarea cu baze de date este un subiect vast, greu de acoperit ntr-un singur capitol. Acest capitol i propune explicarea modului de lucru cu bazele de date i descrierea unor controale i obiecte utile oferite de Visual Basic pentru lucrul cu bazele de date.

7.1. Conectarea automat la baza de date


Visual Studio 2008 ofer controale i unelte care fac uoar conectarea la baza de date. Pentru a construi un program simplu cu baze de date, din meniul File selectm o nou aplicaie. Apoi din meniul Data-> Add New Data Source care va afia un dialog pentru configurarea conectrii la baza de date, aa cum este artat n Figura 7.1. Visual Studio 2008 permite utilizarea bazelor de date, a serviciilor web i a obiectelor n aplicaia noastr. Cea ce vom selecta noi n continuare, pentru a prelua datele i baza de date este opiunea Database, dup care vom apsa butonul Next, urmnd s apar dialogul din Figura 7.2.

Figura 7.1. Dialogul Data Source Configuration Wizard

Medii i Tehnologii de Programare curs

Figura 7.2. Alegei o conexiune la o baz de date sau creai una nou.

Dac anterior am creat o legtura la baza de date, putem s o selectm din lista dropdown. n caz ca dorim s crem o noua conexiune, apsm butonul New Connection pentru apariia dialogului din Figura 7.3.

Figura 7.3. Fereastra Add Connection dialog pentru a crea o noua conexiune la baza de date.

Dac baza noastr de date este n alt format dect cel implicit (n acest exemplu Microsoft Access Database), atunci apsm butonul Change pentru a aprea o fereastr de dialog (Figura 7.4) din care putem selecta unul din tipurile de baze de date existente, cum ar fi Microsoft Access, ODBC, SQL Server sau Oracle.

Introducere n Visual Studio .Net

Figura 7.4. Dialogul pentru selectarea tipului de baz de date.

Dup ce am selectat tipul de baz de date dorit, nchidem aceast fereastr pentru a ne ntoarce n fereastra Add Connection. n funcie de tipul selectat, fereastra Add Connection se va schimba. Spre exemplu, n Figura 7.5 este prezentat cazul n care baza de date este SQL Server.

Figura 7.5. Fereastra Add Connection pentru bazele de date SQL Server.

Pentru baza de date Microsoft Access trebuie s introducem numele fiierului sau s apsm butonul Browse (vezi Figura 7.3) pentru a gsi fiierul cu baza de date. Dac este necesar, mai introducem i numele i parola apoi click pe butonul OK. La ntoarcerea n fereastra Data Source Configuration Wizard, selectm noua legtur aa cum este prezentat n Figura 7.6. Dac dam click pe semnul + situat lng eticheta Connection String, atunci vom avea posibilitatea de vizualizare a informaiilor despre conectarea la baza noastr de date. La pasul urmtor, vom fi informai c baza noastr de date este local i vom fi ntrebai dac vrem s o adugm la proiectul nostru. Dac selectm Yes, baza de date va fi inclus n proiect i va aprea n fereastra Project Explorer. Dac dorim s distribuim baza de date mpreun cu aplicaia noastr, este mai convenabil s gestionm baza de date i codul Visual Basic mpreun.

Medii i Tehnologii de Programare curs

n continuare vom fi ntrebai dac dorim s salvm informaiile despre conectare n fiierul de configurare a aplicaiei noastre. Dac lsm selectat aceast opiune atunci aceste informaii vor fi adugate n fiierul app.config. (Figura 7.7)

Figura 7.6.

Figura 7.7.

Mai jos este prezentat o parte din fiierul app.config unde sunt stocate informaiile despre conectarea la baza de date.
<connectionStrings> <add name=SimpleDBApp.Settings.ClassRecordsConnectionString connectionString=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ClassRecords.mdb providerName=System.Data.OleDb /> </connectionStrings>

Introducere n Visual Studio .Net

Fereastra urmtoare conine informaii despre obiectele din baza de date. n acest exemplu, baza de date conine dou tabele, i anume Student i TestScore. Prin apsarea semnului + de lng obiecte, le putem expanda pentru a vedea ce cmpuri conin. (vezi Figura 7.8)

Figura 7.8. Selectarea obiectelor pe care dorim s le includem n DataSource.

n Figura 7.8, ambele tabele sunt selectate. Cnd selectm Finish sunt adugate cteva obiecte la aplicaia noastr. Fereastra Solution Explorer (Figura 7.9) afieaz 2 obiecte i anume baza de date ClassRecords.mdb i fiierul ClassRecordsDataSet.xsd care descrie sursa de date.

Figura 7.9.

Dac dam dublu click pe fiierul *.xsd, Visual Basic va deschide un editor (Figura 7.10) care va afia tabele definite i cmpurile lor.

Medii i Tehnologii de Programare curs

Figura 7.10. Tabele definite i relaia dintre ele.

Linia trasat ntre cele 2 obiecte, avnd o cheie n partea stng i simbolul infinit n partea dreapta, indic faptul ca relaia dintre tabele este de one-to-many . n acest exemplu, cmpul StudentID din tabelul Students mpreun cu cmpul StudentID din tabelul TestScores formeaz o relaie foreign key. Aceasta nseamn c fiecare valoare StudentID din tabelul TestScores trebuie s corespund unei valori StudentID din tabelul Students. Dac se efectueaz dublu click pe link-ul de relaionare (sau click dreapta), editorul va afia fereastra din Figura 7.11

Figura 7.11. Fereastra de dialog pentru editarea relaiilor dintre tabele

Introducere n Visual Studio .Net

n partea de jos a tabelelor afiate n Figura 7.10, se pot observa doua obiecte data adapter care conin etichetele Fill,GetData() . Acestea obiecte vor fi folosite mai trziu n aplicaie pentru a muta datele din / n data source . n plus, wizard-ul a adugat n fereastra Solution Explorer un nou obiect DataSet, n fereastra Data Sorces (vezi Figura 7.12). Dac fereastra Data Sources nu este vizibil, se poate selecta din meniu Data->Show Data Sources. Se poate observa semnul + acolo unde exist posibilitatea de expandare a obiectelor coninute n DataSet. n Figura 7.12 este dataset-ul este expandat pentru a face vizibile tabele, acestea la rndul lor fiind expandate pentru a se vedea cmpurile. Se poate observa ca tabelul TestScores este listat sub tabelul Students, deoarece exist o relaie printecopil ntre cele dou. Este nevoie de multe cuvinte i figuri pentru descrierea acestui proces, dar utiliznd wizardul aceasta operaiune devine foarte rapid. Dup ce am creat sursa de date (Data Source), putem construi o interfa simpl fr nici un efort. Trebuie doar s efectuam dragand drop cu obiectele din fereastra Data Sources pe formularul nostru.

Figura 7.12. Fereastra Data Sources.

Dac facem click i drag and drop cu un tabel din fereastra Data Sources pe un formular, Visual Basic creeaz automat controalele BindingNavigator i DataGridView, precum i alte componente pentru a afia datele din tabel (vezi Figura 7.13)

Figura 7.13. Drag and drop un tabel din fereastra Data Souces are ca efect crearea unui DataGrid simplu

n loc s afim tot tabelul pe formular, putem s facem drag and drop doar cu anumite coloane. n acest caz, Visual Basic adaug controale pe formular pentru a reprezenta coloanele. n figura 7.14 se pot observa coloanele din tabelul Students pe interfa. Dac selectm un tabel din fereastra Data Sources va aprea un meniu drop down n partea dreapta. Acest meniu ne ofer posibilitatea de a alege stiluri diferite de afiare, aa cum este n Figura 7.15. De exemplu, dac setam stilul de afiare la Details i apoi facem drag and drop

Medii i Tehnologii de Programare curs

cu tabelul pe interfaa noastr, Visual Basic va afia datele din tabel utiliznd o afiare similar celei din figura 7.14 n loc de DataGrid-ul din Figura 7.13.

Figura 7.14. Afiare n stil Details a datelor din tabel

Figura 7.15. Meniul drop down obinut n urma efecturii click dreapta pe tabel

Similar se poate schimba modul de afiare pentru orice coloana din tabelul nostru. Se selecteaz o coloan din fereastra Data Sources iar din meniul drop down obinut prin click dreapta putem afia informaia ntr-un textbox, label, link label, combobox, sau orice alt control. Acum, cnd tragei coloana pe un formular sau cnd tragei tabelul pe formular pentru a construi o vizualizare a nregistrrilor, Visual Basic utilizeaz acest tip de control pentru afiarea valorilor coloanei.

7.2. Obiecte create automat


Cnd se efectueaz drag and drop asupra unui tabel sau a unei coloane din fereastra Data Sources pe o interfa, Visual Basic face mai mult dect s plaseze un control DataGridView pe interfa. El creeaz de asemenea, o mulime de alte controale i componente. Dintre acestea cele mai importante sunt DataSet, TableAdapter, BindingSource i BindingNavigator (vezi Figura 7.16)

Introducere n Visual Studio .Net

Figura 7.16. Visual Basic folosete componentele DataSet, TableAdapter, TableAdapterManager, BindingSource, i BindingNavigator pentru a afia un DataGridView .

Programul stocheaz datele ntr-un obiect DataSet. Un singur obiect DataSet reprezint o ntreag baz de date. Acesta conine obiecte de tip DataTable unde sunt reprezentate tabelele din baza de date. Fiecare obiect DataTable conine obiecte DataRow care reprezint nregistrrile din baza de date, fiecare obiect DataRow conine elemente n care reprezint coloanele pentru fiecare nregistrare. Obiectele de tip TableAdapter sunt utilizate pentru comunicaia dintre aplicaie (mai precis, un obiect DataSet) i o baz de date. Acestea ofer metode pentru efectuarea operaiilor asupra bazei de date (cum ar fi selectare, inserare, modificare sau tergere). Un TableAdapter se conecteaz la o baz de date, execut interogri SQL sau proceduri stocate i fie returneaz un tabel nou populat cu datele returnate, fie umple un obiect DataTable existent cu datele returnate. Obiectele TableAdapter sunt utilizate de asemenea pentru a trimite date actualizate de la aplicaia curent napoi la baza de date. TableAdapterManager reprezint o component nou n Visual Studio 2008 care ofer funcii de salvare a datelor n tabele relaionate. TableAdapterManager utilizeaz relaiile de tip foreign-key care relaioneaz tabelele pentru determinarea ordinii corecte de trimitere a comenzilor Insert, Update sau Delete de la un dataset ctre o baz de date fr nclcarea regulilor definite prin intermediul foreign-key-urilor din baza da date. Obiectul BindingSource ncapsuleaz toate datele din DataSet i ofer funcii pentru controlul acestora din cadrul programului. Aceste funcii efectueaz aciuni cum ar fi mutarea datelor, adugare sau tergerea elementelor, etc. BindingNavigator ofer o interfa grafic pentru ca utilizatorul s poat controla BindingSource. Figura 7.17 arat legturile dintre obiectele DataSet, TableAdapter, BindingSource, i BindingNavigator.

Medii i Tehnologii de Programare curs

Figura 7.17. Visual Basic folosete obiecte DataSet, TableAdapter, BindingSource, i BindingNavigator pentru afiarea informaiilor.

Chiar i aceste obiecte, lucrnd mpreun nu fac totul pentru ca informaiile s fie afiate de program. Cnd creeaz aceste obiecte, Visual Basic adaug de asemenea urmtorul cod la interfaa noastr. Event handler-ur Form1_Load face ca TableAdapter-ul s copieze toate datele din baza de date n DataSet. Procedura bindingNavigatorSaveItem_Click se execut n momentul cnd utilizatorul face click pe opiunea Save a BindingNavigator-ului. Aceast rutin face ca TableAdapter-ul s salveze orice modificare a tabelului Students n baza de date.
Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'TODO: This line of code loads data into the 'ClassRecordsDataSet.Students' 'table. You can move, or remove it, as needed. Me.StudentsTableAdapter.Fill(Me.ClassRecordsDataSet.Students) End Sub Private Sub StudentsBindingNavigatorSaveItem_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles StudentsBindingNavigatorSaveItem.Click Me.Validate() Me.StudentsBindingSource.EndEdit() Me.StudentsTableAdapter.Update(Me.ClassRecordsDataSet.Students) End Sub End Class

Visual Basic creeaz toate acestea automat, iar dac rulm programul vom vedea toate informaiile din baza de date afiate, avnd posibilitatea de a le manipula. Totui nu este perfect, n sensul ca nu exist nici o validare a datelor, lsnd utilizatorul s nchid aplicaia fr s salveze modificrile fcute n baza de date. Este totui un nceput bun, pentru att de puin munc depus.

7.3. Alte obiecte pentru lucrul cu baze de date


Dac dorim un program care s afieze i s modifice datele din baza de date, cel descris anterior este destul de bun. n acest caz, lsm Visual Studio s fac majoritatea muncii, utilizatorul nefiind nevoit s aprofundeze detaliile lucrului cu baze de date. De asemenea, utilizatorul poate folosi obiecte similare cu cele create de Visual Basic pentru a-i construi propriile aplicaii. Pe de alta parte, putem crea propriile noastre DataSet, TableAdapter, BindingSource, i BindingNavigator pentru lucrul cu baze de date. Dac este nevoie s manipulm baza de date direct din cod, nu are sens s crem toate aceste obiecte. Dac, de exemplu dorim s modificam o nregistrare, nu are sens s crem obiecte DataGridView, BindingNavigator, i BindingSource.

10

Introducere n Visual Studio .Net

Pentru cazuri ca acestea, Visual Basic pune la dispoziie alte cteva tipuri de obiecte care pot fi folosite pentru a interaciona cu baza de date. Aceste obiecte se mpart n urmtoarele categorii : Containerele de date stocheaz datele dup ce au fost ncrcate din baza de date n aplicaie, similare DataSet-urilor. Se pot lega controale la aceste obiecte pentru o afiare automat a datelor i manipularea bazei de date. Conexiunile ofer informaii care i permit programului conectarea la o baz de date. Adaptoarele de date permit mutarea datelor ntre baza de date i container-ul de date. Obiectele de tip Command ofer instruciuni pentru manipularea datelor. Un obiect de tip Command poate selecta, insera, modifica sau terge datele din baza de date. De asemenea, poate executa proceduri stocate n baza de date.

Clasele de tip data container i data adapter sunt generice i lucreaz cu diferite tipuri de baze de date, n timp ce diferite tipuri de obiecte de conexiuni i comenzi sunt specifice unor tipuri diferite de baze de date. De exemplu, obiectele de conectare OleDbConnection, SqlConnection, OdbcConnection, i OracleConnection pot lucra cu Object Linking and Embedding Database (OLE DB); SQL Server, incluznd Microsoft Data Engine (MSDE); Open Database Connectivity (ODBC); i respectiv Oracle databases. Obiectele SQL Server i Oracle pot lucra doar cu baze de date care fac parte din acelai brand, dar ele sunt mai complete i mai potrivite pentru baza de date SQL, respective Oracle.

7.4. O privire de ansamblu asupra datelor


O aplicaie folosete trei obiecte de baz pentru a muta datele n i din baza da date: o conexiune, un adaptor de date, i un container de date cum ar fi DataSet. Obiectul de tip conexiune definete conexiunea la baza de date. Acesta conine informaii despre baza de date cum ar fi numele, locaia, utilizatori i parole pentru a accesa datele, informaii despre provider-ul bazei de date. Adaptorul de date definete o mapare de la baza de date la DataSet. Aceasta determin ce tip de date sunt selectate din baza de date, i care coloane din baza de date vor fi mapate pe coloanele din DataSet. Obiectele de tip DataSet stocheaz datele n interiorul aplicaiei. Poate stoca unul sau mai multe tabele i poate defini sau fora relaii ntre tabele. De exemplu, baza de date folosit anterior n acest capitol are un table TestScores care conine un cmp StudentID. Valoarea din acest cmp trebuie s se regseasc n valorile din tabelul Students, cmpul StudentID. Aceasta este numit constrngere foreign key. DataSet-ul poate reprezenta aceast constrngere i semnala o eroare dac programul ncearc s creeze o nregistrare n tabelul TestScores cu o valoare a cmpului StudentID care nu apare n tabelul Students. Odat iniializat conexiunea, data adapter-ul i DataSet-ul, programul poate apela metoda Fill() a data adapter-ului pentru a copia datele din baza de date n DataSet. Mai trziu se poate apela metoda Update() pentru a copia orice modificri ale nregistrrilor din DataSet napoi n baza de date (Figura 7.18)

11

Medii i Tehnologii de Programare curs

Figura 7.18. O aplicaie folosete conexiuni, adaptoare de date i DataSet-uri pentru a muta datele n i din baza de date.

Dac se compara Figura 7.18 cu Figura 7.17 se vor observa cteva similitudini. Ambele metode folosesc un adaptor pentru a tranzita datele ntre baza de date i DataSet. La o prim privire ar prea c n Figura 7.17 nu se folosete un obiect conexiune, dar de fapt obiectul TableAdapter conine intern un obiect conexiune pentru a accesa baza de date. O diferen major este faptul c n Figura 7.17 se folosete un BindingSource i un DataNavigator pentru a lsa utilizatorul s controleze BindingSource i a naviga ntre nregistrri.

7.5. Obiectele de tip Conexiune


Aceste obiecte sunt responsabile de conexiunile aplicaiei la baza de date. Ele permit unui adaptor de date s mute datele n i din DataSet. Dei ofer aceleai proprieti la nivel primar, exist cteva diferene ntre OleDbConnection, SqlConnection, OdbcConnection, i OracleConnection. Unele obiecte de tip conexiune pot lucra cu mai mult de tipuri de baze de date. De exemplu, obiectul OleDbConnection poate lucra cu orice tip de baz de date care suport conexiuni ODBC. n general conexiune care lucreaz cu un tip specific de baze de date (cum ar fi SqlConnection sau OracleConnection) dau cea mai bun performan. Tabele urmtoare descriu cteva dintre cele mai folosite proprieti puse la dispoziie de clasele OleDbConnection i SqlConnection.
Proprietate ConnectionString ConnectionTimeout Database DataSource Provider ServerVersion State Scop Stringul care definete conectarea la baza de date Timpul pe care obiectul l ateapt pentru a se conecta la baza de date. Dac acesta expir, se abandoneaz conectarea i se semnalizeaz o eroare. Returneaz numele bazei de date curente. Returneaz numele bazei de date curente sau numele serverului. (Doar pentru OleDbConnection ) Returneaz numele provider-ului de baza de date OLEDB (de exemplu Microsoft.Jet.OLEDB.4.0). Returneaz numrul versiunii serverului bazei de date. Valoarea este valabil doar cnd conexiunea este deschis i are forma 04.00.0000. Returneaz starea conexiunii. Poate lua valoarea Closed, Connecting, Open, Executing (execut o comand), Fetching, i Broken (conexiunea a fost deschis i apoi ntrerupt; se poate nchide i redeschide apoi conexiunea).

12

Introducere n Visual Studio .Net

Proprietatea ConnectionString include mai multe cmpuri separate prin punct i virgule. Textul urmtor arata o valoare tipic a ConnectionString pentru o conexiune OleDbConnection care va accesa o baz de date Acces.
Jet OLEDB:Global Partial Bulk Ops=2; Jet OLEDB:Registry Path=; Jet OLEDB:Database Locking Mode=1; Data Source="C:\Personnel\Data\Personnel.mdb"; Mode=Share Deny None;Jet OLEDB:Engine Type=5; Provider="Microsoft.Jet.OLEDB.4.0"; Jet OLEDB:System database=; Jet OLEDB:SFP=False; persist security info=False; Extended Properties=; Jet OLEDB:Compact Without Replica Repair=False; Jet OLEDB:Encrypt Database=False; Jet OLEDB:Create System Database=False; Jet OLEDB:Dont Copy Locale on Compact=False; User ID=Admin; Jet OLEDB:Global Bulk Transactions=1;

Multe dintre cmpurile separate prin punct i virgule sunt opionale i pot fi omise. S ne amintim care dintre ele sunt opionale i care nu poate fi dificil, dar din fericire nu e necesar. n loc s compunem noi proprietatea ConnectionString, putem lsa Visual Basic s o alctuiasc pentru noi. Pentru aceasta selectm din meniul View -> Server Explorer (Figura 7.19)

Figura 7.19. Din fereastra Database Explorer se poate genera un string de conectare automat.

Click-ul dreapta pe elementul Database Connections i selectarea opiunii Add Connection va avea ca efect apariia dialogului din Figura 7.20. Putem schimba tipul de baza de date prin folosirea butonului Change. Apoi introducem informaiile necesare pentru a ne conecta la baza noastr de date. Pentru o baz de date Microsoft Access (OLE DB) trebuie s introducem numele bazei de date sau s apsm pe butonul Browse pentru a o localiza. n fereastra Server Explorer facem click pe New Connection; se va deschide o fereastr de proprieti de unde putem selecta Connection String. Nu i putem schimba valoarea, dar putem selecta aceast valoare pe care o putem copia la noi n cod care va arta ca n secvena urmtoare.
Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\VB Prog Ref\JulyCTPSrc\Ch11\books.mdb

13

Medii i Tehnologii de Programare curs

Figura 7.20. Dialogul pentru configurarea unei noi conexiuni la o baz de date.

Urmtorul fragment de cod ilustreaz crearea, deschiderea, folosirea i nchiderea unui obiect OleDbConnection.
Imports System.Data.OleDb Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Creeaza conexiunea. Dim conn As New OleDbConnection( _ "Provider=Microsoft.Jet.OLEDB.4.0; " & _ "Data Source=""C:\VB Prog Ref\JulyCTPSrc\Ch11\books.mdb"";") "Persist Security Info=True; " & _ "Jet OLEDB:Database Password=MyPassword") ' Deschide conexiunea. conn.Open() ' ... ' ... ' Inchide conexiunea. conn.Close() conn.Dispose() End Sub End Class

Tabele urmtoare descriu cele mai folosite metode propuse de clasele OleDbConnection i SqlConnection .
Metoda BeginTransaction Scop ncepe o tranzacie cu baza de date i returneaz un obiect de tip tranzacie. O tranzacie las programul s se asigure c toate comenzile dintr-o serie de comenzi sunt fie toate executate fie toate anulate. Schimb baza de date curent. nchide baza de date curent. Creeaz un obiect de tip comand care poate executa unele aciuni asupra bazei de date, cum ar fi selectarea de nregistrri, crearea de tabele, modificarea unor nregistrri, etc. Deschide o conexiune cu valorile specificate n proprietatea ConnectionString

ChangeDatabase Close CreateCommand

Open

Cele mai utile evenimente ale obiectelor de tip conexiune sunt InfoMessage i StateChange. Evenimentul InfoMessage apare cnd provider-ul de baz de date are de a face cu o avertizare sau un mesaj de informare. Programul poate citi mesajul i n consecin poate

14

Introducere n Visual Studio .Net

efectua o aciune sau pur i simplu l afieaz utilizatorului. Evenimentul StateChange apare cnd se modifica starea conexiunii la baza de date. Trebuie inut minte c folosirea unui obiect de tip conexiune ca n Figura 7.18 se bazeaz pe metodele Fill() i Update() ale adaptorului i nu pe Open() sau Close(). Fill() i Update() deschid automat o conexiune, efectueaz aciunile i apoi nchid conexiunea aa nct utilizatorul nu este nevoit s gestioneze conexiunile. De exemplu, cnd programul apeleaz Fill(), adaptorul deschide rapid o conexiune, copiaz datele din baza de date n DataSet i apoi nchide conexiunea.

7.6. Data Adapter-urile


Un adaptor de date transfer datele ntre o conexiune i un DataSet. Metodele cele mai importante ale acestui obiect sunt Fill() i Update(), care mut datele n i din DataSet. Un adaptor de date ofer de asemenea alte proprieti i metode care pot fi folositoare. Urmtorul tabel descrie cele mai folositoare proprieti.
Proprietate DeleteCommand InsertCommand SelectCommand TableMappings Scop Obiectul de tip comand pe care adaptorul de date l folosete pentru a terge nregistrri. Obiectul de tip comand pe care adaptorul de date l folosete pentru a insera nregistrri. Obiectul de tip comand pe care adaptorul de date l folosete pentru a selecta nregistrri. O colecie de obiecte DataTableMapping care determin cum vor fi mapate tabelele din baza de date n DataSet. Fiecare obiect are o colecie ColumnMappings care va determina cum vor fi mapate coloanele din tabele n tabelele din DataSet. Obiectul de tip comanda pe care data adaptorul l folosete pentru a modifica nregistrri.

UpdateCommand

Exista mai multe posibiliti de a crea obiecte de tip comand. De exemplu, dac folosim Data Adapter Configuration Wizard ca s construim adaptorul n timp real, atunci wizardul creeaz automat aceste obiecte. Putem selecta adaptorul i expanda aceste obiecte n fereastra Properties, pentru a le vizualiza proprietile, inclusiv proprietatea CommandText. Alt cale de a crea aceste comenzi este s folosim un obiect de tip CommandBuilder. Dac atam acest obiect adaptorului, acesta va folosi obiectul CommandBuilder pentru a genera comenzile de care are nevoie, n mod automat. Urmtoarea secven de cod arata cum un program poate asocia un obiect de tip OleDbCommandBuilder la un OleDbDataAdapter. Cnd se apeleaz metoda Update(), adaptorul folosete obiectul CommandBuilder, dac este necesar, pentru a efectua comenzi de inserare, modificare sau tergere asupra bazei de date. Linia Debug.WriteLine afieaz textul comenzilor generate n mod automat.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Me.BooksTableAdapter.Fill(Me.BooksDataSet.Books) ' Ataseaza un command builder la adaptorul de date ' si afiseaza comenzile generate. Dim command_builder As New OleDbCommandBuilder(OleDbDataAdapter1) Debug.WriteLine(command_builder.GetDeleteCommand.CommandText)

15

Medii i Tehnologii de Programare curs

Debug.WriteLine(command_builder.GetInsertCommand.CommandText) Debug.WriteLine(command_builder.GetUpdateCommand.CommandText) End Sub

Textul urmtor afieaz rezultatele obinute; sintaxa Update() este distribuita pe dou linii, dar este o singura linie n fereastra Output. Obiectul de tip CommandBuilder genereaz aceste comenzi pe baza sintaxei SELECT Title, URL From Books care a fost ncrcat n DataSet.
DELETE FROM Books WHERE ((Title = ?) AND ((? = 1 AND URL IS NULL) OR (URL = ?))) INSERT INTO Books (Title, URL) VALUES (?, ?) UPDATE Books SET Title = ?, URL = ? WHERE ((Title = ?) AND ((? = 1 AND URL IS NULL) OR (URL = ?)))

Proprietatea TableMappings a adaptorului, permite modificarea felului n care adaptorul mapeaz datele din baza de date n DataSet. De exemplu, am putea face o copie a tabelului Employees din baza de date n DataSet, numita People. De obicei, nu este nevoie s schimbm numele tabelului sau a coloanelor, totui aceste schimbri se pot face interactiv n modul design mult mai uor dect n cod, aa ca de obicei aceste valori se vor lsa neschimbate. Pentru a crea un data adaptor n modul design, trebuie s deschidem un formular, selectm din meniul Toolbox opiunea Data i apoi dublu click pe controlul DataAdapter (dac nu apare controlul DataAdapter n ToolBox, atunci facem click dreapta pe ToolBox i selectm meniul Choose Items i de acolo selectm adaptorul dorit.) Cnd crem data adaptorul apare Data Adapter Configuration Wizard din Figura 7.21. Primul pas este similar celui descris anterior pentru configurarea unei noi conexiuni. Selectm o conexiune deja existent sau apsm butonul New Connection pentru una nou.

Figura 7.21. Data Adapter Configuration Wizard ne ajuta s definim un adaptor nou.

La apsarea butonului Next va aprea un dialog ca cel din Figura 7.22. De aici putem selecta metoda cu care adaptorul va opera asupra bazei de date, i va determina cum datele vor fi selectate, inserate sau modificate n baza de date. Dac selectm opiunea Use SQL Statements, atunci adaptorul va lucra cu instruciuni simple SQL. Dac selectm opiunea Create new stored procedures adaptorul va genera noi proceduri n baza de date. Pentru ca wizardul s foloseasc proceduri deja create, selectm opiunea Use existing stored procedures.

16

Introducere n Visual Studio .Net

n Figura 7.22, prima opiune este singura activ fiind unica disponibil pentru un OleDbDataAdapter ataat unei baze de date Access, aa cum am folosit n acest exemplu.

Figura 7.22. Selectarea unei metode prin care adaptorul va opera asupra bazei de date

Dac selectm Use SQL Statements i apsm butonul Next, va aprea dialogul din Figura 7.23. Dac avem experien n lucrul cu interogrile SQL, atunci putem preciza noi o sintax SELECT pe care adaptorul o va folosi cnd va selecta datele din baza de date. n caz contrar putem face Click pe butonul Query Builder (vezi Figura 7.24), apoi vom selecta tabelele din baza de date care conin nregistrrile pe care vrem s le folosim i dam click pe butonul Add. n Figura 7.24 este afiat doar tabelul Book, deoarece baza de date conine doar acest tabel. Dup ce am selectat tabelele, nchidem dialogul Add Table. Se pot folosi coloanele din al doilea panou pentru a determina cum sunt sortate cmpurile. n al treilea panou este afiat sintaxa SQL pe care o construim; facem click pe butonul Execute Query pentru a rula sintaxa SQL i a afia rezultatele n partea de jos. Cnd am terminat, apsm tasta OK.

Figura 7.23. Generarea de sintaxa SELECT SQL

17

Medii i Tehnologii de Programare curs

Figura 7.24. Putem folosi interactiv Query Builder pentru a defini datele pe care le va folosi adaptorul.

Cnd apsm butonul Next, Data Adapter Configuration Wizard afiseaz un sumar similar celui din Figura 7.25. Acest sumar descrie aciunile pe care wizard-ul le va executa i pe cele pe care nu le va executa. n funcie de query-ul pe care l folosim pentru a selecta datele, wizard-ul s-ar putea s nu genereze toate comenzile de selectare, modificare, inserare sau tergere a nregistrrilor. De exemplu, dac query-ul unete mai multe tabele, wizard-ul nu va fi capabil s i dea seama cum s modifice nregistrrile, aa ca nu va genera comenzi de inserare, modificare sau tergere.

Figura 7.25. Sumarul generat de Data Adapter Configuration Wizard

18

Introducere n Visual Studio .Net

Cnd apsm Finish, wizard-ul creeaz un nou adaptor i un nou obiect de tip conexiune care va fi asociat adaptorului. Se vor seta proprietile DeleteCommand, InsertCommand, SelectCommand, i UpdateCommand ale adaptorului n concordan cu conexiunea la baza de date pe care am selectat-o. De asemenea, se genereaz mapri iniiale ale tabelelor pentru a transforma valorile din baza de date n valori pentru DataSet.

7.7. Obiecte de tip Command


Clasa obiectelor de tip Command (OleDbCommand, SqlCommand, OdbcCommand, i OracleCommand) definete comenzile pentru baza de date. Comanda poate fi o interogare SQL, sau alte sintaxe care nu sunt interogri, cum ar fi INSERT, UPDATE, DELETE, sau CREATE TABLE. Proprietatea Connection a obiectului furnizeaz conexiunea la baza de date pe baza crora se vor executa comenzile. Proprietatea CommandText ofer textul SQL pe baza crora se vor executa comenzile. Proprietatea CommandType va stoca tipul comenzii coninut de obiectul de tip Command. Aceasta poate fi StoredProcedure (CommandText este numele proceduri stocate), TableDirect (CommandText este numele a unui tabel sau mai multe din care vor fi furnizate datele) sau Text (sintaxa SQL). n colecia Parameters a obiectului de tip Command vor fi stocai parametri care vor defini orice valoare necesara pentru a executa comanda. De exemplu, codul urmtor creeaz un obiect de tip OleDbCommand care va executa sintaxa SQL INSERT INTO PeopleNames (FirstName, LastName) VALUES (?, ?). Semnele de ntrebare marcheaz locul parametrilor care vor fi adugai mai trziu. Apoi, n cod se vor aduga doua obiecte noi de tip OleDbParameter la colecia Parameters a comenzii. Cnd n cod se invoca metoda ExecuteNonQuery, adaptorul nlocuiete semnele de ntrebare cu valorile parametrilor n ordinea n care apar n colecia Parameters. n acest exemplu, valoare din txtFirstName.Text nlocuiete primul semn de ntrebare, iar valoarea txtLastName.Text al doilea semn de ntrebare.
Private Sub btnAdd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAdd.Click ' Deschide conexiunea. Dim conn_people As New OleDbConnection(CONNECT_STRING) conn_people.Open() ' Creeaza un obiect Command pentru a insera date. Dim cmd As New OleDbCommand( "INSERT INTO PeopleNames(FirstName,LastName) " & _ "VALUES (?, ?) ", conn_people) ' Creeaza parametri pentru comanda. cmd.Parameters.Add(New OleDbParameter("FirstName", txtFirstName.Text)) cmd.Parameters.Add(New OleDbParameter("LastName", txtLastName.Text)) ' Execut comanda. Try cmd.ExecuteNonQuery() Catch ex As Exception MessageBox.Show(ex.Message) End Try ' Afiseaza datele. ShowValues(conn_people)

19

Medii i Tehnologii de Programare curs

' Inchide conexiunea. conn_people.Close() conn_people.Dispose() End Sub

Obiectul de tip Command ofer 3 metode de a executa CommandText. ExecuteNonQuery() execut o comand care nu este un interogare i care nu returneaz nici o valoare. ExecuteScalar() execut o comanda i returneaz prima coloan din prima nregistrare gsit. Este util atunci cnd se execut comenzi care returneaz o singur valoare. (de exemplu Select count * from Users). ExecuteReader() execut o interogare SQL i returneaz obiectul de tip DataReader (de exemplu OleDbDataReader). Programul poate folosi acest obiect pentru a naviga printre nregistrrile returnate.

Alte metode utile ale obiectului de tip Command sunt CreateParameter i Prepare. Prima adaug noi obiecte la colecia Parameters a obiectului, iar cea de-a doua compileaz comanda ntr-o form n care va fi executat mai rapid de baza de date. De obicei e mai bine s se execute o comand compilat cu parametri diferii, dect s se execute mai multe comenzi noi.

7.8. DataSet
DataSet este cel mai important obiect cnd vine vorba de a stoca datele n memorie. El ofer toate uneltele pentru a construi, ncarc, manipula i salva date, ntr-un mod similar celui din baze de date relaionate. Poate stoca tabele multiple, cu relaii complexe printe-copil i chei de unicitate. Ofer metode pentru a face combina DataSet-uri, pentru cutare de nregistrri care satisfac o anumita condiie, pentru salvarea datelor n modaliti diferite (cum ar fi ntr-o baz de date relaionat sau fiier XML). Din multe puncte de vedere, este ca o baz de date stocata n memorie i nu pe disc. Unul dintre cele mai rspndite moduri de a folosi un DataSet este s fie ncrcat dintr-o baz de date relaional, atunci cnd programul pornete, se vor folosi controale pentru a afia nregistrrile iar utilizatorul va putea manipula datele interactiv, iar la sfrit, cnd programul i ncheie execuia se vor salva schimbrile n baza de date. Alte variante pot fi ncrcarea datelor dintr-un XML sau construirea unui DataSet n memorie fr s folosim o baz de date. Programul poate folosi controale pentru a se conecta la DataSet iar utilizatorul va putea vizualiza i manipula date complexe. Codul urmtor creeaz i iniializeaz un DataSet de la nceput. ncepe prin a crea un nou DataSet numit Scores. Apoi se creeaz un DataTable numit Students i l adug la colecia de tabele a DataSet-ului. Apoi, n cod se vor folosi coloanele DataTable-ului,se vor crea metode pentru a aduga coloanele FirstName, LastName, i StudentID la tabel. Se seteaz apoi pe True proprietatea Unique a coloanei StudentID, interzicndu-se astfel duplicarea valorilor StudentID. n cod se va crea apoi un ir de obiecte de tip DataColumn care vor conine referinele ctre coloanele FirstName i LastName. Acest ir se va folosi pentru a se crea o constrngere UniqueConstraint i apoi adugat la colecia Constraints a tabelului. Prin aceasta se asigur c fiecare pereche de FirstName/LastName este unic.

20

Introducere n Visual Studio .Net

Similar se va crea tabelul TestScores, cu coloanele StudentId, TestNumber i Score, apoi se va adug o constrngere unic pe coloanele StudentID/TestNumber. Apoi, n cod se va aduga o relaie ntre tabelele Students, coloana StudentID i tabelul TestScores, coloana StudentID. Se vor aduga apoi n mod aleator cteva nregistrri n cele dou tabele. n final, programul ataeaz la DataSet un DataGrid pentru a afia rezultatele. Utilizatorul, poate folosi Datagrid-ul pentru a examina i modifica datele, ca i cum ar fi fost ncrcate din baza de date.
Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' Creeaza DataSet-ul. Dim scores_dataset As New DataSet("Scores") ' Creeaza tabelul Students. Dim students_table As DataTable = scores_dataset.Tables.Add("Students") ' Adauga coloane la tabelul Students. students_table.Columns.Add("FirstName", GetType(String)) students_table.Columns.Add("LastName", GetType(String)) students_table.Columns.Add("StudentId", GetType(Integer)) ' Face campul StudentId unic. students_table.Columns("StudentId").Unique = True ' Face campul combinat FirstName/LastName unic. Dim first_last_columns() As DataColumn = { _ students_table.Columns("FirstName"), _ students_table.Columns("LastName")} students_table.Constraints.Add( _ New UniqueConstraint(first_last_columns)) ' Creeaza tabelul TestScores. Dim test_scores_table As DataTable = scores_dataset.Tables.Add("TestScores") ' Adauga coloane la tabelul TestScores. Test_scores_table.Columns.Add("StudentId", GetType(Integer)) Test_scores_table.Columns.Add("TestNumber", GetType(Integer)) Test_scores_table.Columns.Add("Score", GetType(Integer)) ' Face campul combinat StudentId/TestNumber unic. Dim studentid_testnumber_score_columns() As DataColumn = { _ test_scores_table.Columns("StudentId"_ test_scores_table.Columns("TestNumber"_} test_scores_table.Constraints.Add( _ New UniqueConstraint(studentid_testnumber_score_columns)) ' Creeaza o relatie intre doua tabele prin campul StudentId. scores_dataset.Relations.Add( "Student Test Scores"_ students_table.Columns("StudentId"), test_scores_table.Columns("StudentId")) ' Adauga cateva date ale studentilor. students_table.Rows.Add(New Object() {"Art" "Ant", 1}) students_table.Rows.Add(New Object() {"Bev", "Bug", 2}) students_table.Rows.Add(New Object() {"Cid" "Cat", 3}) students_table.Rows.Add(New Object() {"Deb", "Dove", 4}) ' Creeaza cateva punctaje la test aleator. Dim score As New Random For id As Integer = 1 To 4 For test_num As Integer = 1 To 10 test_scores_table.Rows.Add( _ New Object() {id, test_num, score.Next(65, 100)}) Next test_num Next id

21

Medii i Tehnologii de Programare curs

' Ataseaza DataSet la DataGrid. grdScores.DataSource = scores_dataset End Sub

Urmtorul tabel descrie cele mai folositoare proprieti ale controlului DataSet.
Proprietate CaseSensitive DataSetName DefaultViewManager EnforceConstraints HasErrors Returns Prefix Relations Tables Scop Determina dac string-urile de comparare din DataTable sunt case sensitive. Numele DataSet-ului. Dac vom folosi reprezentarea XML, aceast proprietate va seta numele elementului rdcin. Returneaz un obiect a DataViewManager pe care l putem folosi pentru a seta proprietile of DataViews. Determina dac DataSet-ul ar trebui s foreze constrngerile n timp ce modifica datele. Returneaz True dac unul din DataTable are erori. Determina prefixul XML pe care l folosete DataSet-ul. O colecie de obiecte de tip DataRelation care reprezint relaii printecopil dintre coloanele din diferite tabele. O colecie de obiecte de tip DataTable care reprezint tabelele stocate n DataSet.

Proprietatea XML a DataSet-ului afecteaz modul n care sunt citite i scrise datele ntr-o form XML. De exemplu, dac proprietatea Namespace este my_namespace i proprietatea Prefix este pfx, atunci XML asociat DataSet-ului va arata n felul urmtor :
<pfx:Scores xmlns:pfx="my_namespace"> <Students xmlns="my_namespace"> <FirstName>Art</FirstName> <LastName>Ant</LastName> <StudentId>1</StudentId> </Students> <Students xmlns="my_namespace"> <FirstName>Bev</FirstName> <LastName>Bug</LastName> <StudentId>2</StudentId> </Students> ... <TestScores xmlns="my_namespace"> <StudentId>1</StudentId> <TestNumber>1</TestNumber> <Score>78</Score> </TestScores> <TestScores xmlns="my_namespace"> <StudentId>1</StudentId> <TestNumber>2</TestNumber> <Score>81</Score> </TestScores> ... </pfx:Scores>

Tabelul urmtor descrie cele mai folosite metode ale DataSet-ului.


Metoda AcceptChanges Clear Clone Copy Scop Accepta toate schimbrile care au fost fcute de cnd s-a apelat ultima oar AcceptChanges. terge toate nregistrrile din tabelul din DataSet. Efectueaz o copie a DataSet-ului, incluznd tabelele, relaiile i constrngerile fr a include datele. Efectueaz o copie a DataSet-ului, incluznd tabelele,relaiile i constrngerile incluznd datele.

22

Introducere n Visual Studio .Net

GetChanges GetXml GetXmlSchema HasChanges Merge ReadXml ReadXmlSchema RejectChanges WriteXml WriteXmlSchema

Efectueaz o copie a DataSet-ului, n care vor fi copiate doar nregistrrile modificate. Returneaz un string coninnd reprezentarea XML a DataSet-ului. Returneaz un definiia schemei XML a DataSet-ului. Returneaz True dac tabelele din DataSet conin modificri. Combin un DataSet, DataTable sau ir de obiecte DataRow n acest DataSet. Citete datele din XML n DataSet. Citete forma XML n DataSet. Anuleaz toate schimbrile fcute de cnd s-a ncrcat DataSet-ul i pn la apelarea funciei AcceptChanges. Scrie datele din DataSet n XML. Scrie XSD din DataSet ntr-un fiier XML.

Cteva dintre aceste metode sunt coninute i de ctre alte obiecte. De exemplu HasChanges returneaz True dac un tabel din DataSet conine modificari. Obiectele DataTable i DataRow au de asemenea metoda HasChanges care returneaz True dac conin modificri. Alte metode de acest fel ar mai fi AcceptChanges, Clear, Clone, Copy, GetChanges, i RejectChanges.

7.9. DataTable
Clasa DataTable reprezint datele dintr-un tabel din DataSet. Un DataTable conine obiecte de tip DataRow, pentru a reprezenta datele, obiecte de tip DataColumn care definesc coloanele tabelului, obiecte de tip Constraints i obiecte care reprezint relaiile dintre tabele. Acest obiect ofer de asemenea metode i evenimente pentru manipularea nregistrrilor. Tabelul urmtor descrie cele mai folosite proprieti ale obiectului DataTable.
Proprietate CaseSensitive ChildRelations Columns Constraints Scop Determin dac string-urile de comparare din DataTable sunt case sensitive. O colecie de obiecte de tip DataRelation care definesc relaii printe-copil, unde tabelul este printele. O colecie de obiecte de tip DataColumn care definete coloanele tabelului (numele coloanei, tipul de date, valoarea implicita, lungime maxim etc.) O colecie de obiecte de tip Constraints care reprezint constrngerile asupra bazei de date. O ForeignKeyConstraint cere ca unele valori dintr-un tabel s fie prezente n alt tabel. O UniqueConstraint const n faptul c o valoare trebuie s fie unica ntr-un tabel. DataSet-ul care conine DataTable. Returneaz un obiect DataView unde putem vedea, sorta i filtra nregistrrile din tabel. Returneaz True dac una din nregistrrile din DataTable conine o eroare. Capacitatea iniial a tabelului. O colecie de obiecte de tip DataRelation care definesc relaii printe-copil, unde tabelul este copilul. Determin prefixul XML pe care l folosete DataTable-ul. Seteaz cheia primar a tabelului. Cheia este unic i ofer acces mai rapid la nregistrri.

DataSet DefaultView HasErrors MinimumCapacity ParentRelations Prefix PrimaryKey

23

Medii i Tehnologii de Programare curs

Rows TableName

O colecie de obiecte DataRow care conin nregistrrile Numele tabelului

Proprietatea XML a DataTable afecteaz modul n care sunt citite i scrise datele ntr-o form XML. De exemplu, dac proprietatea Namespace este my_namespace i proprietatea Prefix este pfx, atunci XML asociat DataTable va arata n felul urmtor :
<pfx:Students xmlns:pfx="my_namespace"> <FirstName xmlns="my_namespace">Art</FirstName> <LastName xmlns="my_namespace">Ant</LastName> <StudentId xmlns="my_namespace">1</StudentId> </pfx:Students>

Metodele cele mai folosite sunt :


Metoda AcceptChanges Clear Clone Compute Copy GetChanges GetErrors ImportRow LoadDataRow Scop Accept toate schimbrile care au fost fcute de cnd s-a apelat ultima oar AcceptChanges. terge toate nregistrrile din tabelul din DataTale Efectueaz o copie a DataTable, incluznd tabelele,relaiile i constrngerile fr a include datele. Calculeaz valoarea unei expresii folosind nregistrrile care satisfac filtrarea. Creeaz o copie a DataTable, incluznd tabelele, relaiile i constrngerile incluznd datele. Efectueaz o copie a DataTable, n care vor fi copiate doar nregistrrile modificate. ir de DataRow care conin erori Copiaz datele dintr-un DataRow n DataTable. Aceast metod ia ca i parametru un ir de valori. Caut n tabel o nregistrare a crei valori se potrivesc cu valoarea din cheia primara a irului. Dac nu gsete o astfel de nregistrare, va folosi valorile pentru a crea o nregistrare nou. Returneaz un obiect de tip DataRow. Creeaz un nou obiect de tip DataRow care s se potriveasc cu schema tabelului. Pentru a aduga o nregistrare noua la tabel, putem crea o nregistrare noua cu DataRow i apoi s folosim metoda Rows.Add. Anuleaz toate schimbrile fcute de cnd s-a ncrcat DataSet-ul i pana la apelarea funciei AcceptChanges Returneaz un ir de obiecte DataRow care au fost selectate din tabel.

NewRow

RejectChanges Select

Evenimentele cele mai folosite pentru un DataTable sunt prezentate n tabelul urmtor.
Eveniment ColumnChanged ColumnChanging RowChanged RowChanging RowDeleted RowDeleting Scop Apare dup ce o valoare a fost modificat n nregistrare. Apare n timp ce o valoare este modificat n nregistrare. Apare dup ce o nregistrare s-a modificat i utilizatorul trece la o nou nregistrare. Apare dup ce o nregistrare a fost modificat. Apare dup ce o nregistrare a fost tears. Apare n timp ce o nregistrare este tears.

24

S-ar putea să vă placă și