crearea structurii bazei de date · pdf filec/c++, este concretizat sub ... form // clasa...

20
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.

Upload: buinguyet

Post on 02-Feb-2018

241 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 2: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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>

Page 3: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 4: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 5: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 6: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 7: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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();

Page 8: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 9: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

Autor: Sima Ioan

9

Fig. 7

Clic pe Database, apoi Next

Clic pe DataSet, apoi Next

Clic New Connection, Next

Page 10: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 11: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

Autor: Sima Ioan

11

Fig. 9

Apare fereastra de mai jos

Page 12: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 13: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 14: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 15: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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ă.

Page 16: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 17: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 18: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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

Page 19: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.

Page 20: Crearea structurii Bazei de Date · PDF fileC/C++, este concretizat sub ... Form // clasa Form1 derivată din clasa Form { ... numele calculatorului așa ca în imagine, se scrie manual

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.