Sunteți pe pagina 1din 11

Gestiunea datelor

n fiiere, folosind clasele File, FileStream, StreamReader, StreamWriter, BinaryReader i


BinaryWriter;

n baze de date, folosind clasele ADO.NET specifice fiecrui SGBD; n fiiere XML, care pot ine att date, ct i descrierea lor, clasele folosite fiind XmlNode, XmlDocument, XmlTextReader i XmlTextWriter.

Controlul DataGrid (GridView sub VS 2008) din aplicaiile Web se aseamn cu cel din Windows Forms, dar are cteva particulariti ce in de o mai bun gestiune a resurselor, avnd n vedere c BD se afl pe server, iar transferul de volume mari de date ctre client presupune band larg de transfer i necesit timp considerabil. n aplicaiile Web, gridul: 1. permite paginarea, adic posibilitatea prelurii datelor din DataSet sau din sursa de date, pe msura defilrii n sus i n jos, n grid; 2. lucreaz deconectat de la baza de date, ca i n Windows Forms, dar disponibilizeaz datele ca text, implicit read-only; anumite proprieti ale gridului permit ns introducerea n regim de editare, cnd pentru linia editat se disponibilizeaz o linie de TextBox-uri ce mediaz aceast editare.

Caching
n lucru cu baze de date, avem de ales ntre: a avea date care beneficiaz de cele mai recente actualizri, cu preul extragerii lor direct din baza de date; a ine datele n memorie cache, mai rapid accesibil dect baza de date, dar reflectnd situaia de la momentul citirii lor din baza de date; modificrile survenite ntre timp ar putea fi semnificative, mai ales n cazul accesului simultan al mai multor utilizatori pe acceai baz. Memoria cache se rezerv uzual pe server, n cadrul procesului ce execut cererile n contul aplicaiei client. Se poate rezerva i n memoria global, cnd deservete mai muli clienti (sau chiar pe disc, depinznd de configurarea serverului, de ctre administrator ). Cache este un obiect n care punem date (aici ntreg dataSet-ul) identificate prin nume. Funciile Page_Load i LeagaGrid arat n aceast situaie astfel:
private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) {// daca pagina e ncrcat prima data, incarca datele in cache oleDbDataAdapter1.Fill(dataSet1); Cache["ProdCache"]=dataSet1; LeagaGrid(); } } private void LeagaGrid() { dataSet1=(DataSet)Cache["ProdCache"]; dg.DataSource= dataSet1; dg.DataBind(); }

Lucrul cu un control GridView i baz de date SqlServer sub Visual Studio 2008

Configurare ASP.NET 3.5 pentru a lucra cu Microsoft SQL Server 2005 sau SQL Server Express 2008 1. Trebuie s existe instalat serverul de web IIS sau se descarc de pe site-ul Microsoft. Testare local se poate face i cu serverul de dezvoltare furnizat de Visual .NET. 2. Se instaleaz VS 2008 i implicit .NET Framework 3.5 3. Se instaleaz SQL Server Express 2008, iar la instalare se las opiunea implicit de autentificare: Windows Authentication, nu optm pentru varianta SQL Authentication, unde ar fi trebuit s introducem username i password pentru un utilizator nregistrat n prealabil n BD. Pentru generalitate, din punctul de vedere al bazei de date, n cele ce urmeaz se vor aborda exemple de lucru pe trei direcii: SQL Server Express 2008, pe calculatorul local SQL Server 2005, la distan Microsoft Access, pe calculatorul local Inregistrarea utilizatorului ASPNET la o baz de date sub SQL Server Express 2008 4. Se deschide SQL Server Management Studio Express (daca nu il aveti instalat, se poate face download de la adresa http://msdn.microsoft.com/vstudio/express/sql/download/ 5. La deschidere apare fereastra Connect to server, n care se cer informaiile de conectare la server (Server name: numele calculatorului dvs.\SQLExpress; Authentication:Windows Authentication). 6. In fereastra din stnga (Object Explorer), se deschide Security->Logins. Se face right click pe Logins i alegei din meniul contextual New Login... In fereastra Login New, la Login name: numele calculatorului dvs.\ASPNET i apsai OK. 7. Tot n fereastra din stnga, Databases->prod->Security->Users->right click->New User...(In noua fereastra deschisa-> User Name:ASPNET; Login name: numele calculatorului dvs.\ASPNET; n fereastra de jos "Database role membership:" selectai db_datareader i db_datawriter i apsai OK). Detalii interesante putei gsi la adresa: http://www.spaanjaars.com/QuickDocId.aspx?quickdoc=395 Popularea unei baze de date sub SQL Server 2008 pe local, prin import din Access Start / All programs / MS SqlServer 2008 / Import and Export Data (32 bits); se declaneaz un wizard n care se alege Data Source MS Access, cu Browse fiierul ce contine BD surs, apoi se dau coordonatele BD destinaie. Pregtirea unei baze de date sub SQL Server 2005 la distan Pentru lucru pe un server (n cazul nostru Orion ) plasat n alt parte dect pe calculatorul local se poate proceda astfel: 4. se deschide un terminal Remote Desktop ( Run mstsc sau Remote Desktop din Programs / Accesories sau un Remote Desktop Web Connection , de exemplu, aris.ase.ro/tsweb ) 5. se indic serverul Orion sau IP 10.2.64.73 i se cere conectarea la acesta; 6. n fereastra de conectare se indic user admin i password meca2007/1 7. conectat la calculatorul respectiv, se activeaz din Programs, Sql Server Management Studio 8. urmeaz conectarea la baza de date de pe serverul ORION folosind Autentificare Windows

9. la conectare vedem i baza de date doctorat, cu trei tabele deja construite i populate cu date de test.

Dac nu avem aceste elemente deja create, sub Sql Server Management Studio se pot face operaii de genul crerii unei noi baze de date, adugrii de tabele sau actualizarea datelor dintr-o tabel. n aceast manier a fost creat baza de date doctorat, cu tabelele produse, materiale i consumuri. Crearea i popularea unei BD SqlServer folosind Server Explorer sub VS 2008 In Server Explorer pe Data Connections, mouse dreapta, Create New Sql Server DB; in fereastra care apare: Server name: 10.2.64.73 Use SQL Server Authentication user : sa password : as se d un nume bazei de date Selectnd conexiunea creat cu aceast ocazie, cu mouse dreapta pe Tables se cere Add new table i apoi se descriu cmpurile i se salveaz tabela sub un nume dorit. Este bine ca unul din cmpuri s fie declarat drept cheie (cu icon sau mouse dreapta / Set Primary key) pentru a beneficia ulterior de generare automat a comenzilor INSERT, UPDATE, DELETE. Selectnd tabela creat, cu mouse dreapta se alege Show Table Data, iar n gridul care apare se introduc pe rnd tuplurile dorite.

Smart tag este un artificiu semnalat printr-o mic sgeat plasat n coltul dreapta-sus al unor controale complexe (GridView, TreeView, Calendar etc.) prin care se accede la un meniu de configurare rapid a controlului.

Etape de lucru cu un control grid 1. n Designer, se trage un control GridView din Tools i se denumete dg; 2. cu butonul mouse dreapta pe grid se poate cere AutoFormat, avnd posibilitatea de a alege dintre mai multe formate de grid i scheme de colorare; n Properties, i se pot fixa apoi diverse alte proprieti de vizualizare (headerStyle, backColor, border style etc.); n general vorbind, proprietile din grupul Appearance afecteaz caracteristicile estetice la nivelul ntregului grid; proprietile din grupul Styles afecteaz caracteristicile la nivel de linie din grid; proprietile la nivel de coloan din grid pot fi stabilite doar prin intermediul smart tag ului (colul dreapta sus, al gridului), de unde se va selecta Edit Columns. 3. dac nu exist, se creaz o baz de date doctorat sub SqlServer. Ne asigurm c ea conine i tabela produse, n care exist cmpurile: codp, denum, pret. 4. Se dragheaz din Tools un control SqlDataSource ( dac nu exist n Tools, poate fi adus cu buton dreapta mouse Choose Items... din galeria de controale ), denumit implicit SqlDataSource1, pe care l vom redenumi n Properties SqlDataSourceOrion; 5. se configureaz obiectul SqlDataSourceOrion cu buton dreapta mouse Configure Data Source, care declaneaz un wizard prin care: n Server Explorer se alege o nou conexiune, avnd grij s selectm corect provider-ul Sql Server, dar ar putea fi i Oracle, MS Access etc. se indic baza de date ( sau fiierul coninnd baza de date, dac BD e orientat pe fiiere ca n Access, Fox etc). se compune fraza SELECT folosit la ncrcarea datelor din baza de date; pe butonul Advanced pot fi configurate i comenzile UPDATE, INSERT i DELETE, dac se dorete i acest lucru. Este posibil generarea automat a acestor comenzi doar dac unul din cmpuri (n cazul nostru codp ) este cmp cheie; altfel trebuie mai nti sub SQL Server Management Studio declarat cmpul cheie. Observaie: pentru o surs de date Access se poate folosi un obiect mai simplu, de tip AccessDataSource.

Se poate alege opiunea ca irul de conexiune s poat fi pstrat n fiierul web.config, fiind accesibil astfel din orice pagin a aplicaiei web; n acest caz, se vor memora automat n web.config numele dat conexiunii i valoarea propriu-zis, printr-o secven de genul:
<connectionStrings> <add name="doctoratConnectionString" connectionString="Data Source=orion;Initial Catalog=doctorat;User ID=sa;Password=as" providerName="System.Data.SqlClient"/> </connectionStrings>

Acest lucru, ne permite ulterior s folosim numele doctoratConnectionString pentru a localiza legtura la baza de date doctorat. 6. Controlul GridView poate deja folosi acum sursa de date creat, fixndu-i-se acestuia proprietatea Data Source pe SqlDataSourceOrion; la rulare gridul va afia datele din tabela aleas. La legarea sursei de date la un grid, partea declarativ a gridului (vezi codul surs n Designer, tab-ul Source ) se dezvolt rapid, prin preluarea informaiilor despre coloanele sursei de date. Dup legare, denumirile generice ale coloanelor din grid pot fi actualizate rapid prin click pe Refresh Schema din "smart tag". pe true, dac vrem s apar toate coloanele i n ordinea din sursa de date. pe false i adugm n Properties, Columns ( sau din smart tag, Edit Columns ) doar ce coloane dorim i n ce ordine dorim; procedm aa i cnd adugm coloane cu butoane de editare a datelor din grid.
dg.AutoGenerateColumns dg.AutoGenerateColumns

Coloanele au coninutul de un anumit tip; cele mai folosite tipuri de coloane sunt: BoundField cnd coloana este legat, adic afiez coninutul unui cmp din sursa de date; ButtonField cnd coloana afiez cte un buton pentru fiecare item din list. 5

cnd coloana afiez un checkBox pentru fiecare item din list, semnificnd true/false, pentru cmpurile cu valori logice, stocate la nivel de bit, n SQL Server; CommandField cnd coloana afiez butoane pentru selecie, editare, tergere etc. Se observ c pentru a nu crea confuzie de terminologie ntre coloan tabel i coloan grid, coloanele din grid au fost denumite cmpuri ( field ).
CheckBoxField

Se pot combina ambele variante, caz n care coloanele autogenerate sunt puse primele. O tehnic mai subtil ar fi urmtoarea: se las dg.AutoGenerateColumns pe false aa cum e pus implicit la dragarea obiectului; la legarea sursei nu se observ nimic n grid, dar apsnd Refresh Schema aferent controlului data source, AutoGenerateColumns comut automat pe true i mediul adaug cte o coloan de tip BoundField pentru fiecare cmp din data source; putem acum s schimbm ordinea coloanelor, sau n BoundField Properties denumirile din cap de coloan, s tergem coloanele care nu ne intereseaz, sau s le pstrm fcndu-le invizibile (doar programatic): dg.Columns[2].Visible = false;

La rulare, gridul este legat automat la surs i va afia datele din tabela indicat n fraza Select.

Paginarea gridului pentru a afia doar o parte din date cu smart tag (Enable Paging bifat) sau n Properties (Allow Paging true), se declar opiunea ca gridul s poat afia pe mai multe pagini informaia; n Properties, la PagerSettings / Mode se stabilete modul de navigare ntre pagini (Numeric, salt direct la pagina dorit) i numrul de indeci de pagin afiai simultan (PageButtonCount, 10); n Properties, la Page Style se precizeaz cte nregistrri sunt vizibile pe o pagin (Page Size, 4); CurrentPageIndex va conine indexul paginii curent selectat; 6

la schimbarea paginii se genereaz automat (i poate fi tratat) evenimentul PageIndexChanged.

Aceast paginare automat se realizeaz uor datorit motenirilor prin derivare din clasa ICollection i este posibil pentru un GridView bazat pe o surs de date cu proprietatea DataSourceMode pus pe DataSet, deoarece doar acesta se afl pe filiera de motenire amintit. Sortarea datelor din grid dup una sau mai multe coloane Sortarea datelor din grid se poate face: a. chiar din fraza select, prin care se ncarc dateSet-ul; aceast comand poate conine i clauza ORDER BY. Are dezavantajul c va sorta datele ori de cte ori le rencarc din BD, dar are avantajul unei sortri rapide; b. folosind obiectul DataView asociat dataSet-ului; orice dataSet are o vizualizare implicit sau explicit; un obiectul DataView e specializat pe vizualizri sub diverse forme de prezentare, inclusiv sortri complexe; concret, proprietatea DataSource a gridului poate cita obiectul DataView, care asigur vizualizarea datelor din dataSet. c. folosind faciliti ale gridului (AllowSorting pe true); cu smart tag se alege Edit Columns; pe coloanele dorite, se stabilete proprietatea SortExpression, care permite citarea unei expresii de sortare, format din nume de cmpuri nsoite de cuvintele cheie ASC i DESC; eventual se cere i Refresh Schema pentru a reactualiza schema de legare a cmpurilor.

La execuie, dnd click pe antetul unei coloane se face sortarea dup expresia de sortare corespunztoare cmpului respectiv. Editarea datelor din grid Ideea de baz a actualizrii n grid const n a aduga o coloan cu butoane de comand, cte unul pentru fiecare linie din grid; se trateaz evenimentul Click buton pentru a executa operaia corespunztoare butonului liniei respective i se rencarc gridul. n cazul editrii, apsarea butonului Edit declaneaz transformarea celulelor legate de cmpuri non-cheie, n textBox-uri. Butonul Edit se substituie pe durata editrii cu alte dou butoane, Update (apsat cnd dorim ca modificrile s fie reinute) i Cancel (cnd se renun la modificrile operate n textBox-uri). Paii de lucru: cu gridul selectat, n smart tag / Edit Columns se adaug cu Add o nou coloan de data acesta de tip Command Field, mai precis un cmp Edit, Update, Cancel; s-ar fi putut realiza acelai lucru i cu Properties / AutoGenerateEditButton pe true, dar aveam mai puine posibiliti de control asupra cmpului; 7

cu sgeat sus-jos se alege poziia cmpului nou introdus, n raport cu celelalte existente n grid, iar din fereastra din dreapta se stabilesc alte proprieti ( spre exemplu ButtonType se alege Button, ca mod de apariie), ce s scrie pe butoanele respective etc.

obiectul SqlDataSource are printre proprieti i UpdateQuery, ce conine o comand de UPDATE, care poate fi de tip text sau procedur catalogat; n cazul nostru, textul comenzii citeaz cmpurile i parametrii asociai (pui implicit, prin mecanismul de legare date i denumii dup numele cmpurilor, plus un prefix):
UPDATE produse SET denum =@denum, pret = @pret WHERE (codp = @codp)

Dei analiznd codul surs din fiierul aspx constatm c parametrii se numesc la fel i pentru comanda UPDATE i pentru INSERT sau DELETE, ei sunt inui n colecii diferite i deci nu pot fi confundai.
<DeleteParameters> <asp:Parameter </DeleteParameters> <UpdateParameters> <asp:Parameter <asp:Parameter <asp:Parameter </UpdateParameters> <InsertParameters> <asp:Parameter <asp:Parameter <asp:Parameter </InsertParameters> Name="codp" Type="String" /> Name="denum" Type="String" /> Name="pret" Type="Double" /> Name="codp" Type="String" /> Name="codp" Type="String" /> Name="denum" Type="String" /> Name="pret" Type="Double" />

Gridul fiind legat la o surs de date, DataBinding-ul funcioneaz n ambele sensuri, astfel nct parametrii aparinnd sursei de date vor fi ncrcai cu valorile modificate din grid. vor fi declanate acum, nainte de actualizarea propriu-zis, i evenimentele asociate aciunilor de modificare i tergere, astfel nct li se pot asocia funcii de tratare: dg_RowUpdating,
dg_RowCancelingEdit.

Uzual se pun aici diverse validri specifice; dac se preia n aceast funcie chiar sarcina actualizrii (spre exemplu, folosind obiecte SqlCommand i scriind n baz cu cmd.ExecuteNonQuery, se va inhiba actualizarea i cu comanda UPDATE-ul de pe sursa de date, punnd n dg_RowUpdating instruciunea e.Cancel = true. Se pot face diverse combinaii; de exemplu pentru funcia de inserare se pot ncrca unul cte unul parametrii cu valori (nu funcioneaz Binding automat cci nu avem linie nou n grid) i apoi se lanseaz metoda ExecuteNonQuery a obiectului de InsertCommand, aparinnd SqlDataSource; n 8

felul acesta nu mai este nevoie s declarm alt obiect SqlCommand, s-l echipm cu parametri, conexiune etc. tergerea datelor din grid n grid, cu smart tag / Edit Columns se adaug cu Add o nou coloan de tip Command Field, mai precis un cmp Delete; cu sgeat sus-jos se poziioneaz cmpul nou introdus, ca ultim coloan din grid, iar din fereastra din dreapta se stabilesc alte proprieti ale acestuia; SqlDataSource are printre proprieti i DeleteQuery, ce conine o comand DELETE; o putem edita direct sau o putem construi cu QueryBuilder, nct s arate astfel:
DELETE FROM produse WHERE (codp = @codp)

la rulare, prin apsarea butonului Delete, este tears nregistrarea curent selectat n grid; pentru testarea tergerii, pot fi adugate noi nregistrri fictive, folosind Server Explorer, selectnd conexiunea ctre orion.doctorat.dbo, tabela produse i beneficiem de un gen de client SQL cu care putem opera direct modificri pe baza de date.

DataKeyNames precizeaz din ce cmpuri va prelua valoarea n dicionarul Keys n dicionarele NewValues i OldValues valorile se pun O pagin poate conine extrem de multe controale; ele pot genera o mulime de evenimente, care genereaz la rndul lor cereri multiple ctre server, mrind exagerat traficul client-server. n plus, odat cu argumentele evenimentului trebuie s circule i alte informaii din pagin (spre exemplu starea controalelor) pentru a se putea reconstitui pagina la momentul primirii rspunsului de la server. Pentru diminuarea frecvenei traficului i volumului de date transferate se recomand: evitarea populrii n exces a paginii, cu controale; setarea proprietii EnableViewState a controalelor pe false, cnd nu este nevoie de pstrarea strii lor ntre dou configurri ale paginii. Adugarea datelor n grid

Proprietatea DataSourceMode a sursei de date precizeaz dac ea lucreaz cu DataSet sau DataReader, drept container de date. n principiu, dac sursa de date are proprietatea DataSourceMode pe valoarea DataSet, putem recompune dataSet-ul sau tabela de date cu care lucreaz SqlDataSource, dup modelul oferit de funcia de mai jos:
protected void btnPullDataSet_Click(object sender, EventArgs e) { string conexiunea= "Data Source=orion;Initial Catalog=doctorat;User ID=sa;Password=as"; string frazaSelect="select * from produse"; SqlDataSource SqlDataSource2= new SqlDataSource(conexiunea,frazaSelect); DataSourceSelectArguments args = new DataSourceSelectArguments(); DataView dataView1 = (DataView)SqlDataSource2.Select(args); DataTable dataTabl1 = dataView1.ToTable(); ds.Tables.Add(dataTabl1); // dg.DataSourceID = null; dg.DataSource = ds; dg.DataBind(); }

Funcia de inserare nu este implementat direct prin controlul GridView, astfel nct vom folosi SqlDataSource i vom aborda programatic problema, declarnd i instaniind obiecte de tip SqlConection, i SqlCommand. Vom aduga namespace-urile care definesc clasele aferente acestor controale
using System.Data.SqlClient; using System.Data.SqlTypes;

Adugm un buton, pe al crui eveniment de click legm funcia de adugare a unei noi nregistrri:
public void btnAdd_Click(object sender, System.EventArgs e) { DataSourceSelectArguments args = new DataSourceSelectArguments(); DataView dataView1 = (DataView)SqlDataSourceOrion.Select(args); DataTable dataTabl1 = dataView1.ToTable(); DataRow linNoua; linNoua = dataTabl1.NewRow(); int cateRecords = dataTabl1.Rows.Count, maxCod = 0, crtCod; for (int i = 0; i < cateRecords; i++) { crtCod = Convert.ToInt32(dataTabl1.Rows[i][0]); if (crtCod > maxCod) maxCod = crtCod; } maxCod++; linNoua["codp"] = "" + maxCod; // cod in secventa, dupa cel mai mare existent linNoua["denum"] = "pr_" + maxCod; linNoua["pret"] = maxCod * 100; // aducere la zi si in baza de date SqlConnection con = new SqlConnection(SqlDataSourceOrion.ConnectionString); con.Open(); SqlCommand cdaInsert = new SqlCommand( "INSERT INTO produse(codp, denum, pret) " + " VALUES (@codp, @denum, @pret)", con); cdaInsert.Parameters.Add(new System.Data.SqlClient.SqlParameter( "@codp", System.Data.SqlDbType.NVarChar, 50, "codp")); cdaInsert.Parameters.Add(new System.Data.SqlClient.SqlParameter( "@denum", System.Data.SqlDbType.NVarChar, 50, "denum")); cdaInsert.Parameters.Add(new System.Data.SqlClient.SqlParameter( "@pret", System.Data.SqlDbType.Float, 8, "pret")); // da.InsertCommand = cdaInsert; cdaInsert.Parameters["@codp"].Value = linNoua["codp"]; cdaInsert.Parameters["@denum"].Value = linNoua["denum"]; cdaInsert.Parameters["@pret"].Value = linNoua["pret"]; if (cdaInsert.ExecuteNonQuery() > 0)

10

{ mes.Text = ("Inserare cu succes "); dg.DataBind(); } else mes.Text = ("Esec la inserare "); } }

Se observ c am folosit doar principiu de extragere a dataSet-ului sursei de date, nu ntreaga funcie, oprindu-ne doar la nivel de tabel, pentru a-i aduga o linie nou. Dac se cere Refresh pe pagin, aceasta este retrimis n server; primim un avertisment n acest sens de la browser i ntr-adevr constatm c va insera cte o linie la fiecare Refresh !! Alte detalii i alte modaliti de lucru cu un GridView putei gsi consultnd exemplul de proiect complet sub VS 2008, ce va fi prezentat ntr-un capitol viitor.

11

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