crearea structurii bazei de date · pdf filec/c++, este concretizat sub ... form // clasa...
TRANSCRIPT
Autor: Sima Ioan
1
Crearea structurii Bazei de Date
Crearea bazei de date.
Diagrama bazei de date pentru aplicația de facturare:
Fig. 1
Crearea aplicației C# (proiect nou)
După pornirea lui Visual Studio, se crează un nou proiect:
File –> New –> Project
În fereastra New Project se selectează tipul proiectului: C#, apoi Windows forms
Application. Se scrie un nume sugestiv pentru proiect și se selectează locația dorită pentru
stocarea sa. După clic pe OK se va crea o soluție și un proiect
*. O soluție (solution) este un container în care se pot regăsi unul sau mai multe proiecte.
Autor: Sima Ioan
2
Fig. 2
Arhitectura aplicațiilor C# (soluția și proiectul)
În urma efectuării acțiunilor de mai sus, Visual Studio va genera două fișiere pentru
soluție, ambele având numele proiectului, cu extensiile sln și suo. În cazul de față vom regăsi
fișierele Facturare.sln și Facturare.v11.suo. Vxx reprezintă versiunea de Visual Studio, 11 în
cazul VStudio 2012.
Pentru fiecare din proiectele incluse în soluție va fi generat câte un folder (director) al
cărui nume corespunde numelui ales în momentul creării sale. În cazul nostru vom avea un
singur folder numit deasemenea tot Facturare. În interiorul său se regăsesc, pentru proiecte de
tip Windows Forms, trei foldere și cinci fișiere ce aparțin proiectului.
În folderul Properties se regăsesc fișiere de resurse și fișiere în care sunt informații
necesare asamblării aplicației, iar în folderul bin vom găsi fișierul executabil.
Fișierele sunt:
1). Fișierul app.config este un fișier xml în care vom (și se vor) stoca informații de
configurare a aplicației. Inițial în acest fișier este creat doar cadrul general pentru configurări:
<?xml version="1.0" encoding="utf-8" ?> <configuration> </configuration>
Autor: Sima Ioan
3
2). Similar celor două fișiere care rețin date despre soluție, pentru proiect avem fișierul
xml cu numele proiectului și extensia csproj (ex: Facturare.csproj).
3). Orice proiect C#, crează un spațiu de nume sau domeniu de nume (namespace) numit
la fel ca proiectul (în cazul nostru namespace Facturare. Acest namespace este partajat în toate
fișierele cod ale proiectului, atât timp cât nu creem noi un alt spațiu în mod explicit.
Punctul de intrare în program se găsește în fișierul Program.cs. și, asemănător aplicațiilor
C/C++, este concretizat sub forma funcției Main(), care este de fapt o metodă a clasei Program,
clasă care, la rândul său, este inclusă în spațiul de nume Facturare. Spre deosebire de aplicațiile
C/C++, în C# toate elementele unei aplicații sunt definite, obligatoriu, în înteriorul claselor.
Rezultatul acestei constrângeri e faptul că nu putem avea nici variabile globale, nici funcții
independente. Implicit, prin directiva using, sunt importate în proiect mai multe spații de nume
necesare funcționării sale.
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms;
namespace Facturare // – spațiul de nume (domeniu de nume) {
static class Program // – clasa Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread]
static void Main()// – metoda Main { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }
4). 5). În momentul creării proiectului a fost generată o fereastră (form sau formular).
Orice form este de fapt o clasă inclusă în spațiul de nume al proiectului (Facturare), derivata din
clasa Form. Datele formularulului sunt stocate în două fișiere: codul sursă, în Form1.cs, iar
aspectele de design, în fișierul Form1.Designer.cs. Denumirea acestor fișiere poate fi modificată,
ca de altfel a tuturor elementelor unei aplicații C#. Vom observa că C#, pentru fiecare form din
aplicație, va mai crea câte un fișier xml pentru resurse.
Autor: Sima Ioan
4
Inițial, fișierul sursă conține directivele pentru importul unor spații de nume, urmate de
implementarea clasei Form1 și a constructorului său.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Facturare { public partial class Form1 : Form // clasa Form1 derivată din clasa Form { public Form1() // constructorul clase Form1 { InitializeComponent(); } } }
Componentele unei aplicații C# pot fi vazute în fereastra Solution Explorer, de obicei
situată în partea dreapta sus a mediului Visual Studio.
Fig. 3
Autor: Sima Ioan
5
Solution Explorer poate fi închisă prin clic pe X-ul ferestrei și poate fi afișată fie din
meniul View -> Solution Explorer, fie prin tastarea combinației Ctrl-W,S.
Adăgarea unui nou proiect la o soluție existentă
Dacă se dorește adăgarea unui nou proiect la o soluție existentă se efectuează:
Clic dreapta, în Solution Explorer, pe numele soluției –> Add -> New Project...
Se selectează tipul de proiect dorit și se repetă pașii de la Crearea unui proiect nou.
Afișarea formului în mediul Visual Studio
Vom scimba numele ferestrei Form1 în Main (pentru că intenționăm ca aceasta să fie
fereastra principală a aplicației noastre). Pentru aceasta, în Solution Explorer, dăm clic dreapta pe
elementul Form1.cs, apoi selectăm Rename. Suprascriem noua denumire (Main, în exemplul
nostru) și tastăm Enter. Răspundem cu Yes la mesajul care ne întreabă dacă dorim să se schimbe
numele ferestrei în toate locurile din aplicație unde e referit. În urma acestei acțiuni vom observa
că au fost modificate atât elementele din Solution Explorer, cât și numele fișierelor
corespondente. Bineînțeles că a fost redenumită și clasa Form1.
În zona centrală a lui Visual Studio putem afișa codul și a designul formului Main:
- Pentru a vedea designul ferestrei (aspectul grafic) se efectuează dublu clic pe
elementul Main.cs din Solution Explorer;
- Pentru a vedea codul C# se face dublu clic pe Main, sau clic dreapta pe Main.cs, apoi
View Code, sau se face dublu clic pe un element din designul ferestrei;
- Dacă dorim să vedem codul de implementare al designului ferestrei, dublu clic pe
Main.Designer.cs;
Pentru a schimba textul din bara de titlu a Form-ului:
- Dublu clic pe Main.cs din Solution Explorer;
- Clic în orice zonă din fereastră;
- În fereastra Properties a Visual Studio (care se găsește de obicei în zona dreapta jos)
se schimbă textul din proprietatea Text la Facturare, așa cum se vede în imaginea de
mai jos.
Autor: Sima Ioan
6
Fig. 4
Rularea aplicației
Chiar dacă nu am scris nicio linie de cod încă, avem deja o aplicație complet funcțională
pe care prin acționarea tastei F5 o putem rula. În urma rulării va apărea pe ecran fereastra Main.
De obicei aplicațiile de baze de date ocupă tot ecranul, motiv pentru care dăm clic pe
form-ul Main, iar din fereastra de proprietăți setăm WindowState la Maximized.
Închiderea aplicației
Aplicația se va închide atunci când este închis ultimul form al său. Dar se poate crea un
buton special pentru închiderea aplicației. Alteori ajungem într-un punct în care aplicația trebuie
închisă pentru că altfel ar rula defectuos.
Codul pentru închidere, de obicei plasat în evenimentul clic al butonului de Inchidere a
aplicației, este:
Application.Exit();
Adăugarea unui nou form
Fiecare proiect dintr-o soluție are form-urile sale. Din acest motiv, în cazul în care avem
mai multe proiecte într-o soluție, trebuie să fim atenți la care proiect adăugăm ferestre (form-uri).
Pașii sunt:
- Clic dreapta pe numele proiectului (pe Facturare)
- Add -> Windows Form
Autor: Sima Ioan
7
- În fereastra care apare, deja e selectat item-ul Windows Form, trebuie doar să îi dăm
un nume sugestiv. (În cazul nostru o să-l denumim Clienti), apoi OK.
Deschidera unui form în run-time
Design-Time – este timpul în care se crează aplicația în Visual Studio
Run-Time – este timpul în care aplicația se găsește în execuție
Ceea ce dorim să facem acum este să deschidem (creem) în run-time fereastra Clienti prin
acționarea unui buton.
Pentru aceasta, mai întâi adăugăm un buton în Form-ul Main.
- Clic pe form-ul Main
- Din fereastra Toolbox (în partea stânga sus) fie se face dublu clic pe buton, fie se
trage cu mouse-ul peste formul Main.
- Se dă clic pe buton, apoi se schimbă proprietatea Text de la button1 la Clienti.
* Afișarea ferestrei Toolbox se face tot din meniul View
Fig. 5
Dăm dublu clic pe buton pentru a intra în partea de cod și în evenimentul clic scriem:
Form f=new Clienti(); f.Show();
Autor: Sima Ioan
8
Dacă rulăm aplicația vom observa că, prin efectuarea unui clic pe butonul Clienti, din
form-ul Main se va deschide form-ul Clienti.
Există însă două inconveniente:
- ambele ferestre sunt vizibile în Taskbar (bara de jos a Windows-ului), ceea ce i-ar da
utilizatorului impresia că a deschis două aplicații
- fereastra Clienți nu se deschide în zona centrală a ferestrei părinte (Main).
Ca să nu se afișeze fereastra de clienți în taskbar, se dă clic într-o zonă liberă a sa (pentru
a apărea proprietățile sale) și se setează ShowInTaskbar la False.
Dacă setăm StartPosition la CenterParent form-ul Clienți va fi afișat în zona centrală a
form-ului Main.
Conexiunea la baza de date
Varianta 1
- Clic pe Form-ul Clienti
- În Toolbox căutăm tab-ul Data.
- Selectăm DataGridView și îl tragem în form-ul Clienti.
Fig. 6
Deschidem dropdown-ul Choose Data Source, apoi clic pe Add Project Data Source
Autor: Sima Ioan
9
Fig. 7
Clic pe Database, apoi Next
Clic pe DataSet, apoi Next
Clic New Connection, Next
Autor: Sima Ioan
10
Fig. 8
In fereastra Add Connection care apare, dăm clic pe Change, selectăm furnizorul de date
ca în imaginea de mai jos și OK
Autor: Sima Ioan
11
Fig. 9
Apare fereastra de mai jos
Autor: Sima Ioan
12
Fig. 10
Selectăm numele server-ului din comboboxul Server name. În cazul în care apare doar
numele calculatorului așa ca în imagine, se scrie manual numele serverului. Exemplu:
MOBIL\sqlexpress.
Menținem Use Windows Authentication bifat
După câteva secunde în combobox-ul Select or enter a database name apar numele
bazelor de date din serverul SQLServer.
Selectăm numele bazei de date. Exemplu: facturare.
Opțional putem testa conexiunea prin clic pe Test connection.
Autor: Sima Ioan
13
Fig. 11
Clic pe OK
Clic OK
În fereastra Wizard în care ne-am întors ar trebui să vedem numele serverului și al bazei
de date.
Dacă expandăm + -ul Connection string... vom vedea stringul de conectare la baza de
date, ca mai jos.
Autor: Sima Ioan
14
Fig. 12
Next
Acceptăm denumirea conexiunii. Ex: facturareConnectionString – este stringul de
conectare la baza de date Facturare.
Next
Bifăm tot (tabele, vederi, proceduri, funcții). E suficient să bifăm numai tabelele sau
numai tabela care ne interesează.
Acceptăm numele DataSet-ului. Exemplu: facturareDataSet – dataSet nu face parte din
modeul ADO.Net. În DataSet am făcut o „copie” a bazei de date SQL Server și de aici înainte
aplicația va lucra cu această copie.
Finish
După închiderea ferestrei ne întoarcem în zona de setare a gridului unde selectăm
Binding-ul, ca în imaginea de mai jos. În exemplul nostru am selectat tabela Clienti
Autor: Sima Ioan
15
Fig. 13
Mai întâi observăm că în partea de jos a form-ului Clienti au apărut trei
Deasemenea observăm în Solution Explorer că a apărut o nouă entitate numită
facturareDataSet.xsd pe care dacă o expandăm vedem că în spatele său se găsesc încă trei fișiere.
În viitor, dacă dorim să scriem cod o să mai apară un fișier cu extensia cs. Deci, în total un
DataSet este stocat în 5 fișiere.
Ca să accesăm aspectul grafic al DataSet-ului facem dublu clic pe facturareDataSet.xsd
și în zona de lucru a Visual Studio apare conținutul său similar unei diagrame SQL Server, așa
cum se poate vedea în figură.
Autor: Sima Ioan
16
Fig. 14
Desenăm un buton în partea dreapta jos a ferestrei Clienți, iar din Properties îi schimbăm
numele (Name) la „cmdClose” și proprietatea Text o schimbăm la „Inchide”. Cu dublu clic pe
buton intram in evenimentul clic al său și introdusem linia de cod pentru închiderea ferestrei:
this.Close();
Varianta 2
Adăugăm o nouă fereastră (form) la proiectul nostru pe care o numim Facturi.
Din Toolbox, tab-ul Data, adăugăm un DataGridView în zona de sus a ferestrei, însă de
această dată dăm clic pe form pentru a dispărea meniul ce apare peste grid. În acest fel grid-ul
rămâne nelegat la baza de date. Îl redenumim facturiGridView.
Similar, adăugăm al doilea grid în partea de jos pe care îl redenumim facturiGridView.
Putem să adăugăm un buton pentru închiderea form-ului, eventual pentru adăugare,
modificare și stergere rânduri. Form-ul ar trebui să arate ca mai jos.
Autor: Sima Ioan
17
Creăm apoi un nou buton în form-ul Main pe care îl numim Facturi, iar în evenimentul
clic al său inserăm codul:
Form f = new Facturi(); f.Show();
Apoi, dublu clic pe form-ul Facturi (atentie, a nu se da din greșeală dublu clic pe grid-uri
sau pe butoane) pentru a intra în evenimentul Load al său.
Pentru a avea acces la spațiul de nume SQL, în zona de declarații adăugăm:
using System.Data.SqlClient;
După linia de declaratie a clasei Facturi
public partial class Facturi : Form {
Inserăm:
//cream conexiunea la baza de date //SqlConnection conn = new SqlConnection(@"Data Source = mobil\sqlexpress;Database=facturare; User ID=sa;Password="); SqlConnection conn = new SqlConnection(@"Data Source = mobil\sqlexpress; Initial Catalog=Facturare; Integrated Security=true"); //creem DataSet-ul aici ca sa existe pe toata durata existentei form-ului
Autor: Sima Ioan
18
DataSet ds = new DataSet();
În această linie am declarat o variabilă numită conn care reprezintă conexiunea la baza de
date și care va fi folosită pe durata de viață a form-ului Facturi. Deasemenea am declarat
DataSet-ul în care vom stoca tabela Facturi.
Ne întoarcem în evenimentul Load și scriem următorul cod:
try { //deschidem conexiunea conn.Open(); } catch (Exception ex) { MessageBox.Show(ex.Message); } //Cream Adaptorul folosindu-ne de un Command (ascuns) care executa selectul, si de conexiunea deschisa mai devreme SqlDataAdapter facturiAdaptor = new SqlDataAdapter("select * from Facturi",conn); //Adaptorul umplde DataSet-ul cu datele preluate din tabela Facturi //in acelasi timp in DataSet este creata o tabela pe care o numim 'facturi' facturiAdaptor.Fill(ds,"facturi"); //Legam Grid-ul, prin intermediul proprietatii DataSource, la tabela 'facturi' din DataSet facturiGridView.DataSource = ds.Tables["facturi"];//ds.Tables[0] //Apelam o functie creata pentru a popula al doilea grid
PopulateGridDetalii(0);
Codul funcției PopulateGridDetalii:
private void PopulateGridDetalii(int nr_rand) { //declaram o variabila pentru id-ul facturii selectata in primul grid int idf; //extragem id-ul facturii din tabela facturi care e in DataSet
//puteam sa ne folosim si direct de datele din Grid int.TryParse(ds.Tables["facturi"].Rows[nr_rand]["id"].ToString(), out idf);
//creem un Adaptor al carui select il cream direct aici SqlDataAdapter detaliiAdaptor = new SqlDataAdapter("select * from DetaliiFactura where id_factura = " + idf.ToString(), conn); //cream un al doilea DataSet DataSet ds2 = new DataSet(); //ds2.Clear(); //cream in al doilea DataSet tabela detalii in care inseram datele din selectul de mai sus detaliiAdaptor.Fill(ds2, "detalii");
//legam al doilea Grid la tabela detalii din al doilea DatSet detaliiGridView.DataSource = ds2.Tables["detalii"]; ds2.Dispose(); //inchidem DataSet-ul cu
Autor: Sima Ioan
19
}
Pentru ca al doilea grid să fie sensibil funcție de rândul selectat în primul grid atunci când
efectuăm clic cu mouse-ul, inserăm următorul cod în evenimentul CellClick al primului grid:
private void facturiGridView_CellClick(object sender, DataGridViewCellEventArgs e) { PopulateGridDetalii(e.RowIndex);
}
Pentru a se întâmpla același lucru atunci când folosim tastele săgeți, ne folosim de
evenimentul KeyDown al primului grid:
private void facturiGridView_KeyUp(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.Up: case Keys.Down: case Keys.PageUp: case Keys.PageDown: //MessageBox.Show(facturiGridView.CurrentRow.Index.ToString()); PopulateGridDetalii(facturiGridView.CurrentRow.Index); break; default: break; }
}
Deoarece n-am închis conexiunea, o vom ănchide explicit în evenimentul FormClosing al
formularului. Aceasta înseamnă că obiectul Connection e persistent pe durata de viață a form-
ului facturi.
private void Facturi_FormClosing(object sender, FormClosingEventArgs e) { conn.Close();
}
Operațiile de Adăugare, Modificare și Ștergere vi le las vouă.
Varianta 3
Din meniul View, Other Windows, afișăm fereastra DataSorces. Implicit, apare în zona
stânga jos a mediului Visual Studio.
Autor: Sima Ioan
20
Aici, în cazul în care suntem într-o aplicație nouă, putem adăuga o sursă nouă de date, fie
cu clic pe primul buton din stânga barei de instrumente, fie cu clic dreapta în zona albă a ferestrei
DataSources, apoi clic pe Add New data Source.... Apare fereastra din figura 7 iar pașii se
repetă ca în varianta 1.
În cazul nostru, în fereastra Data Sources o să găsim deja DataSet-ul facturareDataSet,
cel pe care l-am creat la varianta 1.
Creăm un nou form pe care îl redenumim Produse.
Prindem tabela de Produse din Data Sources și o tragem peste form-ul nou creat.
Observăm că în form au apărut:
- o bară de instrumente în partea de sus, care însă nu e funcțională complet
- un Grid care gata legat la sursa de date
- în partea de jos a ferestrei găsim DataSet-ul creat în varianta 1, un Adapter pentru
produse care a fost creat tot în varianta 1, însă nu era folosit nicăieri,
În această variantă am creat o fereastră complet funcțională pentru gestionarea datelor din
tabela Produse. Ceea ce trebuie știut este că în grid putem să efectuăm mai multe operații de
adăugare, modificare, respectiv ștergere, toate acestea având loc în DataSet, însă, pentru a le
salva în baza de date SQL Server, trebuie să dăm clic pe dischetă (Save). Acest mod aduce mai
mult cu lucrul în aplicații de tip Office, decât cu lucrul în aplicații pentru baze de date.