Introducere in .Net Framework Suport de Curs Pentru Elevi
Introducere in .Net Framework Suport de Curs Pentru Elevi
Introducere in .Net Framework Suport de Curs Pentru Elevi
Adrian Niţă
profesor, Colegiul Naţional „Emanuil Gojdu”, Oradea
Maria Niţă
profesor, Colegiul Naţional „Emanuil Gojdu”, Oradea
Nicolae Olăroiu
profesor, Colegiul Naţional „B.P. Hașdeu”, Buzău Suport de curs pentru elevi
Rodica Pintea
profesor, Liceul „Grigore Moisil”, București (capitolul 1)
Cristina Sichim
profesor, Colegiul Naţional „Ferdinand I”, Bacău
Daniela Tarasă
Inspector Informatică, ISJ Bacău
Coordonatori:
Mihai Tătăran
cadru didactic asociat, Universitatea Politehnică Timișoara
Nușa Dumitriu-Lupan
inspector General MECT
Petru Jucovschi
Developer Community Lead, Microsoft România
Introducere în
.Net Framework
Ediţia 2008
Cerinþe de sistem
Arhitectura suportatã:
• x86
• x64 (WOW)
Cerinþe Hardware:
• Minimum: CPU 1.6 GHz, RAM 192 MB, Rezoluþie Monitor 1024x768, Disc 5400 RPM
• Recomandat: CPU 2.2 GHz sau mai puternic, RAM 384 MB sau mai mult, rezoluþie monitor 1280x1024,
Disc 7200 RPM sau mai mult.
• Windows Vista: CPU 2.4 GHz, RAM 768 MB, Spaþiu liber disc 1.3 GB pentru instalare completã
Resurse ºi Instrumente:
• www.microsoft.ro/ark - Academic Resource Kit, colecþie de instrumente software ºi resurse
educaþionale.
Cuvânt Înainte
Dragi elevi,
Suportul de curs este publicat în douã versiuni. Cea pentru elevi cuprinde doar com-
ponenta de specialitate. Versiunea pentru profesori cuprinde pe lângã componenta
de specialitate ºi pe cea metodicã de predare.
Sanda Foamete
SNR Manager de Proiecte Educaþionale
Microsoft România
Autori, în ordine alfabeticã:
Coordonatori:
Editat de BYBLOS SRL sub coordonarea Agora Media SA, pentru Microsoft România. Ediþia 2008.
ISBN: 973-86699-5-2
Notã:
Acest suport de curs este destinat elevilor de la clasele matematicã-informaticã ºi matematicã-informaticã
intensiv, care au optat în programa ºcolarã, pentru variantele: Programare orientatã obiect, Progamare
vizualã cu C# ºi Programare web cu Asp.Net. Suportul de curs poate fi utilizat gratuit exclusiv în procesul
de predare-învãþare. Este interzisã utilizarea suportului de curs „Introducere în .Net Framework” pentru
scopuri comerciale sau în alte scopuri în afara celui descris mai sus.
Drepturile de autor asupra suportului de curs „Introducere în .Net Framework” aparþin Microsoft.
Introducere în .Net Framework (Suport de curs) 3
CUPRINS
1 Programarea Orientatã Obiect (POO) cu C# . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.1. Evoluþia tehnicilor de programare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.2. Tipuri de date obiectuale. Încapsulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
1.3. Supraîncãrcare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
1.4. Moºtenire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.5. Polimorfism. Metode virtuale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.6. Programare orientatã obiect în C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.7. Declararea unei clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.8. Constructori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
1.9. Destructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.10. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.11. Proprietãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
1.12. Evenimente ºi delegãri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17
1.13. Interfeþe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
3. Limbajul C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.1. Caracterizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.2. Compilarea la linia de comandã . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.3. Crearea aplicaþiilor consolã . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
3.4. Structura unui program C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
3.5. Sintaxa limbajului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
3.6. Tipuri de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
3.7. Conversii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
3.7.1. Conversii numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
3.7.2. Conversii între numere ºi ºiruri de caractere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
3.7.3. Conversii boxing ºi unboxing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
3.8. Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.9. Variabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.10. Expresii ºi operatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
3.11. Instrucþiuni condiþionale, de iteraþie ºi de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
3.11.1. Instrucþiunea if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4 Introducere în .Net Framework (Suport de curs)
6. ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89
6.1. Arhitectura ADO.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.2. Furnizori de date (Data Providers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.3. Connection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
6.3.1. Exemple de conectare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
6.3.2. Proprietãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
6.3.3. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.3.4. Evenimente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.4. Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
6.4.1. Proprietãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
6.4.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
6.4.3. Interogarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.4. Inserarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.5. Actualizarea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
6.4.6. ªtergerea datelor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
6.5. DataReader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.5.1. Proprietãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.5.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .99
6.6. DataAdapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101
6.6.1. Proprietãþi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.6.2. Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.7. DataSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102
6.8. SqlParameter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .104
6.9. Proceduri Stocate (Stored Procedures) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .105
6.10. Proiectarea vizualã a seturilor de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106
7
CAPITOLUL 1
Programarea Orientatã Obiect (POO) cu C#
1.3. Supraîncãrcare
Deºi nu este o tehnicã specificã programãrii orientatã obiect, ea creeazã un anu-
mit context pentru metodele ce formeazã o clasã ºi modul în care acestea pot fi (ca
orice subprogram) apelate.
Prin supraîncarcare se înþelege posibilitatea de a defini în acelaºi domeniu de
vizibilitate2 mai multe funcþii cu acelaºi nume, dar cu parametri diferiti ca tip ºi/sau ca
numãr. Astfel ansamblul format din numele funcþiei ºi lista sa de parametri reprezin-
tã o modalitate unicã de identificare numitã semnãturã sau amprentã. Supra-
1 Datoritã tehnicii de supraîncãrcare C++, Java ºi C# permit existenþa mai multor constructori
2 Noþiunile generale legate de vizibilitate se considerã cunoscute din programarea proceduralã. Aspectele specifice
ºi modificatorii de acces/vizibilitate pot fi studiaþi din documentaþiile de referinþã C#.
10 Introducere în .Net Framework (Suport de curs)
încãrcarea permite obþinerea unor efecte diferite ale apelului în contexte diferite3.
Apelul unei funcþii care beneficiazã, prin supraîncãrcare, de douã sau mai multe
semnãturi se realizeazã prin selecþia funcþiei a cãrei semnãturã se potriveºte cel mai
bine cu lista de parametri efectivi (de la apel).
Astfel, poate fi definitã metoda ”comandã on-line” cu trei semnãturi diferite:
comanda_online(cod_prod) cu un parametru întreg (desemnând comanda unui singur
produs identificat prin cod_prod.
comanda_online(cod_prod,cantitate) cu primul parametru întreg ºi celalalt real
comanda_online(cod_prod,calitate) cu primul parametru întreg ºi al-II-lea caracter.
1.4. Moºtenire
Pentru tipurile de date obiectuale class este posibilã o operaþie de extindere sau
specializare a comportamentului unei clase existente prin definirea unei clase noi ce
moºteneºte datele ºi metodele clasei de bazã, cu aceastã ocazie putând fi redefiniþi
unii membri existenþi sau adãugaþi unii membri noi. Operaþia mai poartã numele de
derivare.
Clasa din care se moºteneºtea se mai numeºte clasã de bazã sau superclasã. Clasa
care moºteneºte se numeºte subclasã, clasã derivatã sau clasã descendentã.
Ca ºi în Java, în C# o subclasã poate moºteni de la o singurã superclasã, adicã avem
de-a face cu moºtenire simplã; aceeaºi superclasã însã poate fi derivatã în mai multe
subclase distincte. O subclasã, la randul ei, poate fi superclasã pentru o altã clasã
derivatã. O clasã de bazã impreunã cu toate clasele descendente (direct sau indirect)
formeaza o ierarhie de clase. În C#, toate clasele moºtenesc de la clasa de bazã Object.
În contextul mecanismelor de moºtenire trebuie amintiþi modificatorii abstract ºi
sealed aplicaþi unei clase, modificatori ce obligã la ºi respectiv se opun procesului de
derivare. Astfel, o clasã abstractã trebuie obligatoriu derivatã, deoarece direct din ea
nu se pot obþine obiecte prin operaþia de instanþiere, în timp ce o clasã sigilatã
(sealed) nu mai poate fi derivatã (e un fel de terminal în ierarhia claselor). O metodã
abstractã este o metodã pentru care nu este definitã o implementare, aceasta urmând
a fi realizatã în clasele derivate din clasa curentã4. O metodã sigilatã nu mai poate fi
redefinitã în clasele derivate din clasa curentã.
3 Capacitatea unor limbaje (este ºi cazul limbajului C#) de a folosi ca "nume" al unui subprogram un operator, repre-
zintã supraîncãrcarea operatorilor. Aceasta este o facilitate care "reduce" diferenþele dintre operarea la nivel abstract
(cu DTA) ºi apelul metodei ce realizeazã acestã operaþie la nivel de implementare obiectualã. Deºi ajutã la sporirea
expresivitãþii codului, prin supraîncãrcarea operatorilor ºi metodelor se pot crea ºi confuzii.
4 care trebuie sã fie ºi ea abstractã (virtualã purã, conform terminologiei din C++)
5 deoarece tot aspecte polimorfice îmbracã ºi unele tehnici din programarea clasicã sau tehnica supraîncãrcãrcãrii
funcþiilor ºi operatorilor.
CAPITOLUL 1. Programarea orientatã obiect (POO) cu C# 11
riþi având însã acelaºi nume. Astfel, în cazul unei referiri obiectuale, se pune problema
stabilirii datei sau metodei referite. Comportamentul polimorfic este un element de
flexibilitate care permite stabilirea contextualã, în mod dinamic6, a membrului referit.
De exemplu, dacã este definitã clasa numitã PIESA (de ºah), cu metoda nestaticã
muta(pozitie_initiala,pozitie_finala), atunci subclasele TURN ºi PION trebuie sã
aibã metoda muta definitã în mod diferit (pentru a implementa maniera specificã a
pionului de a captura o piesã ”en passant”7). Atunci, pentru un obiect T, aparþinând
claselor derivate din PIESA, referirea la metoda muta pare nedefinitã. Totuºi mecanis-
mele POO permit stabilirea, în momentul apelului, a clasei proxime cãreia îi aparþine
obiectul T ºi apelarea metodei corespunzãtore (mutare de pion sau turã sau altã
piesã).
Pentru a permite acest mecanism, metodele care necesitã o decizie contextualã (în
momentul apelului), se declarã ca metode virtuale (cu modificatorul virtual). În mod
curent, în C# modificatorului virtual al funcþiei din clasa de bazã, îi corespunde un
specificator override al funcþiei din clasa derivatã ce redefineºte funcþia din clasa de
bazã.
O metodã ne-virtualã nu este polimorficã ºi, indiferent de clasa cãreia îi aparþine
obiectul, va fi invocatã metoda din clasa de bazã.
6 Este posibil doar în cazul limbajelor ce permit "legarea întârziatã". La limbajele cu "legare timpurie", adresa la care
se face un apel al unui subprogram se stabileºte la compilare. La limbajele cu legare întârziatã, aceastã adresa se sta-
bileste doar in momentul rulãrii, putându-se calcula distinct, în funcþie de contextul în care apare apelul.
7 Într-o altã concepþie, metoda muta poate fi implementatã la nivelul clasei PIESA ºi redefinitã la nivelul subclasei
PION, pentru a particulariza acest tip de deplasare care captureazã piesa peste care trece pionul în diagonalã.
8 echivalentrul claselor template din C++
9 [] din definiþia schematicã semnificã un neterminal, iar o semnificã o componentã opþionalã
12 Introducere în .Net Framework (Suport de curs)
1.8. Constructori
Sintaxa:
[atrib]o [modificatori]o [nume_clasã]([listã_param_formali]o)[:iniþializator]o [corp_constr]o
Modificatori: public protected internal private extern
Iniþializator: base([listã_param]o), this([listã_param]o) ce permite invocarea unui
constructor anume12 înainte de executarea instrucþiunilor ce formeazã corpul con-
structorului curent. Dacã nu este precizat niciun iniþializator, se asociazã implicit
iniþializatorul base().
Corpul constructorului este format din instrucþiuni care se executã la crearea unui
10 având în vedere cã ele pot sã facã parte dintr-o clasã interioarã altei clase
11 din semnãturã nefãcând parte specificatorii ref ºi out asociaþi parametrilor
12 Din clasa de bazã (base) sau din clasa insãºi (this)
CAPITOLUL 1. Programarea orientatã obiect (POO) cu C# 13
nou obiect al clasei respective (sau la crearea clasei, în cazul constructorilor cu mo-
dificatorul static).
• pot exista mai mulþi constructori care se pot diferenþia prin lista lor de parametri
• constructorii nu pot fi moºteniþi
• dacã o clasã nu are definit niciun constructor, se va asigna automat constructorul
fãrã parametri al clasei de bazã (clasa object, dacã nu este precizatã clasa de bazã)
Instanþierea presupune declararea unei variabile de tipul clasei respective ºi
iniþializarea acesteia prin apelul constructorului clasei (unul dintre ei, dacã sunt
definiþi mai mulþi) precedat de operatorul new. Acestea se pot realiza ºi simultan într-o
instrucþiune de felul:
[Nume_clasã] [nume_obiect]=new [Nume_clasã] ([listã_param]o)
Existã douã motive pentru care definiþia constructorului al treilea din clasa Fetita
este greºitã ºi de aceea este comentatã. Care sunt aceste motive?
1.9. Destructor
Sintaxa: [atrib]o [extern]o ~[nume_clasã] () [corp_destructor]o
Corpul destructorului este format din instrucþiuni care se executã la distrugerea
unui obiect al clasei respective. Pentru orice clasã poate fi definit un singur construc-
tor. Destructorii nu pot fi moºteniþi. În mod normal, destructorul nu este apelat în
mod explicit, deoarece procesul de distrugere a unui obiect este invocat ºi gestionat
automat de Garbagge Collector.
1.10. Metode
Sintaxa:[atrib]o[modificatori]o[tip_returnat][nume]([listã_param_formali]o) [corp_metoda]o
Modificatori: new public protected internal private static virtual abstract sealed
override extern15
Tipul rezultat poate fi un tip definit sau void. Numele poate fi un simplu identifica-
tor sau, în cazul în care defineºte în mod explicit un membru al unei interfeþe, numele
este de forma [nume_interfata].[nume_metoda]
Lista de parametri formali este o succesiune de declarãri despãrþite prin virgule,
declararea unui parametru având sintaxa: [atrib]o [modificator]o [tip] [nume]
Modificatorul unui parametru poate fi ref (parametru de intrare ºi ieºire) sau out
(parametru care este numai de ieºire). Parametrii care nu au niciun modificator sunt
parametri de intrare.
Un parametru formal special este parametrul tablou cu sintaxa:
[atrib]o params [tip][] [nume].
Pentru metodele abstracte ºi externe, corpul metodei se poate reduce la un semn ;
Semnãtura fiecãrei metode este formatã din numele metodei, modificatorii aces-
teia, numãrul ºi tipul parametrilor16
Numele metodei trebuie sã difere de numele oricãrui alt membru care nu este
metodã.
La apelul metodei, orice parametru trebuie sã aibã acelaºi modificator ca la definire
Invocarea unei metode se realizeazã prin sintagma [nume_obiect].[nume_metoda]
(pentru metodele nestatice) ºi respectiv [nume_clasã].[nume_metoda] (pentru
metodele statice).
Definirea datelor ºi metodelor statice corespunzãtoare unei clase
15 Poate fi folosit cel mult unul dintre modificatorii static, virtual ºI override ; nu pot apãrea împreunã new ºi over-
ride, abstract nu poate sã aparã cu niciunul dintre static, virtual, sealed, extern; private nu poate sã aparã cu niciunul
dintre virtual, override ºi abstract; seald obligã ºi la override
16 Din semnãturã (amprentã) nu fac parte tipul returnat, numele parametrilor formali ºi nici specificatorii ref ºi out.
CAPITOLUL 1. Programarea orientatã obiect (POO) cu C# 15
17 Se are în vedere ºi constructorul fãrã parametri definit ºi preluat implicit în subclasele din cadrul primului exem-
plu din subcapitolul 1.8: public Copil() {nume = Console.ReadLine();}
18 Decât cu ajutorul modificatorului new pentru metoda respectivã în clasa derivatã
16 Introducere în .Net Framework (Suport de curs)
1.11. Proprietãþi
Proprietatea este un membru ce permite accesul controlat la datele-membru ale
clasei.
Sintaxa: [atrib]o [modificatori]o [tip] [nume_proprietate] {[metode_de_acces]o}
Observaþiile privind modificatorii ºi numele metodelor sunt valabile ºi în cazul pro-
prietãþilor.
Metodele de acces sunt douã: set ºi get. Dacã proprietatea nu este abstractã sau
externã, poate sã aparã una singurã dintre cele douã metode de acces sau amân-
douã, în orice ordine.
Este o manierã de lucru recomandabilã aceea de a proteja datele membru (câm-
puri) ale clasei, definind instrumente de acces la acestea: pentru a obþine valoarea
câmpului respectiv (get) sau de a memora o anumitã valoare în câmpul respectiv
(set). Dacã metoda de acces get este perfect asimilabilã cu o metodã ce retuneazã o
valoare (valoarea datei pe care vrem s-o obþinem sau valoarea ei modificatã conform
unei prelucrãri suplimentare specifice problemei în cauzã), metoda set este asimi-
labilã cu o metodã care un parametru de tip valoare (de intrare) ºi care atribuie (sau
nu, în funcþie de context) valoarea respectivã câmpului. Cum parametrul corespunzã-
tor valorii transmise nu apare în structura sintacticã a metodei, este de stiut cã el este
implicit identificat prin cuvântul value. Dacã se supune unor condiþii specifice proble-
mei, se face o atribuire de felul câmp=value.
Definirea în clasa Copil a proprietãþii Nume, corespunzãtoare câmpului protejat ce
reþine, sub forma unui ºir de caractere, numele copilului respctiv. Se va observã cã
proprietatea este moºtenitã ºi de clasele derivate Fetita ºi Bãiat19.
19 Desigur cã proprietatea care controleazã accesul la câmpul identificat prin nume se poate numi cu totul altfel (pro-
prietatea Nume fiind uºor de confundat cu câmpul de date nume).
CAPITOLUL 1. Programarea orientatã obiect (POO) cu C# 17
20 De observat cã în exemplul anterior (subcapitolul 1.10), câmpul nume era declarat public, pentru a permite acce-
sul "general" la câmpul respectiv de date. Iar metodele ºi constructorii foloseau identificatorul nume ºi nu propri-
etatea Nume.
18 Introducere în .Net Framework (Suport de curs)
1.13. Interfeþe
Interfeþele sunt foarte importante în programarea orientatã pe obiecte, deoarece
permit utilizarea polimorfismului într-un sens mai extins.O interfaþã este o compo-
nentã a aplicaþiei, asemãnãtoare unei clase, ce declarã prin membrii sãi (metode, pro-
prietãþi, evenimente ºi indexatori) un ”comportament” unitar aplicabil mai multor
clase, comportament care nu se poate defini prin ierarhia de clase a aplicaþiei.
De exemplu, dacã vom considera arborele din figura urmãtoare, în care AVERE
este o clasã abstractã, iar derivarea claselor a fost conceputã urmãrind proprietãþile
comune ale componentelor unei averi, atunci o clasã VENIT nu este posibilã,
deoarece ea ar moºteni de la toate clasele evidenþiate, iar moºtenirea multiplã nu
este admisã în C#.
Pentru metodele din cadrul unei interfeþe nu se dã nici o implementare, ci sunt pur
ºi simplu specificate, implementarea lor fiind furnizatã de unele dintre clasele apli-
caþiei25. Nu existã instanþiere în cazul interfeþelor, dar se admit derivãri, inclusiv
moºteniri multiple.
În exemplul nostru, se poate defini o interfaþã VENIT care sã conþinã antetul unei
metode calc (sã zicem) pentru calculul venitului obþinut, fiecare dintre clasele care
implementeazã interfaþa VENIT fiind obligatã sã furnizeze o implementare (dupã o
formulã de calcul specificã) pentru metoda calc din interfaþã. Orice clasã care doreºte
sã adere la interfaþã trebuie sã implementeze toate metodele din interfaþã. Toate
clasele care moºtenesc dintr-o clasã care implementeazã o interfaþã moºtenesc, evi-
dent, metodele respective, dar le pot ºi redefini (de exemplu, clasa Credit_acordat
redefineºte metoda calc din clasa Investiþie, deoarece formula de calcul implemen-
tatã acolo nu i se ”potriveºte” ºi ei26).
De exemplu, dacã presupunem cã toate clasele subliniate implementeazã interfaþa
VENIT, atunci pentru o avere cu acþiuni la douã firme, un imobil închiriat ºi o
25 Acele clase care "aderã" la o interfaþã spunem cã "implementeazã" interfaþa respectivã
26 Dacã în sens polimorfic spunem cã Investiþie este ºi de tip Bani ºi de tip Avere, tot aºa putem spune cã o clasã care
implementeazã interfaþa VENIT ºi clasele derivate din ea sunt ºi de tip VENIT
20 Introducere în .Net Framework (Suport de curs)
Gãsiþi douã motive pentru care interfaþa VENIT ºi rezovarea de mai sus oferã o
soluþie mai bunã decât: t=act1.calc()+act2.calc()+casa.calc()+dep.calc().
21
CAPITOLUL 2
Platforma .NET
2.1 Prezentare
.NET este un cadru (Framework) de dezvoltare software unitarã care permite
realizarea, distribuirea ºi rularea aplicaþiilor-desktop Windows ºi aplicaþiilor WEB.
Tehnologia .NET pune laolaltã mai multe tehnologii (ASP, XML, OOP, SOAP,
WDSL, UDDI) ºi limbaje de programare (VB, C++, C#, J#) asigurând totodatã atât
portabilitatea codului compilat între diferite calculatoare cu sistem Windows, cât ºi
reutilizarea codului în programe, indiferent de limbajul de programare utilizat.
.NET Framework este o componentã livratã împreunã cu sistemul de operare
Windows. De fapt, .NET 2.0 vine cu Windows Server 2003, se poate instala pe versi-
unile anterioare, pânã la Windows 98 inclusiv; .NET 3.0 vine instalat pe Windows
Vista ºi poate fi instalat pe versiunile Windows XP cu SP2 ºi Windows Server 2003 cu
minimum SP1.
Pentru a dezvolta aplicaþii pe platforma .NET este bine sa avem 3 componente
esenþiale:
• un set de limbaje (C#, Visual Basic .NET, J#, Managed C++, Smalltalk, Perl,
Fortran, Cobol, Lisp, Pascal etc),
• un set de medii de dezvoltare (Visual Studio .NET, Visio),
• ºi o bibliotecã de clase pentru crearea serviciilor Web, aplicaþiilor Web ºi apli-
caþiilor desktop Windows.
Când dezvoltãm aplicaþii .NET, putem utiliza:
• Servere specializate - un set de servere Enterprise .NET (din familia SQL Server
2000, Exchange 2000 etc), care pun la dispoziþie funcþii de stocare a bazelor de
date, email, aplicaþii B2B (Bussiness to Bussiness – comerþ electronic între
partenerii unei afaceri).
• Servicii Web (în special comerciale), utile în aplicaþii care necesitã identificarea
utilizatorilor (de exemplu, .NET Passport - un mod de autentificare folosind un
singur nume ºi o parolã pentru toate ste-urile vizitate)
• Servicii incluse pentru dispozitive non-PC (Pocket PC Phone Edition,
Smartphone, Tablet PC, Smart Display, XBox, set-top boxes, etc.)
.NET Framework
Componenta .NET Framework stã la baza tehnologiei .NET, este ultima interfaþã
22 Introducere în .Net Framework (Suport de curs)
Componenta .NET Framework este formatã din compilatoare, biblioteci ºi alte exe-
cutabile utile în rularea aplicaþiilor .NET. Fiºierele corespunzãtoare se aflã, în general,
în directorul C:\WINDOWS\Microsoft. NET\Framework\V2.0…. (corespunzãtor versiu-
nii instalate)
CAPITOLUL 3
Limbajul C#
3.1. Caracterizare
Limbajul C# fost dezvoltat de o echipã restrânsã de ingineri de la Microsoft, echipã
din care s-a evidenþiat Anders Hejlsberg (autorul limbajului Turbo Pascal ºi membru
al echipei care a proiectat Borland Delphi).
C# este un limbaj simplu, cu circa 80 de cuvinte cheie, ºi 12 tipuri de date prede-
finite. El permite programarea structuratã, modularã ºi orientatã obiectual, conform
perceptelor moderne ale programãrii profesioniste.
Principiile de bazã ale programãrii pe obiecte (ÎNCAPSULARE, MOªTENIRE,
POLIMORFISM) sunt elemente fundamentale ale programãrii C#. În mare, limbajul
moºteneºte sintaxa ºi principiile de programare din C++. Sunt o serie de tipuri noi de
date sau funcþiuni diferite ale datelor din C++, iar în spiritul realizãrii unor secvenþe
de cod sigure (safe), unele funcþiuni au fost adãugate (de exemplu, interfeþe ºi
delegãri), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate
(moºtenirea multiplã ºi pointerii cãtre funcþii). Unele funcþiuni (cum ar fi accesul
direct la memorie folosind pointeri) au fost pãstrate, dar secvenþele de cod corespun-
zãtoare se considerã ”nesigure”.
using System;
class primul
{
static void Main()
{ Console.WriteLine(“Primul program”);
Console.ReadKey(true);
}
}
26 Introducere în .Net Framework (Suport de curs)
Rularea programului se poate realiza în mai multe moduri: rapid fãrã asistenþã de
depanare (Start Without Debugging Shift+F5) , rapid cu asistenþã de depanare (Start
Debugging F5 sau cu butonul din bara de instrumente), rulare pas cu pas (Step
Into F11 ºi Step Over F12) sau rulare rapidã pânã la linia marcatã ca punct de între-
rupere (Toggle Breakpoint F9 pe linia respectivã ºi apoi Start Debugging F5). În-
cetarea urmãririi pas cu pas (Stop Debugging Shift+F5) permite ieºirea din modul
depanare ºi revenirea la modul normal de lucru. Toate opþiunile de rulare ºi depanare
se gãsesc în meniul Debug al mediului.
O aplicatie C# este formatã din una sau mai multe clase, grupate în spaþii de nume
(namespaces). Un spaþiu de nume cuprinde mai multe clase cu nume diferite având
funcþionalitãþi înrudite. Douã clase pot avea acelaºi nume cu condiþia ca ele sã fie de-
finite în spaþii de nume diferite. În cadrul aceluiaºi spaþiu de nume poate apãrea
definiþia unui alt spaþiu de nume, caz în care avem de-a face cu spaþii de nume imbri-
28 Introducere în .Net Framework (Suport de curs)
cate. O clasã poate fi identificatã prin numele complet (nume precedat de numele
spaþiului sau spaþiilor de nume din care face parte clasa respectivã, cu separatorul
punct). În exemplul nostru, HelloWorld.Program este numele cu specificaþie com-
pletã al clasei Program.
O clasã este formatã din date ºi metode (funcþii). Apelarea unei metode în cadrul
clasei în care a fost definitã aceasta presupune specificarea numelui metodei. Apelul
unei metode definite în interiorul unei clase poate fi invocatã ºi din interiorul altei
clase, caz în care este necesarã specificarea clasei ºi apoi a metodei separate prin
punct. Dacã în plus, clasa aparþine unui spaþiu de nume neinclus în fiºierul curent,
atunci este necesarã precizarea tuturor componentelor numelui: spaþiu.clasã.metodã
sau spaþiu.spaþiu.clasã.metodã etc.
În fiºierul nostru se aflã douã spaþii de nume: unul definit (HelloWorld) ºi unul
extern inclus prin directiva using (System). Console.WriteLine reprezintã apelul
metodei WriteLine definitã în clasa Console. Cum în spaþiul de nume curent este
definitã doar clasa Program, deducem cã definiþia clasei Console trebuie sã se
gãseascã în spaþiul System.
Pentru a facilita cooperarea mai multor programatori la realizarea unei aplicaþii
complexe, existã posibilitatea de a segmenta aplicaþia în mai multe fiºiere numite
assemblies. Într-un assembly se pot implementa mai multe spaþii de nume, iar pãrþi
ale unui aceeaºi spaþiu de nume se pot regãsi în mai multe assembly-uri. Pentru o
aplicaþie consolã, ca ºi pentru o aplicaþie Windows de altfel, este obligatoriu ca una
(ºi numai una) dintre clasele aplicaþiei sã conþinã un „punct de intrare” (entry point),
ºi anume metoda (funcþia) Main.
Sã comentãm programul de mai sus:
linia 1: este o directivã care specificã faptul cã se vor folosi clase incluse în spaþiul
de nume System. În cazul nostru se va folosi clasa Console.
linia 3: spaþiul nostru de nume
linia 5: orice program C# este alcãtuit din una sau mai multe clase
linia 7: metoda Main, „punctul de intrare” în program
linia 9: clasa Console, amintitã mai sus, este folositã pentru operaþiile de
intrare/ieºire. Aici se apeleazã metoda WriteLine din acestã clasã, pentru afiºarea
mesajului dorit pe ecran.
27 Este un termen folosit un pic echivoc ºi provenit din traduceriea cuvântului "token"
CAPITOLUL 3. Limbajul C# 29
comentariu pe mai multe rânduri prin folosirea /* ºi */ Orice text cuprins între
simbolurile menþionate mai sus se considerã a fi comentariu. Simbolurile /* repre-
zintã începutul comentariului, iar */ sfârºitul respectivului comentariu.
/* Acesta este un
comentariu care se
intinde pe mai multe randuri */
Nume
Prin nume dat unei variabile, clase, metode etc. înþelegem o succesiune de carac-
tere care îndeplineºte urmãtoarele reguli:
• numele trebuie sã înceapã cu o literã sau cu unul dintre caracterele ”_” ºi ”@”;
• primul caracter poate fi urmat numai de litere, cifre sau un caracter de subliniere;
• numele care reprezintã cuvinte cheie nu pot fi folosite în alt scop decât acela
pentru care au fost definite
• cuvintele cheie pot fi folosite în alt scop numai dacã sunt precedate de @
• douã nume sunt distincte dacã diferã prin cel puþin un caracter (fie el ºi literã
micã ce diferã de aceeaºi literã majusculã)
Convenþii pentru nume:
• în cazul numelor claselor, metodelor, a proprietãþilor, enumerãrilor, interfeþelor,
spaþiilor de nume, fiecare cuvânt care compune numele începe cu majusculã
• în cazul numelor variabilelor dacã numele este compus din mai multe cuvinte,
primul începe cu minusculã, celelalte cu majusculã
Cuvinte cheie în C#
Exemple:
Tipul enumerare
Tipul enumerare este un tip definit de utilizator. Acest tip permite utilizarea
numelor care, sunt asociate unor valori numerice. Toate componentele enumerate au
un acelaºi tip de bazã întreg. În cazul în care, la declarare, nu se specificã tipul de bazã
al enumerãrii, atunci acesta este considerat implicit int.
Declararea unui tip enumerare este de forma:
Observaþii:
• În mod implicit valoarea primului membru al enumerãrii este 0, iar fiecare varia-
bilã care urmeazã are valoarea (implicitã) mai mare cu o unitate decât precedenta.
• Valorile folosite pentru iniþializãri trebuie sã facã parte din domeniul de valori
declarat al tipului
• Nu se admit referinþe circulare:
enum ValoriCirculare
{
a = b,
b
}
32 Introducere în .Net Framework (Suport de curs)
Exemplu:
using System;
namespace tipulEnum
{
class Program
{
enum lunaAnului
{
Ianuarie = 1,
Februarie, Martie, Aprilie, Mai, Iunie, Iulie,
August, Septembrie, Octombrie, Noiembrie, Decembrie
}
static void Main(string[] args)
{
Console.WriteLine(“Luna Mai este a {0}“,
(int)lunaAnului.Mai + “-a luna din an.”);
Console.ReadLine();
}
}
}
Tablouri
Declararea unui tablou unidimensional:
Tip[] nume;
Prin aceasta, nu se alocã spaþiu pentru memorare. Pentru a putea reþine date în
structura de tip tablou, este necesarã o operaþie de instanþiere:
nume = new Tip[NumarElemente];
Declararea, instanþierea ºi chiar iniþializarea tabloului se pot face în aceeaºi
instrucþiune:
Exemplu:
int[] v = new int[] {1,2,3}; sau
int[] v = {1,2,3}; //new este implicit
În cazul tablourilor cu mai multe dimensiuni facem distincþie între tablouri regu-
late ºi tablouri neregulate (tablouri de tablouri)
Declarare în cazul tablourilor regulate bidimensionale:
Tip[,] nume;
Intanþiere:
nume = new Tip[Linii,Coloane];
Acces:
nume[indice1,indice2]
CAPITOLUL 3. Limbajul C# 33
Exemple:
int[,] mat = new int[,] {{1,2,3},{4,5,6},{7,8,9}}; sau
int[,] mat = {{1,2,3},{4,5,6},{7,8,9}};
ªiruri de caractere
Se definesc douã tipuri de ºiruri:
• regulate
• de tip „verbatim”
Tipul regulat conþine între ghilimele zero sau mai multe caractere, inclusiv
secvenþe escape.
Secvenþele escape permit reprezentarea caracterelor care nu au reprezentare graficã
precum ºi reprezentarea unor caractere speciale: backslash, caracterul apostrof, etc.
În cazul în care folosim multe secvenþe escape, putem utiliza ºirurile verbatim.
Aceste ºiruri pot sã conþinã orice fel de caractere, inclusiv caracterul EOLN. Ele se
folosesc în special în cazul în care dorim sã facem referiri la fiºiere ºi la regiºtri. Un
astfel de ºir începe întotdeauna cu simbolul’@’ înaintea ghilimelelor de început.
Exemplu:
using System;
namespace SiruriDeCaractere
{
class Program
{
static void Main(string[] args)
{
string a = “un sir de caractere”;
string b = “linia unu \nlinia doi”;
string c = @”linia unu
linia doi”;
string d=”c:\\exemple\\unu.cs”;
string e = @”c:\exemple\unu.cs”;
Console.WriteLine(a); Console.WriteLine(b);
Console.WriteLine(c); Console.WriteLine(d);
Console.WriteLine(e); Console.ReadLine();
}
}
}
un sir de caractere
linia unu
linia doi
linia unu
linia doi
c:\exemple\unu.cs
c:\exemple\unu.cs
3.7. Conversii
3.7.1. Conversii numerice
În C# existã douã tipuri de conversii numerice:
• implicite
• explicite.
Conversia implicitã se efectueazã (automat) doar dacã nu este afectatã valoarea
convertitã.
CAPITOLUL 3. Limbajul C# 35
Exemplu:
using System;
using System.Collections.Generic;
using System.Text;
namespace Conversii
{
class Program
{
static void Main(string[] args)
{
byte a = 13; // byte intreg fara semn
// pe 8 biti
byte b = 20;
long c; //intreg cu semn pe 64 biti
c = a + b;
Console.WriteLine(c);
Console.ReadLine();
}
}
}
din în
sbyte short, int, long, float, double, decimal
byte short, ushort, int, uint, long, ulong, float, double, decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long float, double, decimal
char ushort, int, uint, long, ulong, float, double, decimal
float double
ulong float, double, decimal
Conversia explicitã se realizeazã prin intermediul unei expresii cast, atunci când nu
existã posibilitatea unei conversii implicite.
using System;
using System.Collections.Generic;
using System.Text;
namespace Conversii1
{
36 Introducere în .Net Framework (Suport de curs)
class Program
{
static void Main(string[] args)
{
int a = 5;
int b = 2;
float c;
c = (float)a / b; //operatorul cast
Console.WriteLine(“{0}/{1}={2}”, a, b, c);
Console.ReadLine();
}
}
}
se obþine:
5/2 = 2,5
În cazul în care nu s-ar fi folosit operatorul cast rezultatul, evident eronat, ar fi fost:
5/2=2
din în
sbyte byte, ushort, uint, ulong, char
byte sbyte, char
short sbyte, byte, ushort, uint, ulong, char
ushort sbyte, byte, short, char
int sbyte, byte, short, ushort, uint, ulong, char
uint sbyte,byte, short, ushort, int, char
long sbyte, byte, short, ushort, int, uint, ulong, char
ulong sbyte, byte, short, ushort, int, uint, long, char
char sbyte, byte, short
float sbyte, byte, short, ushort, int, uint, long, ulong, char, decimal
double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, decimal
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double
Pentru conversia inversã, adicã din ºir de caractere în numãr, sintaxa este:
Exemplu:
using System;
namespace Conversii
{
class Program
{
static void Main(string[] args)
{
string s;
const int a = 13;
const long b = 100000;
const float c = 2.15F;
double d = 3.1415;
Console.WriteLine(“CONVERSII\n”);
Console.WriteLine(“TIP\tVAL. \tSTRING”);
Console.WriteLine(“———————————”);
s = “” + a;
Console.WriteLine(“int\t{0} \t{1}”,a,s);
s = “” + b;
Console.WriteLine(“long\t{0} \t{1}”,b,s);
s = “” + c;
Console.WriteLine(“float\t{0} \t{1}”,c,s);
s = “” + d;
Console.WriteLine(“double\t{0} \t{1}”,d,s);
Console.WriteLine(“\nSTRING\tVAL \tTIP”);
Console.WriteLine(“———————————”);
int a1;
a1 = int.Parse(“13”);
Console.WriteLine(“{0}\t{1}\tint”,”13”,a1);
long b2;
b2 = long.Parse(“1000”);
Console.WriteLine(“{0}\t{1}\tlong”,”1000”,b2);
float c2;
c2 = float.Parse(“2,15”);
Console.WriteLine(“{0}\t{1}\tfloat”,”2,15”,c2);
38 Introducere în .Net Framework (Suport de curs)
double d2;
d2 = double.Parse(“3.1415”,
System.Globalization.CultureInfo.InvariantCulture);
Console.WriteLine(“{0}\t{1}\tdouble”,”3.1415”,d2);
Console.ReadLine();
}
}
}
CONVERSII
TIP VAL. STRING
———————————
int 13 13
long 100000 100000
float 2,15 2,15
double 3,1415 3,1415
STRING VAL. TIP
———————————
13 13 int
1000 1000 long
2,15 2,15 float
3.1415 3,1415 double
sau
int i = 13;
object ob = i; //boxing implicit
3.8. Constante
În C# existã douã modalitãþi de declarare a constantelor: folosind const sau
folosind modificatorul readonly. Constantele declarate cu const trebuie sã fie iniþia-
lizate la declararea lor.
Exemple:
const int x; //gresit, constanta nu a fost initializata
const int x = 13; //corect
3.9. Variabile
O variabilã în C# poate sã conþinã fie o valoare a unui tip elementar, fie o referinþã
la un obiect.
Exemple:
int Salut;
int Azi_si _maine;
char caracter;
3.11.1 Instrucþiunea if
Instrucþiunea if are sintaxa:
if (conditie)
Instructiuni_A;
else
Instructiuni_B;
Exemplu:
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n;
Console.WriteLine(“Introduceti un nr intreg “);
n = Convert.ToInt32(Console.ReadLine());
if (n >= 0)
Console.WriteLine(“Nr. introdus este > 0”);
else
Console.WriteLine(“Nr. introdus este < 0”);
Console.ReadLine();
}
}
}
using System;
CAPITOLUL 3. Limbajul C# 41
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n = 0;
while (n <= 10)
{
Console.WriteLine(“n este {0}”, n);
n++;
}
Console.ReadLine();
}
}
}
do
Instructiuni;
while(conditie)
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
int n = 0;
do
{
Console.WriteLine(“n este {0}”, n);
n++;
}
while (n <= 10);
Console.ReadLine();
}
}
}
42 Introducere în .Net Framework (Suport de curs)
using System;
namespace Test
{
class Program
{
static void Main(string[] args)
{
for(int n=0; n<=10; n++)
{
Console.WriteLine(“n este {0}”, n);
}
Console.ReadLine();
}
}
}
switch (a)
{
case 13:
case 20:
x=5;
y=8;
break;
default:
x=1;
y-0;
break;
}
Instrucþiunea switch admite în C# variabilã de tip ºir de caractere care sã fie com-
paratã cu ºirurile de caractere din case-uri.
CAPITOLUL 3. Limbajul C# 43
Exemplu:
switch(strAnimal)
{
case “Pisica “:
…
break;
case “Catel “:
…
break;
default:
…
break;
}
Exemplu:
using System;
namespace Salt
{
class Program
{
static void Main(string[] args)
{
int i = 0;
while(true)
{
Console.Write(“{0} “,i);
i++;
if(i<10)
continue;
else
break;
}
Console.ReadLine();
}
}
}
Se va afiºa:
0 1 2 3 4 5 6 7 8 9
Exemplu:
switch (a)
{
case 13:
x=0;
y=0;
goto case 20;
case 15:
x=3;
y=1;
goto default;
case 20:
x=5;
y=8;
break;
default:
x=1;
CAPITOLUL 3. Limbajul C# 45
y=0;
break;
}
Exemplu:
using System;
using System.IO;
namespace Exceptii
{
class tryCatch
{
static void Main(string[] args)
{
Console.Write(“Numele fisierului:”);
string s=Console.ReadLine(s);
try
{
File.OpenRead(s);
}
catch (FileNotFoundException a)
{
Console.WriteLine(a.ToString());
}
catch (PathTooLongException b)
{
Console.WriteLine(b.ToString());
}
finally
{
Console.WriteLine(“Programul s-a sfarsit”);
Console.ReadLine();
}
}
}
}
46 Introducere în .Net Framework (Suport de curs)
CAPITOLUL 4
Programarea web cu ASP.NET
4.1. Introducere
ASP.NET este tehnologia Microsoft care permite dezvoltarea de aplicaþii web
moderne, utilizând platforma Microsoft .NET cu toate beneficiile sale.
Pentru a înþelege procesul de realizare a unui site web cu ASP.NET este important
sã cunoaºtem modul în care funcþioneazã comunicarea între browser ºi serverul web.
Acest proces este format din urmãtoarele etape principale:
1 Browserul Web iniþiaza o cerere (request) a unei resurse cãtre serverul Web
unde este instalatã aplicaþia doritã.
2 Cererea este trimisã serverului Web folosind protocolul HTTP.
3 Serverul Web proceseazã cererea.
4 Serverul web trimite un rãspuns browserului folosind protocolul HTTP.
5 Browserul proceseazã rãspunsul în format HTML, afiºând pagina web.
6 Utilizatorul poate introduce date (sã spunem într-un formular), apasã butonul
Submit ºi trimite date înapoi cãtre server.
7 Serverul Web proceseazã datele.
8 Se reia de la pasul 4.
Serverul web primeºte cererea (request), iar apoi trimite un rãspuns (response)
înapoi cãtre browser, dupã care conexiunea este închisã, ºi sunt eliberate resursele
folosite pentru procesarea cererii. Acesta este modul de lucru folosit pentru afiºarea
paginilor statice (datele dintr-o paginã nu depind de alte date din alte pagini sau de
alte acþiuni precedente ale utilizatorului) ºi nici o informaþie nu este stocatã pe server.
În cazul paginilor web dinamice, serverul poate sã proceseze cereri de pagini ce
conþin cod care se executã pe server, sau datele pot fi salvate pe server între douã
cereri din partea browserului.
Trimiterea datelor de la browser cãtre server se poate realiza prin metoda GET sau
POST.
Prin GET, URL-ul este completat cu un ºir de caractere (QueryString) format din
perechi de tipul cheie = valoare separate prin &.
48 Introducere în .Net Framework (Suport de curs)
Exemplu:
GET /getPerson.aspx?Id=1&city=Cluj HTTP/1.1
Prin Get nu se pot trimite date de dimensiuni mari, iar datoritã faptului cã datele
sunt scrise în URL-ul browser-ului, pot apãrea probleme de securitate. De aceea, de
preferat este sã se foloseascã metoda POST pentru trimiterea de date.
Trimiterea datelor înapoi cãtre server este numitã deseori PostBack. Acþiunea de
PostBack poate fi folositã atât cu metoda GET cât ºi cu metoda POST. Pentru a ºti
dacã se trimit date (POST) sau pagina este doar cerutã de browser (GET), cu alte
cuvinte pentru a ºti dacã pagina curentã se încarcã pentru primã datã sau nu, în
ASP.NET se foloseºte o proprietate a clasei Page numitã IsPostBack.
Secþiunea de cod, conþine codul C# asociat paginii sau obiectelor din paginã.
Codul poate fi plasat direct în pagina sau într-un fiºier cu extensia .cs, cu acelaºi
nume ca al paginii (de ex. Default.aspx.cs). În cazul în care se gãseºte direct în pa-
ginã, codul este cuprins între tag-urile <script> </script>:
<script runat=”server”>
protected void Button1_Click(object sender, EventArgs e)
{
Page.Title = “First Web Application”;
}
</script>
De obicei blocurile <script> conþin cod care se executã pe partea de client, însã
dacã se foloseºte atributul runat = „server”, codul se va executa pe serverul web.
În cazul exemplului de mai sus, la apãsarea butonului se schimbã titlul paginii
Web în browser.
CAPITOLUL 4. Programarea web cu ASP.NET 49
În cazul în care în fereastra pentru adãugarea unei pagini noi în proiect, se bifeazã
opþiunea Place code in separate file, codul este plasat într-un fiºier separat, iar în
secþiunea de directive este precizat numele acestui fiºier.
Exemplu: CodeFile=”Default.aspx.cs”.
<body>
<form id=”form1” runat=”server”>
<div>
<asp:Button ID=”Button1” runat=”server” OnClick=”Button1_Click”
Text=”Button” /></div>
</form>
</body>
Exemple complete de aplicaþii web puteþi gãsi pe DVD-ul Academic Resource Kit (ARK),
instalând Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descãrcând
cele 101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx. Dupã instalare, din aplicaþia Microsoft
Visual Web Developer 2005 alegeþi din meniul File opþiunea Open Web Site ºi selectaþi, din
directorul ..\CS101SamplesAll\CS101SamplesWebDevelopment\, aplicaþia doritã. În fe-
reastra Solution Explorer selectaþi Start.aspx ºi apoi butonul View in Browser".
50 Introducere în .Net Framework (Suport de curs)
Când vom rula pagina, vom constata cã totuºi nu se întâmplã nimic. Pentru a se
executa metoda CheckBox1_CheckedCanged, pagina trebuie retrimisã serverului în
momentul bifãrii checkbox-ului. Serverul trebuie sã execute codul ºi apoi sã retrimitã
cãtre browser pagina în care textbox-ul este vizibil sau nu. De aceea controlul check-
box trebuie sã genereze acþiunea de PostBack, lucru care se întâmplã dacã este setatã
valoarea true proprietãþii AutoPostBack. Unele controale genereazã întotdeauna
Postback atunci când apare un anumit eveniment. De exemplu evenimentul click al
controlului button.
Exemplu de folosire a controalelor web puteþi gãsi pe DVDul ARK, instalând
Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descãrcând cele
101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx, aplicaþia MenuAndSiteMapPath.
4.4.2.1. Profile
<profile enabled=”true”>
<properties>
<add name =”ProfileTest” allowAnonymous =”true”/>
</properties>
</profile>
4.4.2.2. Session
Obiectul Session este creat pe serverul web la prima accesare a sitului de cãtre un
utilizator ºi rãmâne în memorie în principiu atât timp cât utilizatorul rãmâne conectat
la site. Existã ºi excepþii, dar ele nu fac obiectul acestui material.
Pentru a adãuga un obiect în sesiune, trebuie doar sã scriem un cod de genul
urmãtor:
Session este de fapt un dicþionar (listã de perechi cheie – valoare), în care valo-
rile sunt de tip object. Ceea ce înseamnã cã la citirea unor valori din sesiune va tre-
bui sã realizãm o conversie de tip.
Odatã introdus un obiect în Session, el poate fi accesat din toate paginile aplicaþiei,
atât timp cât el existã acolo. Programatorul poate realiza scoaterea obiectului din
sesiune atunci când doreºte acest lucru:
Session.Remove(“sir”);
4.4.2.3. Application
dat, ºi nu unei anumite sesiuni. Cu alte cuvinte odatã introdus un obiect în Applicatio,
va putea fi accesat din orice loc al sitului ºi de cãtre toþi utilizatorii acestuia.
Toate variabilele declarate ca fiind statice sunt specifice întregii aplicaþii ºi nu unei
anumite sesiuni. De exemplu, dacã atunci când un site este accesat de Utilizator1 ºi
o variabilã declaratã:
static string test = “init”;
se modificã de cãtre acesta:
test = “modificat”;
atunci toþi utilizatorii aplicaþiei vor vedea valoarea modificatã din acel moment
înainte.
4.4.3. Concluzii
În cazul obiectului ViewState, datele sunt salvate în pagina web sub forma unui ºir
de caractere, iar în cazul obiectului Session respectiv Application în memoria
serverului web. Dacã datele salvate sunt de dimensiuni mari, în primul caz creºte
dimensiunea paginii web, care va fi transmisã mai încet, iar în al doilea caz rezultã o
folosire excesivã a memoriei serverului web, ceea ce duce la scãderea vitezei de
lucru. Aceastã folosire excesivã a memoriei poate sã aparã ºi în cazul unei dimen-
siuni a datelor ceva mai redusã, dar a unui numãr mare de utilizatori care acceseazã
simultan pagina (pentru fiecare se va creea un obiect sesiune).
4.5.2. Validatoare
1 RequiredFieldValidator. Verificã dacã în cãsuþa de text asociatã prin proprietatea
ControlToValidate s-a introdus text. Util pentru formularele în care anumite date
sunt obligatorii.
2 RangeValidator. Verificã dacã informaþia introdusã în cãsuþa de text asociatã
face parte dintr-un anumit interval, specificat prin tipul datei introduse (prorie-
tatea Type) ºi MinimumValue respectiv MaximumValue.
3 RegularExpressionValidator. Verificã dacã informaþia din cãsuþa de text asociatã
este conform unei expresii regulate specificate. Este util pentru validarea unor
informaþii de genul adreselor de email, numerelor de telefon, etc – în general
informaþii care trebuie sã respecte un anumit format. Trebuie setatã proprietatea
ValidationExpression în care se pot alege câteva expresii uzuale gata definite.
4 CompareValidator. Comparã datele introduse în cãsuþa de text asociatã cu o va-
loare prestabilitã (ValueToCompare), în funcþie de operatorul ales (proprietatea
Operator) ºi de tipul de date care se aºteaptã (proprietatea Type).
Aceste obiective pot fi atinse foarte uºor utilizând funcþionalitãþile ºi uneltele din
ASP.NET respectiv Visual Studio, anume clasa Membership ºi unealta
ASP.NET Configuration (din meniul Website al Visual Studio Web Developer
Express). Configurarea autentificãrii ºi autorizãrii se poate realiza dupã cum se vede
în acest tutorial:
http://msdn2.microsoft.com/en-us/library/879kf95c(VS.80).aspx.
Un exemplu de securizare a aplicaþilor web puteþi gãsi pe dvd-ul ARK, instalând
Resurse\Visual Studio 2005\101 Samples CS101SamplesAll.msi sau descãrcând cele
101 exemple de utilizare a Visual Studio 2005 de la adresa http://msdn2.
microsoft.com/en-us/vstudio/aa718334.aspx, aplicatia Security.
4.8. Resurse
Dezvoltarea de aplicaþii web cu Visual Web Developer Express:
http://msdn.microsoft.com/vstudio/express/vwd/
59
CAPITOLUL 5
Programare vizualã
28 Se utilizeazã ades antonimia dintre vizual (operaþii asupra unor componente grafice) ºi textual (scriere de linii de
cod); proiectarea oricãrei aplicaþii "vizuale" îmbinã ambele tehnici.
29 Deciziile arhitecturale stabilesc în principal cum se leagã interfaþa de restul aplicaþiei ºi cât de uºor de întreþinut
este codul rezultat.
60 Introducere în .Net Framework (Suport de curs)
sau fiºierele pe care aceasta le utilizeazã. Cu alte cuvinte, în cadrul interfeþei cu utilizatorul,
nu se vor folosi obiecte de tipuri definite de programator, ci numai baza din .NET.
Nivelul de logicã a aplicaþiei
Se ocupã de tot ceea ce este specific aplicaþiei care se dezvoltã. Aici se efectueazã
calculele ºi procesãrile ºi se lucreazã cu obiecte de tipuri definite de programator.
Nivelul de acces la date
Aici rezidã codul care se ocupã cu accesul la baza de date, la fiºiere, la alte servicii.
Aceastã ultimã structurã este foarte bunã pentru a organiza aplicaþiile, dar nu este
uºor de realizat. De exemplu, dacã în interfaþa cu utilizatorul prezentãm date sub
formã ListView ºi la un moment dat clientul ne cere reprezentarea datelor într-un
GridView, modificãrile la nivel de cod nu se pot localiza doar în interfaþã deoarece
cele douã controale au nevoie de modele de acces la date total diferite.
Indiferent de modelul arhitectural ales, în realizarea aplicaþiei mai trebuie respec-
tate ºi principiile proiectãrii interfeþelor:
Simplitatea
Interfaþa trebuie sã fie cât mai uºor de înþeles30 ºi de învãþat de cãtre utilizator ºi
sã permitã acestuia sã efectueze operaþiile dorite în timp cât mai scurt. În acest sens,
este vitalã culegerea de informaþii despre utilizatorii finali ai aplicaþiei ºi a modului în
care aceºtia sunt obiºnuiþi sã lucreze.
Poziþia controalelor
Locaþia controalelor dintr-o fereastrã trebuie sã reflecte importanþa relativã ºi
frecvenþa de utilizare. Astfel, când un utilizator trebuie sã introducã niºte informaþii –
unele obligatorii ºi altele opþionale – este indicat sã organizãm controalele astfel
încât primele sã fie cele care preiau informaþii obligatorii.
Consistenþa
Ferestrele ºi controalele trebuie sã fie afiºate dupã un design asemãnãtor („tem-
30 Întrucât mintea umanã poate sã perceapã la un moment dat aproximativ 5-9 obiecte, o fereastrã supra-încãrcatã
de controale o face greu de utilizat..
CAPITOLUL 5. Programare vizualã 61
statice. Metoda Run invocatã mai sus creeazã un formular implicit, aplicaþia rãspun-
zând la mesajele utilizatorului pânã când formularul va fi închis.
Compilarea modulelor aplicaþiei ºi asamblarea lor într-un singur fiºier ”exe-
cutabil” se realizeazã cu ajutorul opþiunilor din meniul Build, uzualã fiind Build
Solution (F6).
Odatã implementatã, aplicaþia poate fi lansatã, cu asistenþã de depanare sau nu
(opþiunile Start din meniul Debug). Alte facilitãþi de depanare pot fi folosite prin
umãrirea pas cu pas, urmãrirea pânã la puncte de întrerupere etc. (celelalte opþiuni ale
meniului Debug). Ferestre auxiliare de urmãrire sunt vizualizate automat în timpul pro-
cesului de depanare, sau pot fi activate din submeniul Windows al meniului Debug.
5.3. Ferestre
Spaþiul Forms ne oferã clase specializate pentru: creare de ferestre sau formulare
(System.Windows.Forms.Form), elemente specifice (controale) cum ar fi butoane
(System.Windows.Forms.Button), casete de text (System.Windows.Forms.TextBox)
etc. Proiectarea unei ferestre are la bazã un cod complex, generat automat pe mãsurã
ce noi desemnãm componentele ºi comportamentul acesteia. În fapt, acest cod rea-
lizeazã: derivarea unei clase proprii din System.Windows.Forms.Form, clasã care
este înzestratã cu o colecþie de controale (iniþial vidã). Constructorul ferestrei rea-
lizeazã instanþieri ale claselor Button, MenuStrip, Timer etc. (orice plasãm noi în fer-
eastrã) ºi adaugã referinþele acestor obiecte la colecþia de controale ale ferestrei.
Dacã modelul de fereastrã reprezintã ferestra principalã a aplicaþiei, atunci ea este
instanþiatã automat în programul principal (metoda Main). Dacã nu, trebuie sã scriem
noi codul ce realizeazã instanþierea.
Clasele derivate din Form moºtenesc o serie de proprietãþi care determinã
atributele vizuale ale ferestrei (stilul marginilor, culoare de fundal, etc.), metode care
implementeazã anumite comportamente (Show, Hide, Focus etc.) ºi o serie de
metode specifice (handlere) de tratare a evenimentelor (Load, Clic etc.).
O fereastrã poate fi activatã cu form.Show() sau cu form.ShowDialog(), metoda a
doua permiþând ca revenirea în fereastra din care a fost activat noul formular sã se
facã numai dupã ce noul formular a fost inchis (spunem cã formularul nou este
deschis modal).
Un propietar este o fereastrã care contribuie la comportarea formularului deþinut.
Activarea propietarului unui formular deschis modal va determina activarea formula-
rului deschis modal. Când un nou formular este activat folosind form.Show() nu va
avea nici un deþinãtor, acesta stabilindu-se direct:
Vizibilitatea unui formular poate fi setatã folosind metodele Hide sau Show. Pentru a
ascunde un formular putem folosi:
5.4. Controale
Unitatea de bazã a unei interfeþe Windows o reprezintã un control. Acesta poate fi
„gãzduit” de un container ce poate fi un formular sau un alt control.
Un control este o instanþã a unei clase derivate din System.Windows.Forms ºi este
reponsabil cu desenarea unei pãrþi din container. Visual Studio .NET vine cu o serie
de controale standard, disponibile în Toolbox. Aceste controale pot fi grupate astfel:
31 Dacã va fi setatã la 10% formularul ºi toate controalele sale vor fi aproape invizibile.
CAPITOLUL 5. Programare vizualã 65
5.4.1. Controale form. Controlul form este un container. Scopul sãu este de a gãzdui
alte controale. Folosind proprietãþile, metodele ºi evenimentele unui formular,
putem personaliza programul nostru.
În tabelul de mai jos veþi gãsi o listã cu controalele cel mai des folosite ºi cu
descrierea lor. Exemple de folosire a acestor controale vor urma dupã explicarea pro-
prietãþilor comune al controalelor ºi formularelor.
public Form1()
{
InitializeComponent();
this.Text = “Primul formular”;
}
this.Close();.
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
Casete de mesaje:
Pentru a crea o casetã mesaj, apelãm metoda MessageBox.Show();.Într-o nouã apli-
caþie Windows, trageþi un buton în formular, modificaþi textul butonului cum doriþi
sau ca în imaginea alãturatã „va apare un mesaj”, executaþi dublu clic pe buton ºi
68 Introducere în .Net Framework (Suport de curs)
Casete de dialog
O casetã de dialog este o formã specializatã de control de tip Form.
Exemplu:
Creaþi o nouã aplicaþie Windows, apoi trageþi un buton în formular ºi setaþi propri-
etatea Text a butonului la : „sã avem un dialog”, iar apoi executaþi dublu clic pe buton
ºi folosiþi urmãtorul cod pentru administratorul evenimentului Click.
Creaþi un alt formular la acest proiect(alegeþi Add Windows Forms din meniul
Project), apoi în ordine: setaþi proprietatea ControlBox la valoarea false, setaþi propri-
etatea Text la “casetã de dialog”, trageþi în formular un control de tip Label ºi Text la
“introdu text”, adãugaþi un control TextBox în formular, adãugaþi douã butoane,
setaþi proprietatea Text a butonului din stânga la “OK” iar al celui din dreapta la
“Cancel”, setaþi proprietatea DialogResult a butonului din stanga la OK iar al celui din
dreapta la Cancel, executaþi clic pe formularul casetei de dialog ºi setaþi proprietatea
AcceptButton la OKButton iar proprietatea CancelButton la CancelButton. Acum exe-
cutaþi dublu clic pe butonul OK ºi folosiþi urmãtorul cod pentru administratorul eveni-
mentului Click:
Executaþi dublu clic pe butonul Cancel ºi folosiþi urmãtorul cod pentru administra-
torul evenimentului Click:
Creaþi o nouã aplicaþie Windows în care trageþi 13 butoane pe care le veþi poziþiona
ºi numi ca în figura alãturatã, apoi mai adãugaþi un TextBox(pe acesta îl puteþi seta
sã arate textul în stânga sau în dreapta).
Adãugaþi un menuStrip care sã conþinã elementele precizate mai sus, ºi pe care le
puteþi observa în figura alãturatã.
Faceþi dublu clic pe fiecare buton numeric în parte pentru a ajunge la sursã ºi mo-
dificaþi fiecare sursã respectând codul de mai jos:
Am dat exemplu pentru tasta 7, dar atenþie la fiecare tastã, variabila v, va primi ca
valoare numãrul afiºat pe tasta respectivã.
Acum procedaþi la fel, ºi modificaþi sursa pentru butoanele + ºi -.
Un alt exemplu:
Se adaugã pe formular douã butoane ºi o casetã text. Apãsarea primului buton va
determina afiºarea textului din TextBox într-un MessageBox iar apãsarea celui de-al
doilea buton va închide închide aplicaþia.
CAPITOLUL 5. Programare vizualã 71
Dupã adãugarea celor douã butoane ºi a casetei text, a fost schimbat textul afiºat
pe cele douã butoane ºi au fost scrise funcþiile de tratare a evenimentului Click pen-
tru cele douã butoane:
Exemplul PV2 afiºeazã un grup alcãtuit din 3 butoane, etichetate A,B respectiv C
având iniþial culoarea roºie. Apãsarea unui buton determinã schimbarea culorii aces-
tuia în galben. La o nouã apãsare butonul revine la culoare iniþialã. Acþionarea
butonului “Starea butoanelor” determinã afiºarea într-o casetã text a etichetelor
butoanelor galbene. Caseta text devine vizibilã atunci când apãsãm prima oarã acest
buton. Culoarea butonului mare (verde/portocaliu) se schimbã atunci când mouse-ul
este poziþionat pe buton.
Aplicaþia PV3 este un exemplu de utilizare a acestor controale. Soluþia unei probleme
cu mai multe variante de rãspuns este memoratã cu ajutorul unor checkbox-uri cu
proprietatea ThreeState. Apãsarea butonului Verificã determinã afiºarea unei
etichete ºi a butoanelor radio DA ºi NU. Rãspunsul este afiºat într-un MessageBox.
Exerciþiu (Test grilã) Construiþi un test grilã care conþine 5 itemi cu câte 4 variante
de rãspuns (alegere simplã sau multiplã), memoraþi rãspunsurile date ºi afiºaþi, dupã
efectuarea testului, într-o casetã text, în dreptul fiecãrui item, rãspunsul corect.
Exerciþiu (Filtru) Construiþi o aplicaþie care afiºeazã fiºierele dintr-un folder ales
care au un anumit tip (tipul fiºierelor este ales de utilizator pe baza unui
CheckedListBox)
Graphics g = this.CreateGraphics();
// Deseneaza fiecare imagine utilizand metoda ImageList.Draw()
for (int i = 0; i < desene_animate.Images.Count; i++)
desene_animate.Draw(g, 60 + i * 60, 60, i);
g.Dispose();
}
Formularul din aplicaþia PV7 conþine un calendar pentru care putem selecta un
interval de maximum 30 de zile, sunt afiºate sãptãmânile ºi ziua curentã. Intervalul
selectat se afiºeazã prin intermediul unei etichete. Dacã se selecteazã o datã atunci
aceasta va fi adãugatã ca item într-un ComboBox (orice datã poate apãrea cel mult o
datã în listã).
Dupã adãugarea celor 3 controale pe formular, stabilim proprietãþile pentru
monthCalendar1 (ShowWeekNumber-True, MaxSelectionCount-30, etc.) ºi precizãm
ce se executã atunci când selectãm un interval de timp:
76 Introducere în .Net Framework (Suport de curs)
• ListView este folosit pentru a afiºa o colecþie de elemente în unul din cele 4
moduri (Text, Text+Imagini mici, Imagini mari, Detalii). Acesta este similar gra-
fic cu ferestrele în care se afiºeazã fiºierele dintr-un anumit director din
Windows Explorer. Fiind un control complex, conþine foarte multe proprietãþi,
printre care: View (selecteazã modul de afiºare (LargeIcon, SmallIcon, Details,
List)), LargeImageList, SmallImageList (icon-urile de afiºat în modurile
LargeIcon, SmallIcon), Columns(utilizat doar în modul Details, pentru a defini
coloanele de afiºat), Items(elementele de afiºat).
Pentru item-ul selectat se afiºeazã mai întâi folderele ºi dupã aceea fiºierele.
Pentru aceasta trebuie sã determinãm conþinutul acestuia:
ListViewItem lvi;
ListViewItem.ListViewSubItem lvsi;
this.calea_curenta.Text = radacina + “(Doublu Click pe folder)”;
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(radacina);
DirectoryInfo[] dirs = dir.GetDirectories();
FileInfo[] files = dir.GetFiles();
this.lista_fisiere.Items.Clear();
this.lista_fisiere.BeginUpdate();
ºi sã adãugãm fiecare nou item ( coloana a doua este vidã în cazul foldere-
lor):
Dãm clic pe icoana de la timer care are numele aplCeas, iar la Events, la Tick selec-
tãm lblCeas_Click
CAPITOLUL 5. Programare vizualã 79
Formularul:
ProgressBar-urile:
Pentru Timer:
Control Proprietate Valoare Evenimente
Timer1 (Name) Timer1 Timer1_Tick
Enabled True
Interval 1.000
pentru timer1:
lblAfisOre.Text = H.ToString();
82 Introducere în .Net Framework (Suport de curs)
lblAfisMinute.Text = M.ToString();
lblAfisSecunde.Text = S.ToString();
}
pentru a redimensiona proporþional ProgressBar-ul Ore cu cel care reprezintã
Minutele, respectiv Secundele, introducem urmãtorul cod:
În aplicaþia urmãtoare PV9 cele 3 butoane ale toolbar-ului permit modificarea pro-
prietãþilor textului introdus în casetã. Toolbar-ul se poate muta fãrã a depãºi spaþiul
ferestrei. Schimbarea fontului se realizeazã cu ajutorul unui control FontDialog(),iar
schimbarea culorii utilizeazã ColorDialog()
{ this.richTextBox1.Font= fd.Font;
this.richTextBox1.ForeColor=fd.Color;
}
ColorDialog cd = new ColorDialog();
cd.AllowFullOpen = true;cd.Color = Color.DarkBlue;
if(cd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
this.richTextBox1.ForeColor = cd.Color;
toolBar1.BorderStyle = BorderStyle.Fixed3D;
}}}
}
unde mainMenu1 ºi mainMenu2 sunt obiecte de tip MenuStrip. Editarea unui ast-
fel de obiect se poate face utilizând Menu Designer. Clasa MenuStrip are o colecþie
de MenuItem care conþine 0 sau mai multe obiecte de tip MenuItem. Fiecare dintre
aceste obiecte de tip MenuItem are 0 sau mai multe obiecte de tip MenuItem, care
vor constitui noul nivel de itemi (Ex: File ÆNew,Save, Open, Close, Exit).
Propietãþile Checked ºi RadioCheck indicã itemul selectat, Enabled and Visible
determinã dacã un item poate fi sau nu selectat sau vizibil, Shortcut permite
asignarea unei combinaþii de taste pentru selectarea unui item al meniului ºi Text
CAPITOLUL 5. Programare vizualã 85
Exemplul PV11 permite, prin intermediul unui meniu, scrierea unui fiºier Notpad,
afiºarea continutului acestuia într-o casetã text, schimbarea fontului ºi culorii de
afiºare, ºtergerea conþinutului casetei, afiºarea unor informaþii teoretice precum ºi
Help dinamic. Au fost definite chei de acces rapid pentru accesarea componentelor
meniului.
System.Diagnostics.Process.Start( “notepad” );
FileÆ Open selecteazã ºi afiºeazã în caseta text conþinutul unui fiºier text.
FileÆ Close ºterge conþinutul casetei text, FileÆ Exit închide aplicaþia
Window Æ Font ºi Window ÆColor permit stabilirea fontului/culorii textului afiºat.
HelpÆ DinamicHelp acceseazã
System.Diagnostics.Process.Start(“IExplore”,
“http://msdn2.microsoft.com/en-us/default.aspx”);
HelpÆ About PV afiºeazã în caseta text informaþii despre implementarea unui menu.
86 Introducere în .Net Framework (Suport de curs)
5.5. System.Drawing
Spaþiul System.Drawing conþine tipuri care permit realizarea unor desene 2D ºi au rol
deosebit în proiectarea interfeþelor grafice.
Un obiect de tip Point este reprezentat prin coordonatele unui punct într-un spaþiu
bidimensional (exemplu: Point myPoint = new Point(1,2);)
Point este utilizat frecvent nu numai pentru desene, ci ºi pentru a identifica în pro-
gram un punct dintr-un anumit spaþiu. De exemplu, pentru a modifica poziþia unui
buton în fereastrã putem asigna un obiect de tip Point proprietãþii Location indicând
astfel poziþia colþului din stânga-sus al butonului (button.Location = new Point(100, 30)).
Putem construi un obiect de tip Point pentru a redimensiona un alt obiect.
Structura Color conþine date, tipuri ºi metode utile în lucrul cu culori. Fiind un tip
valoare (struct) ºi nu o clasã, aceasta conþine date ºi metode, însã nu permite
instanþiere, constructori, destructor, moºtenire.
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Yellow, 2);
g.DrawLines(pen, points);
Aplicaþia PV12 este un exerciþiu care deseneazã cercuri de raze ºi culori aleatorii ºi
emite sunete cu frecvenþã aleatoare.
Image thumbnail;
private void Thumbnails_Load(object sender, EventArgs e)
{ try{Image img = Image.FromFile(“C:\\Imagini\\catel.jpg”);
int latime=100, inaltime=100;
thumbnail=img.GetThumbnailImage(latime, inaltime,null, IntPtr.Zero);}
catch{MessageBox.Show(“Nu exista fisierul”);}
}
private void Thumbnails_Paint(object sender, PaintEventArgs e)
{e.Graphics.DrawImage(thumbnail, 10, 10);}
ErrorProvider
O manierã simplã de a semnala erori de validare este aceea de a seta un mesaj de
eroare pentru fiecare control.
Aplicatii recapitulative.
Urmãriþi aplicaþiile ºi precizaþi pentru fiecare dintre ele controalele utilizate, eveni-
mentele tratate: Forma poloneza (PV14), Triunghi (PV15), Ordonare vector(PV16),
Subsir crescãtor de lungime maximã(PV17), Jocul de Nim (PV18)
Exerciþiu (Test grila) Realizaþi un generator de teste grilã (întrebãrile sunt preluate
dintr-un fiºier text, pentru fiecare item se precizeazã tipul (alegere simplã/multiplã),
punctajul, enunþul ºi distractorii, imaginea asociatã (dacã existã). Dupã efectuarea
testului se afiºeazã rezultatul obþinut ºi statistica rãspunsurilor.
89
CAPITOLUL 6
ADO.NET
ADO.NET (ActiveX Data Objects) reprezintã o parte componentã a nucleului .NET
Framework ce permite conectarea la surse de date diverse, extragerea, manipularea
ºi actualizarea datelor.
De obicei, sursa de date este o bazã de date, dar ar putea de asemenea sã fie un
fiºier text, o foaie Excel, un fiºier Access sau un fiºier XML.
În aplicaþiile tradiþionale cu baze de date, clienþii stabilesc o conexiune cu baza de
date ºi menþin aceastã conexiune deschisã pânã la încheierea executãrii aplicaþiei.
Conexiunile deschise necesitã alocarea de resurse sistem. Atunci când menþinem
mai multe conexiuni deschise server-ul de baze de date va rãspunde mai lent la
comenzile clienþilor întrucât cele mai multe baze de date permit un numãr foarte mic
de conexiuni concurente.
ADO.NET permite ºi lucrul în stil conectat dar ºi lucrul în stil deconectat, aplicaþiile
conectându-se la server-ul de baze de date numai pentru extragerea ºi actualizarea
datelor. Acest lucru permite reducerea numãrului de conexiuni deschise simultan la
sursele de date.
ADO.NET oferã instrumentele de utilizare ºi reprezentare XML pentru transferul
datelor între aplicaþii ºi surse de date, furnizând o reprezentare comunã a datelor,
ceea ce permite accesarea datelor din diferite surse de diferite tipuri ºi prelucrarea lor
ca entitãþi, fãrã sã fie necesar sã convertim explicit datele în format XML sau invers.
Aceste caracteristici sunt determinate în stabilirea beneficiilor furnizate de
ADO.NET:
• Interoperabilitate. ADO.NET poate interacþiona uºor cu orice componentã care
suportã XML.
• Durabilitate. ADO.NET permite dezvoltarea arhitecturii unei aplicaþii datoritã
modului de transfer a datelor între nivelele arhitecturale.
• Programabilitate.ADO.NET simplificã programarea pentru diferite task-uri cum
ar fi comenzile SQL, ceea ce duce la o creºtere a productivitãþii ºi la o scãdere a
numãrului de erori.
• Performanþã. Nu mai este necesarã conversia explicitã a datelor la transferul
între aplicaþii, fapt care duce la creºte performanþelor acestora.
• Accesibilitate Utilizarea arhitecturii deconectate permite accesul simultan la
acelaºi set de date. Reducerea numãrului de conexiuni deschise simultan deter-
minã utilizarea optimã a resurselor.
90 Introducere în .Net Framework (Suport de curs)
6.3.Connection.
Înainte de orice operaþie cu o sursã de date externã, trebuie realizatã o conexiune
(legãturã) cu acea sursã. Clasele din categoria Connection (SQLConnection,
OleDbConnection etc.) conþin date referitoare la sursa de date (locaþia, numele ºi
parola contului de acces, etc.), metode pentru deschiderea/închiderea conexiunii,
pornirea unei tranzacþii etc. Aceste clase se gãsesc în subspaþii (SqlClient, OleDb etc.)
ale spaþiului System.Data. În plus, ele implementeazã interfaþa IdbConnection.
Pentru deschiderea unei conexiuni prin program se poate instanþia un obiect de tip
conexiune, precizându-i ca parametru un ºir de caractere conþinând date despre
conexiune.
CAPITOLUL 6. ADO.NET 91
using System.Data.SqlClient;
SqlConnection co = new SqlConnection();
co.ConnectionString = “Data Source=localhost; User ID=profesor;pwd=info; Initial
Catalog=Orar”;
co.Open();
using System.Data.SqlClient;
SqlConnection co =
new SqlConnection(@”Data Source=serverBD;Database=scoala;User
ID=elev;Password=madonna”);
co.Open();
using System.Data.OleDb;
OleDbConnection co =
new OleDbConnection(@”Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Date\scoala.mdb”);
co.Open();
6.3.2. Proprietãþi
a) ConnectionString (String, cu accesori de tip get ºi set ) defineºte un ºir care per-
mite identificarea tipului ºi sursei de date la care se face conectarea ºi eventual
contul ºi parola de acces. Conþine lista de parametri necesarii conectãrii sub
forma parametru=valoare, separaþi prin ;.
Parametru Descriere
Specificã furnizorul de date pentru conectarea la sursa de date. Acest furnizor
Provider trebuie precizat doar dacã se foloseºte OLE DB .NET Data Provider,
ºi nu se specificã pentru conectare la SQL Server.
Identificã serverul, care poate fi local,
Data Source
un domeniu sau o adresa IP.
specificã numele bazei de date. Baza de date trebuie sã se gãseascã pe
Initial Catalog
serverul dat în Data Source
Integrated Security32 Logarea se face cu user-ul configurat pentru Windows.
User ID Numele unui user care are acces de logare pe server
Password Parola corespunzãtoare ID-ului specificat.
c) Database (string, read-only): returneazã numele bazei de date la care s–a fãcut
conectarea. Este necesarã pentru a arãta unui utilizator care este baza de date
pe care se face operarea
d)Provider (de tip string, read-only): returneazã furnizorul de date
e) ServerVersion (string, read-only): returneazã versiunea de server la care s-a fãcut
conectarea.
f) State (enumerare de componente ConnectionState, read-only): returneazã
starea curentã a conexiunii. Valorile posibile: Broken, Closed, Connecting,
Executing, Fetching, Open.
6.3.3. Metode
a) Open(): deschide o conexiune la baza de date
b)Close() ºi Dispose(): închid conexiunea ºi elibereazã toate resursele alocate pen-
tru ea
c) BeginTransaction(): pentru executarea unei tranzacþii pe baza de date; la sfârºit
se apeleazã Commit() sau Rollback().
d)ChangeDatabase(): se modificã baza de date la care se vor face conexiunile. Noua
bazã de date trebuie sã existe pe acelaºi server ca ºi precedenta.
e) CreateCommand(): creeazã o comandã (un obiect de tip Command) validã asoci-
atã conexiunii curente.
6.3.4. Evenimente
a) StateChange: apare atunci când se schimbã starea conexiunii. Handlerul cores-
punzãtor (de tipul delegat StateChangeEventHandler) spune între ce stãri s-a
fãcut tranziþia.
b) InfoMessage: apare când furnizorul trimite un avertisment sau un mesaj cãtre client.
6.4. Command
Clasele din categoria Command (SQLCommand, OleDbCommand etc.) conþin date
referitoare la o comandã SQL (SELECT, INSERT, DELETE, UPDATE) ºi metode pentru
executarea unei comenzi sau a unor proceduri stocate. Aceste clase implementeazã
interfaþa IDbCommand. Ca urmare a interogãrii unei baze de date se obþin obiecte din
categoriile DataReader sau DataSet. O comandã se poate executa numai dupã ce s-a
stabilit o conxiune cu baza de date corespunzãtoare.
CAPITOLUL 6. ADO.NET 93
6.4.1. Proprietãþi
a) CommandText (String): conþine comanda SQL sau numele procedurii stocate care
se executã pe sursa de date.
b)CommandTimeout (int): reprezintã numãrul de secunde care trebuie sã fie aºteptat
pentru executarea comenzii. Dacã se depãºeste acest timp, atunci se genereazã
o excepþie.
c) CommandType (enumerare de componente de tip CommandType): reprezintã tipul
de comandã care se executã pe sursa de date. Valorile pot fi: StoredProcedure
(apel de procedurã stocatã), Text (comandã SQL obiºnuitã), TableDirect (numai
pentru OleDb)
d)Connection (System. Data. [Provider].PrefixConnection): conþine obiectul de tip
conexiune folosit pentru legarea la sursa de date.
e) Parameters (System.Data.[Provider].PrefixParameterCollection): returneazã o
colecþie de parametri care s-au transmis comenzii.
f) Transaction (System.Data.[Provider].PrefixTransaction): permite accesul la
obiectul de tip tranzacþie care se cere a fi executat pe sursa de date.
6.4.2. Metode
a) Constructori:
SqlCommand()
SqlCommand(string CommandText)
SqlCommand(string CommandText, SqlConnection con )
SqlCommand(string CommandText,SqlConnection con,SqlTransaction trans)
b)Cancel() opreºte o comandã aflatã în executare.
c) Dispose() distruge obiectul comandã.
d)ExecuteNonQuery()executã o comandã care nu returneazã un set de date din baza
de date; dacã comanda a fost de tip INSERT, UPDATE, DELETE, se returneazã
numãrul de înregistrãri afectate.
Exemplu:
SqlCommand cmd = new SqlCommand();
cmd.CommandText = “DELETE FROM elevi WHERE nume = ’BARBU’”;
cmd.Connection = con;
Console.WriteLine(cmd.ExecuteNonQuery().ToString());
//câte înreg. s-au sters
Exemplu
Se obþine conþinutul tabelei elevi într-un obiect de tip SqlDataReader.
SqlCommand cmd = new SqlCommand(“SELECT * FROM elevi”,con);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read()) { Console.WriteLine(“{0} - {1}”,
94 Introducere în .Net Framework (Suport de curs)
reader.GetString(0),reader.GetString(1));
}
reader.Close();
Exemplu:
Exemplu:
SqlCommand CMD=
new SqlCommand(“SELECT * FROM elevi FOR XML MATE,EXAMEN”, con);
System.Xml.XmlReader myXR = CMD.ExecuteXmlReader();
using System.Data.SqlClient;
SqlConnection conn =
new SqlConnection(@”Data Source=serverBD;Database=MAGAZIN;User ID=adm;Password=eu”);
conn.Open();
CAPITOLUL 6. ADO.NET 95
cmd.Connection = conn;33
// Apelãm ExecuteNonQuery pentru executarea comenzii
cmd.ExecuteNonQuery();
Câteodatã avem nevoie sã obþinem din baza de date o singurã valoare, care poate
fi o sumã, o medie sau alt rezultat al unei funcþii agregat. O alegere ineficientã ar fi
utilizarea metodei ExecuteReader ºi apoi calculul valorii. În acest caz, cea mai bunã
alegere este sã lucrãm direct asupra bazei de date ºi sã obþinem aceastã valoare.
Exerciþii:
1) Realizaþi o conexiune la baza de date MAGAZIN ºi afiºaþi ID-urile produselor.
using System;
using System.Data;
using System.Data.SqlClient;
class ADO1
{
static void Main()
{ SqlConnection conn = new SqlConnection(
“Data Source=(local);Initial Catalog=MAGAZIN;Integrated Security=SSPI”);
SqlDataReader rdr = null;
try
{ conn.Open();
SqlCommand cmd = new SqlCommand(“select * from PRODUSE”, conn);
33 Am fi putut folosi acelaºi constructor ca la Insert. Acest exemplu demonstreazã cã putem schimba oricând obiec-
tul connection asignat unei comenzi
34 În acest exemplu am ales sã aplelã constructorul SqlCommand fãrã parametri, pentru a exemplifica cum putem
stabili explicit conexiunea ºi comanda
35 Este necesarã conversia întrucât rezultatul returnat de ExecuteScalar este de tip object
CAPITOLUL 6. ADO.NET 97
rdr = cmd.ExecuteReader();
while (rdr.Read()) { Console.WriteLine(rdr[0]);}
}
finally
{ if (rdr != null) {rdr.Close();}
if (conn != null){conn.Close();}
}
}
}
using System;
using System.Data;
using System.Data.SqlClient;
class ADO2
{
SqlConnection conn;
public ADO2()
{ conn = new SqlConnection(“Data Source=(local);Initial
Catalog=MAGAZIN;Integrated Security=SSPI”);
}
static void Main()
{
ADO2 scd = new ADO2();
Console.WriteLine(“Produse aflate în magazin înainte de Insert”);
scd.ReadData();scd.Insertdata();
Console.WriteLine(“Produse aflate în magazin dupa Insert”);
scd.ReadData();scd.UpdateData();
Console.WriteLine(“Produse aflate în magazin dupa Update”);
scd.ReadData();scd.DeleteData();
Console.WriteLine(“Categories After Delete”);
scd.ReadData();
int number_inregistrari = scd.GetNumberOfRecords();
Console.WriteLine(“Numarul de inregistrari: {0}”, numar_inregistrari);
}
public void ReadData()
{ SqlDataReader rdr = null;
try
{conn.Open();
SqlCommand cmd = new SqlCommand(“select DENUMIRE_PRODUS from PRODUSE”,
conn);
rdr = cmd.ExecuteReader();
while (rdr.Read()) {Console.WriteLine(rdr[0]);}
}
finally
{ if (rdr != null){rdr.Close();}
98 Introducere în .Net Framework (Suport de curs)
if (conn != null){conn.Close();}
}
}
public void Insertdata()
{try
{conn.Open();
string insertString = @”insert into PRODUSE(DENUMIRE_PRODUS, DESCRIERE)
values (‘SCOOBY’, ‘jucarie de plus’)”;
SqlCommand cmd = new SqlCommand(insertString, conn);
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}
}
}
public void UpdateData()
{
try
{conn.Open();
string updateString = @”update PRODUSE set DENUMIRE_PRODUS = ‘SCOOBY DOO’
where DENUMIRE_PRODUS = ‘SCOOBY’”;
SqlCommand cmd = new SqlCommand(updateString);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}
}
}
public void DeleteData()
{ try
{ conn.Open();
string deleteString = @”delete from PRODUSE where DENUMIRE_PRODUS = ‘BAR-
BIE’”;
SqlCommand cmd = new SqlCommand();
cmd.CommandText = deleteString;
cmd.Connection = conn;
cmd.ExecuteNonQuery();
}
finally
{if (conn != null){conn.Close();}}
}
public int GetNumberOfRecords()
{
int count = -1;
try
{ conn.Open();
SqlCommand cmd = new SqlCommand(“select count(*) from Produse”, conn);
count = (int)cmd.ExecuteScalar();
}
CAPITOLUL 6. ADO.NET 99
finally
{if (conn != null){conn.Close();}
}
return count;
}
}
6.5. DataReader
Datele pot fi explorate în mod conectat (cu ajutorul unor obiecte din categoria
DataReader), sau pot fi preluate de la sursã (dintr-un obiect din categoria
DataAdapter) ºi înglobate în aplicaþia curentã (sub forma unui obiect din categoria
DataSet).
Clasele DataReader permit parcurgerea într-un singur sens a sursei de date, fãrã
posibilitate de modificare a datelor la sursã. Dacã se doreºte modificarea datelor la
sursã, se va utiliza ansamblul DataAdapter + DataSet.
Datorita faptului cã citeºte doar înainte (forward-only) permite acestui tip de date
sã fie foarte rapid în citire. Overhead-ul asociat este foarte mic (overhead generat cu
inspectarea rezultatului ºi a scrierii în baza de date). Dacã într-o aplicaþie este nevoie
doar de informaþii care vor fi citite o singura datã, sau rezultatul unei interogãri este
prea mare ca sa fie reþinut în memorie (caching) DataReader este soluþia cea mai
bunã.
Un obiect DataReader nu are constructor36, ci se obþine cu ajutorul unui obiect de
tip Command ºi prin apelul metodei ExecuteReader() (vezi exerciþiile de la capitolul
anterior). Evident, pe toatã durata lucrului cu un obiect de tip DataReader, conexi-
unea trebuie sã fie activã. Toate clasele DataReader (SqlDataReader,
OleDbDataReader etc.) implementeazã interfaþa IDataReader.
6.5.1. Proprietãþi:
a) IsClosed (boolean, read-only)- returnezã true dacã obiectul este deschis si fals
altfel
b)HasRows (boolean,read-only) - verificã dacã reader-ul conþine cel puþin o înre-
gistrare
c) Item (indexator de câmpuri)
d)FieldCount - returneazã numãrul de câmpuri din înregistrarea curentã
6.5.2. Metode:
a) Close() închidere obiectului ºi eliberarea resurselor; trebuie sã preceadã
închiderea conexiunii.
b)GetBoolean(), GetByte(), GetChar(), GetDateTime(), GetDecimal(), GetDouble(),
GetFloat(), GetInt16(), GetInt32(), GetInt64(), GetValue(), GetString()
returneazã valoarea unui câmp specificat, din înergistrarea curentã
36 Dacã pentru instantiere este folosit operatorul new veþi obþine un obiect cu care nu puteþi face nimic pentru cã nu
are o conexiune ºi o comandã ataºate.
100 Introducere în .Net Framework (Suport de curs)
DataReader obþine datele într-un stream secvenþial. Pentru a citi aceste informaþii tre-
buie apelatã metoda Read; aceasta citeste un singur rând din tabelul rezultat. Metoda
clasicã de a citi informaþia dintr-un DataReader este de a itera într-o buclã while.
Ex.1)
Exemplu: Codul
este echivalent cu
using System;
using System.Data;
using System.Data.SqlClient;
class ADO3
{ static void Main()
{ADO3 rd = new ADO3();
rd.SimpleRead();
}
6.6. DataAdapter
Folosirea combinatã a obiectelor DataAdapter ºi DataSet permite operaþii de
selectare, ºtergere, modificare ºi adãugare la baza de date. Clasele DataAdapter
genereazã obiecte care funcþioneazã ca o interfaþã între sursa de date ºi obiectele
DataSet interne aplicaþiei, permiþând prelucrãri pe baza de date. Ele gestioneazã
automat conexiunea cu baza de date astfel încât conexiunea sã se facã numai atunci
când este imperios necesar.
Un obiect DataSet este de fapt un set de tabele relaþionate. Foloseºte serviciile
unui obiect DataAdapter pentru a-ºi procura datele ºi trimite modificãrile înapoi cãtre
baza de date. Datele sunt stocate de un DataSet în format XML, acelaºi folosit ºi pen-
tru transferul datelor.
În exemplul urmãtor se preiau datele din tablele elevi ºi profi:
6.6.1. Proprietãþi
a) DeleteCommand, InsertCommand, SelectCommand, UpdateCommand (Command), conþin
comenzile ce se executã pentru selectarea sau modificarea datelor în sursa de
date.
b)MissingSchemaAction (enumerare) determinã ce se face atunci când datele aduse
nu se potrivesc peste schema tablei în care sunt depuse. Poate avea urmãtoarele
valori:
Add - implicit, DataAdapter adaugã coloana la schema tablei
AddWithKey – se adugã coloana ºi informaþii relativ la cheia primarã
Ignore - se ignorã lipsa coloanei respective, ceea ce duce la pierdere de date
Error - se genereazã o excepþie de tipul InvalidOperationException.
6.6.2. Metode
Constructori:SqlDataAdapter()|SqlDataAdapter(obiect_comanda)|
SqlDataAdapter(string_comanda, conexiune);
a) Fill() permite umplerea unei tabele dintr–un obiect DataSet cu date. Permite
specificarea obiectului DataSet în care se depun datele, eventual a numelui
tablei din acest DataSet, numãrul de înregistrare cu care sã se înceapã popu-
larea (prima având indicele 0) ºi numãrul de înregistrãri care urmeazã a fi aduse.
a) Update() permite transmiterea modificãrilor efectuate într–un DataSet cãtre
baza de date.
6.7. DataSet
Un DataSet este format din Tables (colecþie formatã din obiecte de tip DataTable;
DataTable este compus la rândul lui dintr-o colecþie de DataRow ºi DataColumn),
Relations (colecþie de obiecte de tip DataRelation pentru memorarea legãturilor
pãrinte–copil) ºi ExtendedProperties ce conþine proprietãþi definite de utilizator.
Scenariul uzual de lucru cu datele dintr-o tabelã conþine urmãtoarele etape:
• popularea succesivã a unui DataSet prin intermediul unuia sau mai multor
obiecte DataAdapter, apelând metoda Fill (vezi exemplul de mai sus)
• procesarea datelor din DataSet folosind numele tabelelor stabilite la umplere,
ds.Tables[“elevi”], sau indexarea acestora, ds.Tables[0], ds.Tables[1]
• actualizarea datelor prin obiecte comandã corespunzãtoare operaþiilor INSERT,
UPDATE ºi DELETE. Un obiect CommandBuilder poate construi automat o com-
binaþie de comenzi ce reflectã modificãrile efectuate.
SqlDataAdapter daProd =
new SqlDataAdapter (“SELECT ID_PRODUS, DENUMIRE_PRODUS FROM PRODUSE”, conn);
Dupã ce au fost fãcute modificãri într-un DataSet acestea trebuie scrise ºi în baza
de date. Actualizarea se face prin apelul metodei Update.
daProd.Update (dsProduse, “PRODUSE”);
6.8. SqlParameter
Atunci când lucrãm cu bazele de date avem nevoie, de cele mai multe ori sã filtraþi
rezultatul dupã diverse criterii. De obicei acest lucru se face în funcþie de niºte criterii
pe care utilizatorul le specificã (ex: vreþi sã vedeþi doar pãpuºile Barbie).
Cea mai simplã metodã de filtrare a rezultatelor este sã construim dinamic string-ul
SqlCommand dar aceastã metoda nu este recomandatã deoarece poate afecta baza
de date (ex. Accesarea informaþiilor confidenþiale).
Dacã folosim interogãri cu parametri atunci orice valoare pusã într-un parametru
nu va fi tratatã drept cod SQL, ci ca valoare a unui câmp, fãcând aplicaþia mai sigurã.
Pentru a folosi interogãri cu parametri trebuie sã:
Ex. cmd.Parameters.Add(param);
37 Se pot afiºa mai multe tabele dintr-un DataSet, semnul "+" permiþându-i utilizatorului sã aleaga care tabel sã fie
afiºat. Pentru a suprima afiºarea acelui semn "+" setãm proprietatea DataMembers pe numele tabelului care va fi
afiºat. Numele tabelului este acelaºi care l-am folosit ca parametru în apelul metodei Fill.
38 Atunci când comanda va fi executatã @den va fi înlocuit cu valoarea aflatã în obiectul SqlParameter ataºat. Dacã
nu asociem o instanþã de tipul SqlParameter pentru un parametru din string-ul de interogare sau avem mai multe
instanþe SqlParameter pentru un parametru vom obþine o eroare la rulare
CAPITOLUL 6. ADO.NET 105
Exemplu:
Precizãri.Toate informaþiile se vor afla într-o bazã de date. Creati propriile structuri
de date adecvate rezolvarii problemei. Utilizati Microsoft Access pentru crearea bazei
de date. Iniþial aplicaþia va afiºa o formã Windows care permite selectarea operaþiei
efectuate (adãugare carte/cãrþi, adãugare abonat, actualizare stare carte/cãrþi/abonat,
împrumutã carte/cãrþi, etc.)
• Prin “tragerea” unor obiecte din fereastra Data Sources în fereastra noastrã
nouã, se creeazã automat obiecte specifice. În partea de jos a figurii se pot
observa obiectele de tip Dataset, TableAdapter, BindingSource,
BindingNavigator ºi, în fereastrã, TableGridView
Meniul contextual asociat grilei în care vor fi vizualizate datele permite configu-
rarea modului de lucru cu grila (sursa de date, operaþiile permise ºi altele).
108 Introducere în .Net Framework (Suport de curs)
În timpul rulãrii aplicaþiei, bara de navigare ºi elementele vizuale ale grilei permit
operaþiile de bazã cu înregistrãrile bazei de date. Operaþiile care modificã baza de
date trebuie sã fie definitivate prin salvarea noilor date .
BIBLIOGRAFIE
• Marshall Donis, Programming Microsoft Visual C# 2005: The Language, Microsoft Press 2006,
ISBN:0735621810
• Pelland Patrice, Build a Program NOW, Microsoft Visual C# 2005 Express Edition, Microsoft Press
2006,
• LearnVisualStudio.NET http://www.learnvisualstudio.net resurse educaþionale gratuite sub forma de
filme
• Harris Andy, Microsoft C# Programming for the Absolute Beginner, Premier Press 2002,
ISBN: 1?931841?16?0
• Wright Peter, Beginning Visual C# 2005 Express Edition: From Novice to Professional, Apress 2006,
ISBN-13 (pbk): 978-1-59059-549-7, ISBN-10 (pbk): 1-59059-549-1
• Liberty Jesse, Programming C#, Second Edition, O'REILLY 2002, ISBN 10: 0-596-00309-9,
ISBN 13:9780596003098
• Solis Daniel, Illustrated C# 2005, Apress 2006, ISBN-13 (pbk): 978-1-59059-723-1,
ISBN-10 (pbk): 1-59059-723-0
• Rasheed Faraz, C# School, Synchron Data 2005-2006,
http://www.programmersheaven.com/2/CSharpBook
• Schneider Robert, Microsoft® SQL Server™ 2005 Express Edition For Dummies®, Wiley Publishing
2006, ISBN-13: 978-0-7645-9927-9, ISBN-10: 0-7645-9927-5
• Bradley L. Jones, Sams Teach Yourself the C# Language in 21 Days, SAMS, 2004,
International Standard Book Number: 0-672-32546-2
• Michel de Camplain, Brian G. Patrik, C# 2.0: Practical Guide for Programmers, Elsevier, 2005,
ISBN: 0-12-167451-7
• Christian Nagel, Bill Evjen, Jay Glynn, Karli Watson, Morgan Skinner, Allen Jones,
Professional C# 2005, Wiley Publishing, Inc., 2006, ISBN-13: 978-0-7645-7534-1
ISBN-10: 0-7645-7534-1
• Sharp John, Visual C# 2005, DUNOD 2006
• Iulian Serban, Dragos Brezoi, Tiberiu Radu, Adam Ward, GDI+ Custom Controls with Visual C#
2005, PACKT Publishing 2006, ISBN 1-904811-60-4
• Simpson Alan, Visual Web Developer Server™ 2005 Express Edition For Dummies®, Wiley
Publishing 2006, ISBN-13: 978-0-7645-8360-5, ISBN-10: 0-7645-8360-3
• Hoffman Kevin, Microsoft® Visual C# 2005 Unleashed, Sams 2006,
ISBN-10: 0-672-32776-7, ISBN-13: 978-0-672-32776-6
• Popovici, Dorin Mircea ºi colaboratorii - Proiectare ºi implementare software,
Editura TEORA, Bucureºti, 1998
• C# Language Specification, Microsoft Corporation, 1999-2003
• C# Version 2.0 Specification May 2004, Microsoft Corporation, 1999-2005
• David Conger, Programarea în C#, editura B.I.C. ALL 2003
• Chris H. Pappas, William H. Murray C# pentru programarea Web, editura B.I.C. ALL 2004
• MCAD/MCSD -Developing XML WEB SERVICES and SERVER COMPONENTS WITH MICROSOFT
http://www.csharp-station.com
http://msdn2.microsoft.com
• M.E.C. Serviciul Naþional de Evaluare ºi Examinare - Ghid de evaluare,
INFORMATICA ºi TEHNOLOGIA INFORMATIEI, Editura Aramis, Bucureºti 2001
• M.E.C. Consiliul Naþional pentru Curriculum - Ghid metodologic pentru aplicarea programelor
ºcolare, Editura Aramis, Bucureºti 2002
• M.E.C Consiliul Naþional pentru curriculum - Ghid metodologic pentru Educaþie Tehnologicã
Informaticã - Tehnologia Informaþiei - Liceu teoretic - Editura Aramis, Bucureºti 2001
Autori, în ordine alfabetică:
Adrian Niţă
Introducere în
.Net Framework
ISBN: 973-86699-5-2
Ediţia 2008