Sunteți pe pagina 1din 32

1

4.1. Noiunea de interfa grafic utilizator


Noiunea de interfa poate fi definit ca o grani de-a lungul creia dou sisteme
independente se ntlnesc i comunic ntre ele. n domeniul tehnologiei informaiei
exist trei tipuri de interfee:
-

Interfee-utilizator - ansamblul de echipamente i programe care ofer


utilizatorilor posibilitatea de a interaciona cu o aplicaie; Pot fi:

Interfee grafice

Interfee bazate pe comenzi introduse de la tastatur

interfee-software ansamblul de programe specializate pe care aplicaiile le


utilizeaz pentru a comunica unele cu altele;

interfee-hardware ansamblul de instrumente pe care dispozitivele hardware


le utilizeaz pentru a comunica unele cu altele

n general, o interfa grafic utilizator se obine prin integrarea mai multor


elemente prin care se asigur reprezentarea grafic a programelor, datelor i a
opiunilor pe care le va avea utilizatorul la un moment dat. O interfa grafic ncearc
s ofere utilizatorilor aplicaiei i mijloacele necesare pentru ca ei s fac ceea ce vor
i nu s le arate o list cu ce poate calculatorul s fac.
Iat o list a caracteristicilor pe care trebuie s le regsim la o GUI (Graphical User
Interface) :
1

folosete un afiaj "hart de bii", de nalt rezoluie;

utilizeaz un echipament de indicare (de regul, mouse);

ofer o reprezentare vizual a textelor i a altor elemente grafice aa cum apar la


tiprire (WYSIWYG-What You See Is What You Get);

respect paradigma de interaciune obiect-aciune;

permite transferul de informaii ntre programe;

permite manipularea direct a obiectelor i informaiilor de pe ecran;

ofer elemente de interfa standard, cum ar fi meniurile,sau ferestrele de


dialog ;

asigur reprezentarea vizual a obiectelor pe ecran (ferestre i icon-uri);

asigur feed-back vizual la aciunile utilizatorului;

reprezint vizual aciunile i operaiunile posibile (n meniuri, bare de


instrumente, butoane de comand);

asigur preluarea opiunilor i i a caracterelor introduse de la tastatur de


ctre utilizator, prin intermediul unor componente grafice standard (csue
de text, liste, butoane de opiune(checkbox) ;

permite utilizatorului s personalizeze interfaa i interaciunile;

1 Microsoft Corporation, The Windows Interface Guidelines for Software Design, Microsoft Press, 1995

asigur utilizatorului libertatea de opiune de a utiliza tastatura sau alte


echipamente de intrare, dup dorin i obinuin.

Multe dintre interfeele grafice pe care le utilizm, ntre care i Windows, ntrunesc
doar o parte din aceste caracteristici sau pe toate.
La modul cel mai simplu, o interfa grafic este definit prin WIMP - Windows,
Icons, Menus and Pointing device acel tip de interfa-utilizator inventat i
popularizat cu succes de Macintosh n 1970 i imitat ulterior de sistemele Windows ).
Acest gen de interfa grafic se distinge prin faptul c pe ecran apar ferestre, icon-uri
i meniuri i exist un mouse pentru exploatarea acestora. n proiectarea unei GUI,
este esenial ca utilizatorul s vad pe ecran obiectele pe care le-a definit exact aa
cum arat ele i cum se vor obine pe hrtie dac sunt tiprite.
O alt caracteristic fundamental a IGU este asigurat de manipularea direct de
ctre utilizator a obiectelor i informaiilor de pe ecran. Prezentarea grafic a
componentelor nu este suficient ca s dispunem de o interfa grafic. Un icon
constituie o reprezentare grafic pentru un obiect, dar dac utilizatorul nu poate
dect s se uite la el, atunci nu avem n fa o interfa grafic. Manipularea direct
mbrac mai multe forme, n majoritatea cazurilor fiind vorba de un click de mouse
(apsarea unui buton, selecia unei opiuni dintr-o list sau bifarea unui
checkbox), i constituie unul dintre aspectele cheie ale GUI.
Am menionat ntre caracteristicile GUI i utilizarea controalelor grafice. Este vorba
despre acele componente ale interfeei prin care utilizatorul alege, introduce date,
iniiaz aciuni sau navigheaz prin interfaa aplicaiei. Se ncadreaz aici controale
simple, precum casete de validare (checkbox), casete de text (textbox), butoane de
comand sau liste, dar i containere sau casete de dialog(forms) care reunesc mai
multe controale simple. Includerea acestor controale n interfa ine seama de
modelul utilizatorului i de metaforele comune, cunoscute acestuia. Se urmrete de
asemenea utilizarea similar a acestor controale cu alte aplicaii sau medii de lucru
familiare utilizatorilor sau recomandate de standarde. De fapt, standardele
recomand utilizarea acelor controale care valorific experiena utilizatorilor i
folosete memoria asociativ a acestora.Principii de urmat n dezvoltarea
interfeelor grafice
O interfa grafic bine proiectat trebuie s respecte urmtoarele principii :
2

controlul aplicaiei de ctre utilizator;

manipularea direct a informaiilor;

consisten;

toleran la greelile utilizatorului;

asocierea de "replici" pentru comenzile unei aplicaii;

estetic;

claritate;

2 Principii de proiectare a interfeelor grafice utilizator, n PC Report, nr. 51/1996, p. 26

simplitate.

Controlul aplicaiei de ctre utilizator


Conform primului principiu enunat, este foarte important ca utilizatorul s simt
c el este cel care controleaz aplicaia i nu invers, n ai doilea rnd, utilizatorul
trebuie s aib posibilitatea s personalizeze mediul de iucru, conform preferinelor
sale. Utilizatorul trebuie s fie acela care iniiaz aciunile; ei trebuie s aib un rol
activ i nu reactiv. Exist i procese care pot fi automatizate, dar derularea lor trebuie
s se fac sub controlul utilizatorului (la apariia unor cazuri excepionale
utilizatorul trebuie s decid aciunea ce va fi executat). Pentru a putea rspunde
acestui principiu aplicaia trebuie:
(a) s fie interactiv (trebuie s ofere ntotdeuana un rezultat vizual n urma
unei aciuni a utilizatorului)
(b)s rspund la fiecare aciune a utilizatorului
(c) s fie flexibil.
Manipularea direct a informaiilor
Conform acestui principiu, utilizatorul trebuie s poat manipula informaiile ntro
manier familiar, indiferent de modul n care acestea sunt reprezentate intern la
nivelul soft-ului-applicaie. Astfel, utilizatorul poate constata direct relaia cauz-efect
ntre aciunea sa efectuat prin intermediul interfeei i rezultatul acesteia (modul n
care programul reacioneaz la aciunea sa). Fie c mut un obiect sau se deplaseaz
n cadrul unui document, utilizatorul trebuie s vad modul n care aciunea sa
afecteaz obiectele existente pe ecran. Vizibilitatea informaiilor i a opiunilor reduc
suprancrcarea mental a utilizatorilor.

Pentru satisfacerea acestei cerine,

interfaa trebuie s ofere utilizatorului o manier direct i intuitiv de operare.


Utilizatorii recunosc mai uor o comand sau un instrument de lucru dac le
asociaz cu o imagine sau un simbol. De aceea, n cadrul interfeelor grafice se
utilizeaz metaforele. Acestea faciliteaz nvarea i exploatarea unei aplicaii,
permind utilizatorilor s-i transfere cunotinele i experiena. Metaforele sunt
deosebit de utile, deoarece utilizatorii rein mai uor un neles sau o semnificaie
ataate unui obiect familiar, dect ar reine numele unei comenzi. Cnd se
utilizeaz o metafor, nu este neaprat necesar ca implementarea n cadru l
aplicaiei s fie limitat de corespondentul su din lumea real. De exemplu, un folder
(dosar) din Windows, spre deosebire de corespondentul su real, poate organiza nu
doar documente sau aplicaii, ci i echipamente (calculatoare, imprimante) sau alte
foldere. Motivul folosirii metaforelor ntr-o interfa este construirea unui "pod
cognitiv".
Consistena
Principiul consistenei cere ca interfaa s fie familiar i predictibil, oferind
utilizatorului sentimentul de stabilitate. Astfel, indiferent de opiunile pe care le
selecteaz la un moment dat, rezultatul obinut (o fereastr sau un mesaj de

atenionare) trebuie s furnizeze o reprezentare grafic familiar, cu care


utilizatorul s-a obinuit deja n cadrul activitilor zilnice pe care le desfoar.
Consistena permite utilizatorilor s transfere cunotinele existente n procese noi i
s nvee mai rapid aplicaiile noi. Consistena este citat ca fiind cea mai important
n obinerea unei interfee de calitate. Dac este asigurat, consistena l va sprijini pe
utilizator n a-i construi un model mental adecvat al modului de funcionare al
aplicaiei, ceea ce nseamn costuri de instruire i suport post-instalare mai sczute.
Iat cteva obiective pe care programatorul trebuie s le urmreasc n dezvoltarea
interfeelor grafice pentru a asigura consisten la nivelul aplicaiei:
-

un dublu clic ntr-o list anume, poate declana o anumit aciune. Ar fi de


dorit s se produc aceeai aciune (un acelai tip de rezultat) atunci cnd se
efectueaz dublu clic ntr-o alt list din aplicaie.

Butoanele trebuie plasate n locuri "strategice", locuri ce trebuiesc pstrate


pe parcursul tuturor formularelor aplicaiei

Textul, sau imaginea, afiat de butoane trebuie s fie acelai pentru


butoanele care produc rezultate similare (adugarea unor date noi, salvarea
datelor modificate, etc.)

Organizarea componentelor de editare a datelor (csue de text, liste de


opiuni) trebuie s fie aceeai n toate ferestrele ce furnizeaz acces la date.

Schema de culori utilizat trebuie s fie i ea consistent (dac utilizm


aceeai culoare pentru dou obiecte, ntre ele ar trebui s existe o legtur ).

Consistena trebuie asigurat n toate aspectele interfeei:


-

numele comenzilor - comenzi similare n aplicaii diferite s aib acelai


nume,

pentru a folosi cunotinele pe care le au

aplicaiile

precedente

(majoritatea

utilizatorii de

aplicaiilor

la

folosesc

pentru deschiderea unui fiier comanda Open);


prezentarea vizual a aplicaiei - comenzile similare din aplicaii diferite

trebuie s fie apelabile prin aceleai elemente vizuale (de exemplu,


salvarea unui fiier se face n majoritat:ea aplicaiilor prin clic pe butonul
care are stilizat o dischet);
-

comportamentul operaional al aplicaiei - operaiile similare trebuie s


aib o interfa vizual identic sau mcar asemntoare, iar cererea de
informaii suplimentare pentru realizarea unei operaiuni trebuie fcut
utiliznd

elemente de

interfa comune operaiunilor (de exemplu,

operaiunile de acces la fiiere - citire sau salvare - ar trebui s


deschid casete de dialog asemntoare).
Pentru asigurarea consistenei trebuie avute n vedere urmtoarele aspecte ale
acesteia:
-

consistena n cadrul aplicaiei. Prezentarea funciilor comune trebuie


s se fac folosind un ansamblu consistent de comenzi i/sau interfee
vizuale. Implementarea unei comenzi "copy" care ntr-un caz genereaz o

operaie imediat, iar n alt caz afieaz o fereast de dialog pentru


introducerea unei destinaii este un exemplu de inconsisten. Proiectantul
trebuie s foloseasc aceleai comenzi pentru operaii care utilizatorului i
par similare din punct de vedere al funcionalitii. Versiunile noi ale
aplicaiei, mbogite funcional,

nu trebuie s modifice maniera de lucru

anterior adoptat.
-

consistena cu mediul de operare - meninerea unui grad ridicat de


consisten

cu

conveniile de interaciune i

sistemul de operare va asigura exploatarea


utilizatorul

fiind

deja

familiarizat cu

acestea.

interfa

furnizate de

mai facil a aplicaiei,


Orice

nou

aplica ie

destinat unui sistem de operare trebuie s se alinieze la standardele pe care


acesta le impune, iar efectul acestei constrngeri nu poate fi dect benefic,
facilitnd nsuirea mai rapid a noului produs.
-

consistena cu

metaforele

utilizate.

Se recomand meninerea

metaforelor cu care utilizatorul este deja familiarizat i alegerea cu grij a


metaforelor noi. Adesea, dac un comportament particular nu poate fi
asociat unui obiect aa cum reiese din metafora definit, utilizatorul are
dificulti n realizarea unei asocieri ntre comportament i obiect.
Prin respectarea acestui principiu se obine ceea se numete stabilitate
-interfaa este familiar (chiar dac e vorba de o aplicaie nou), iar rspunsul
aplicaiei este previzibil (se mizeaz pe comportamentul similar al aplicaiilor).
Tolerana la erori
Tolerana este necesar datorit comportamentului utilizatorilor, care sunt n
definitiv simpli oameni, supui greelilor. Cel mai la ndemn exemplu este
tergerea unui fiier, efectuat din greeal, fiind grbii, obosii sau neateni. O
astfel de eroare are un impact puternic asupra moralului utilizatorului, mai ales cnd
nu exist o modalitate de recuperare sau aceasta este dificil de identificat. Impunerea
acestui principiu pleac deci de la premiza c utilizatorul obinuit face frecvent greeli,
att fizice (cum ar fi apsarea accidental a unei taste), ct i de logic. O interfa
bine proiectat trebuie s neleag gama de erori poteniale pe care utilizatorui poate
s le comit i s aib prevzute posibiliti de ieire din astfel de situaii i de
recuperare a eventualelor pierderi.
Un alt aspect deosebit de important n cadrul acestui principiu se refer la maniera
de atenionare a utilizatorului asupra apariiei unei erori sau asupra riscului unei
anumite operaii. Mesajele furnizate n aceast situaie trebuie s descrie succint i
concis problema, astfel nct utilizatorul s neleag sursa erorii sau riscul la care se
poate atepta n cazul continurii unei peraii (de obicei este vorba de operaiile de
tergere i modificare a datelor preluate deja la nivelul aplicaiei)
Spre exemplu, s discutm despre butoanele predefinite sau combinaiile de taste
pentru anumite comenzi(cunoscute sub numele de shortcut). De regul, fiecare ecran
sau caset de dialog are un buton de comand predefinit, care este invocat atunci

cnd utilizatorul apas tasta Enter i pentru fiecare buton de aciune exist i o
combinaie de taste ce poate fi utilizat n lolocul mouse-ului. Riscul este ca
utilizatorul s apese involuntar tasta Enter, lansnd astfel comanda ataat butonului
implicit, sau o combinaie de taste valid care dfeclaneaz comanda asociat unui
anumit buton. n aceste cazuri este esenial un mesaj de avertizare (n special pentru
operaiile distructive).
n plus, utilizatorii sunt adesea tentai s exp loreze o interfa, prin selectarea
"oarb" i "la ntmplare" a comenzilor i opiunilor unei aplicaii , n acest fel
utilizatorii i nsuesc modul de exploatare al unei aplicaii - este metoda numit
"ncercare i eroare" sau nvarea prin descoperire. O interfa bine proiectat
permite descoperirea interactiv a modului de exploatare a! unei aplicaii.
Prevenirea distrugerii datelor sau a blocrii sistemului trebuie asigurat prin mesaje
de avertizare n situaiile n care starea aplicaiei sau datele cu care opereaz aceasta
se pot deteriora i prin reversibilitatea unor aciuni (posibiliti de anulare sau de
recuperare a datelor )
Dac la un moment dat, ntr-un anume context, o opiune sau un submeniu nu se
pot utiliza, cel mai bine este s indicm cumva indisponibilitatea, ntr-un mod distinct
fa de opiunile disponibile (printr-o proprietate de tip Grayed, care las opiunea
vizibil, dar nu permite selectarea ei) i nu s le ascundem. Ascunderea componentelor
l poate bulversa pe utilizator, care ncearc s-i construiasc un model menta! al
funcionrii aplicaiei.
Asocierea de "replici" pentru comenzile unei aplicaii
Conform acestui principiu, o interfa este bine s transmit cte o replic sau un
rspuns pentru fiecare aciune a utilizatorului. Aceast cerin contribuie i ea la
sporirea confortului utilizatorului i ea impune ca aplicaia s confirme (prin replici)
c a preluat cererea utilizatorului i c este n curs execuia aciunii aferente cererii.
Replicile pot fi vizuale sau auditive i trebuie s confirme utilizatorului c aplicaia
rspunde ntr-adevr la aciunile sale. Aceste replici trebuie s apar n timp real,
adic concomitent cu desfurarea operaiei cerute. Puini utilizatori (n fapt, cei
avizai i experimentai) rmn indifereni n faa unui ecran care nu afieaz nici un
mesaj i care nu reacioneaz n nici un fel dac prelucrarea ce se execut la
momentul respectiv dureaz ceva mai mult timp. Cnd este vorba de aciuni de
durat mai mare, replica ce trebuie afiat trebuie s precizeze: starea (derularea)
aciunii n curs (de obicei

cu exprimare n procente sau n secunde ce au rmas),

precum i modul n care aciunea poate fi suspendat sau anulat. Exist dou
posibiliti de informare a utilizatorului asupra aciunii pe care aplicaia o execut la
un moment dat:
-

prin actualizarea liniei de stare (linia care apare n partea inferioar a


ferestrei principale);

prin afiarea de casete de mesaj.

Atunci cnd informaia ce trebuie afiat este redus ca dimensiuni, linia de stare a
aplicaiei este suficient pentru afiarea de mesaje. Dac ns este nevoie de afiarea
unui mesaj mai amplu i dac particularitile aciunii n curs permit ntreruperea
i/sau abandonarea acesteia, atunci se recomand s se recurg la o caset de dialog
non-modal care s cuprind att informaiile, ct i butoanele corespunztoare
aciunilor de ntrerupere sau terminare a aciunii n curs.
Estetica
Principiul acesta se refer la proiectarea elementelor vizuale. Interfaa trebuie s
atrag utilizatorul; un mediu de lucru plcut, prietenos contribuie la confortul
utilizatorului i la o mai bun nelegere a informaiei prezentate. Atributele vizuale
furnizeaz

date

preioase

comunic

informaii

importante

cu

privire

la

comportamentul diferitelor obiecte. O recomandare care decurge din aplicarea


acestui principiu este implicarea utilizatorului n proiectarea interfeei. De multe ori,
lucruri care par evidente pentru proiectant sunt pentru utilizatoru l de rnd neclare
sau ambigue.
Urmtoarele aspecte detaliaz principiul esteticii:
-

utilizarea corespunztoare a culorilor. Un prim aspect se refer la folosirea


aceleai scheme de culori n toate ecranele aplicaiei. Apoi, trebuie
respectat regula contrastului (culoare nchis pe fond deschis sau culoare
deschis pe fond nchis), astfel nct ecranele s fie citibile. O combinaie
rou-albastru este foarte frumoas, dar absena contrastului poate crea
probleme de urmrire a textului pe ecran. In fine, se alege uneori o anume
culoare pentru a scoate n eviden o opiune sau o situaie deosebit,
ntruct nu toi utilizatorii reacioneaz la culori, se recomand folosirea i a
unui indicator secundar (un simbol deosebit sau un semnal sonor).

folosirea de fonturi adecvate - este vorba aici de fontur i uor de citit (spre
xemplu, Times New Roman n loc de Comic Sans MS). De asemenea, atenie
la numrul de fonturi ce se folosesc pe acelai ecran - n nici un caz mai
mult de trei. Se pot obine efecte diferite prin folosirea de atribute (bold,
italic, umbrit) pentru acelai font.

alinierea cmpurilor i datelor propriu-zise. Datele se aliniaz corespunztor


tipului lor astfel: irurile la stnga, datele numerice ntregi la dreapta, iar
cele numerice reale se aliniaz dup marca zecimal, datele calendaristice tot
la dreapta.

Claritatea
Principiul claritii poate fi discutat din 3 puncte de vedere: vizua l, conceptual,
lingvistic.
Claritatea vizual este asigurat de elementele vizuale (obiectele) care o compun.
Acestea trebuie s fie sugestive, uor de neles, ele reprezentnd n fapt o
transpunere simplificat a unor obiecte reale. De asemenea, este important i
aranjarea obiectelor pe ecran. Opiunile sau comenzile care se grupeaz din punct de

vedere logic trebuie reunite i delimitate de celelalte prin chenare sau cadre, n mod
simiiar, trebuie plasate separat i delimitate ntre ele opiunile ntre care nu exist
legtur.
Claritatea conceptual se caracterizeaz prin dou atribute: simplu i realist'
Simplitatea interfeei nseamn afiarea unui numr rezonabil de obiecte pe ecran
(ntr-o fereastr), iar caracterul realist este asigurat prin similitudinea cu obiectele
reale (de exemplu, dac o fereastr prezint o factur, este de dorit ca obiectele care
o descriu s reproduc ct se poate de exact aspectul acesteia).
Claritatea lingvistic se refer la textul ce apare n interfa. Denumirile opiunilor
de meniu, mesajele, opiunile, etc. trebuie s fie clare, neambigue. Textul pe care l
afim pe ecran este o surs principal de informare a utilizatorilor, de aceea ar trebui
s se utilizeze cuvinte sau propoziii ntregi, nu prescurtri. Mesajele trebuie s fie
formulate categoric i fr ambiguiti. Spre exemplu, la operaiunea de introducere a
codului clientului, dintre urmtoarele dou mesaje "Lungimea codului de client este de 5
caractere!", "Ai introdus o valoare eronat!" ar trebui utilizat primul, altfel utilizatorul va
fi derutat, pentru c nu are cum s intuiasc ce anume se dorete de la el.
Simplitate
O interfa trebuie s fie simpl, uor de nvat i exploatat. Ea trebuie s permit
accesul facil la toate funcionalitile oferite de aplicaie. Este recomandat reducerea
informaiilor prezentate n interfa la strictul necesar unei comunicri eficiente
(trebuie evitate descrierile detaliate, frazele stufoase sau irelevante). Important este
i aranjarea i prezentarea elementelor interfeei (se vor folosi semantici i ordini de
reprezentare naturale).
Maximizarea funcionalitii unei aplicaii intr n contradicie cu simplitatea cerut,
dar cele dou aspecte pot fi echilibrate printr-o proiectare corespunztoare.
O metod recomandat, mai ales pentru aplicaiile cu grad mare de complexitate,
este metoda descoperirii progresive. Aceast metod se bazeaz pe dou aspecte:
-

organizarea atent a informaiilor, evitnd aglomerarea pe un singur ecran;


prezentarea fiecrei informaii la momentul potrivit - atunci cnd nu este
nevoie de ea, informaia se ascunde.

"Ascunderea" date lor reduce

cantitatea de informaii cu care utilizatorul vine n contact la un moment dat.


Deci, o interfa bun va prezenta informaia ntr-o manier ierarhic. De exemplu,
informaia de control (comenzile disponibile ale aplicaiei) se nglobeaz, de obicei, n
meniuri, n funcie de contextul de utilizare, o parte din opiunile unui meniu,
indisponibile la un moment dat, se pot ascunde sau inhiba, n plus, este posibil
introducerea unor instrumente de lucru suplimentare. Un exemplu este linia de
intsrumente (toolbar-ui), care reunete comenzile de meniu mai frecvent folosite sub
form de butoane, tocmai n ideea ca accesarea acestor comenzi s se fac ct mai
simplu.
.

4.2. Ciclul de dezvoltare a unei interfee grafice utilizator


Dezvoltarea unei GUI se bazeaz pe un ciclu iterativ, care cuprinde 4 faze:
-

determinarea cerinelor;

construirea prototipului (proiectarea formularelor) de definesc doar


formele cu obiectele grafice (fr secvente de cod pentru implementarea
comportamentului) ;

validarea prototipului cu utilizatorul interfaa se evalueaz, de regul, din


punct de vedere ergonomic

implementarea comportamentului se scriu secvenele de cod pentru


tratarea evenimentelor corespunztoare aciunilor posibil a fi efectuate de
utilizator

testare

4.2.1.

Construirea interfeelor grafice n VisualBasic.NET

Proiectarea formularelor presupune:


-

combinarea prin compunere a componentelor grafice necesare pentru a


obine funcionalitatea dorit

stabilirea denumirii fiecrei componente (proprietatea name a obiectului


grafic)

stabilirea textului ce va fi afiat de componentele de tip label,

meniu,

commandButton sau RadioButton


n general, componentele grafice se pot ncadra n una din urmtoarele mari
categorii:

container - poate conine alte obiecte sau containere. Se comport ca obiect


printe pentru alte obiecte (formularul nsui este un obiect de tip container pentru
celelalte obiecte de pe el). Toate obiectele din container motenesc valorile setate
pentru unele din proprietile containerului (ex: Enabled, Visible etc); n Visual
Basic, pentru a construi un container dispunem de controlul Frame.

componente atomice sunt utilizate pentru interaciunea direct cu utilizatorul


(butoane, csue de text, liste de opiuni, butoane de opiune i casete de validare)
.
Componentele grafice sunt, n fapt, clase definite de productorii limbajului sau de

tere persoane, clase pe care le utilizm (de obicei prin intermediul unei alte interfee
grafice) n crearea propriilor clase ce vor reprezenta interfea grafic a aplicaiei.
Un formular (forma grafic) nu este altceva dect o clas ale crei atribute
(proprieti) sunt date de componentele grafice ataate. Aceast cals poate fi
definit n mod vizual (de regul) sau direct prin scrierea secvenelor de cod specifice
pentru

definirea

oricrei

clase

(o

form

mai

rar

de

abordare).

Atributele

(proprietile) unei clase de tip Windows Form (clasa de baz Visual Basic .NET) vor

10

stoca referine ctre obiecte aparinnd altor clase definite de productorii limbajului
(Form, TextBox, ListBox, etc.). La momentul lansrii n execuie, se instaniaz clasa
respectiv i se obine obiectul complex reprezentat vizual pe ecran.
n acest material nu ne propunem s detaliem proprietile i metodele de care
dispune fiecare component grafic n parte, aceste aspecte fiind disponibile att n
bibliografia furnizat la nceputul semestrului ct i n documentaia standard .NET.
Figura 4-1 Construirea unui formular n manier vizual (Projectadd Windows Form)

Denumirile componentelor grafice (proprietatea name) plasate pe formularul din


figura 4-1 sunt urmtoarele :
- containere: form1 (chiar obiectul-formular), grpOrdine (obiect de tip GroupBox ce
poate fi gasit n fereastra Toolbox/Containers)
- componente atomice: lstStanga, lstDreapta, cmdSelect (butonul care are drept
tex afit semnul >), cmdUnselect,
Ascendent),

radDescendent,

radAscendent (butonul radio cu textul

cmdAdd,cmdUpdate

cmdRemove,

txtValoare

(textBox-ul de deasupra butoanelor Add/Remove)

4.2.2.
Implementarea
evenimente

comportamentului

Programarea

bazat

pe

In programarea procedural tradiional, procesul de calcul este in intregime ghidat


de instructiunile programului. Imediat ce s-a incheiat executarea unei instructiuni, se
trece la instructiunea urmatoare, respectand fluxul programului respectiv. Aceasta se
refera i la interactiunea dintre program si utilizator. Chiar dac programul este
interactiv, initiaiva privind datele ce trebuie introduse si in ce moment se introduc
acestea aparine programului. Operatorului uman nu i ramane decat sa se
conformeze solicitrilor acestuia i s introduc date atunci cand ele sunt cerute de
program. Este evident ca un asemenea rol nu este deloc convenabil pentru utilizator,
care de cele mai multe ori dorete s dein controlul i s fie el cel care ia iniiativa
aciunilor.
Apariia

interfeelor

grafice

permis

introducerea

unei

noi

concepii

in

interactiunea dintre operator si aplicaie, astfel c iniiativa s i revina operatorului


uman, iar programul s execute comenzile acestuia. S-a trecut astfel de la
programarea procedurala traditionala la programarea orientata pe evenimente
(engleza: Event-Oriented Programming), cunoscuta i sub numele de programare
ghidata de evenimente (engleza: Event Driven Programming).
Se numete eveniment orice modificare care are loc fie in starea dispozitivelor de
intrare, fie in cea a obiectelor grafice de pe ecran: apasarea sau eliberarea unei taste,
deplasarea mouse-ului, apasarea sau eliberarea unui buton al mouse-ului, deschiderea

11

sau inchiderea unei ferestre, efectuarea unui clic de mouse pe un obiect de control
(buton, caseta de validare, bara de defilare etc. ), intrarea cursorului mouse-ului n
campul activ al unui obiect grafic sau prsirea acestuia etc. Trebuie menionat c pot
exista i alte tipuri de evenimente, fr legtur cu interfaa grafic (vezi noiunea de
declanator (trigger) pentru baze de date), dar aici ne intereseaza numai cele legate
de interfaa grafic a aplicaiei.
In cazul modelului de programare orientat pe evenimente, iniiativa execuiei unei
anumite secvene de cod aparine ntotdeauna utilizatorului. Acesta acioneaza asupra
dispozitivelor de intrare (tastatura, mouse si altele), generand astfel evenimente la
care trebuie sa raspund programul.
Interactiunea dintre operator si aplicatie intr-un sistem bazat pe evenimente
decurge astffel:
1. operatorul provoaca generarea unui eveniment, acionand asupra tastaturii,
mouse-ului sau a altui dispozitiv de intrare. In cazul tastaturii, evenimentul
este generat prin apasarea sau eliberarea oricarei taste. In cazul mouse-ului
generarea se face fie direct de catre acesta, ca urmare a deplasarii mouseului sau apasarii /eliberarii unui buton, fie de catre un obiect grafic de pe
ecran, ca urmare a interaciunii dintre acesta i cursorul de mouse.
2. n urma unei asemenea aciuni, limbajul n care a fost scris aplicaia
genereaz un obiect specific, numit obiect eveniment, obiect ce poart i
informaia referitoare la controlul grafic pentru care s-a declanat .
3. Obiectul-eveniment este preluat de mediul run-time n care se execut
aplicaia i, n funcie de tipul de eveniment i obiectul grafic pentru care a
fost declanat, este furnizat unei metode (operaii) specifice, dac aceast
operaie exist (a fost scris de programator n faza design-time.
Aadar, problema const n identificarea modului de construire a unui program
astfel nct el s reacioneze la evenimente. Arhitectura sistemului de operare
Windows este destul de complicat i nu ne vom ocupa aici de explicarea modului
cum se nasc evenimentele; e suficient s tim care sunt acestea i c mediile de
dezvoltare ofer mecanisme pentru captarea i interpretarea acestor evenimente. n
varianta Visual Basic .NET i a produselor similare, o aplicaie const din:
1. un ansamblu de subrutine ce implementeaza logica de baz
2. subrutine (proceduri sau subprograme)
evenimentelor

numite metode de tratare a

care execut o anumit secven de cod la apariia unui

eveniment individual. O astfel de procedur (mai bine zis, metod, pentru c


formularul este o clas) se ataeaz unui control grafic i se execut numai
atunci cnd controlul respectiv intercepteaz evenimentul pentru care a fost
scris. Altfel spus, un program va rspunde unui eveniment, care se produce
la execuie, numai dac a fost scris o procedur pentru evenimentul i

12

componenta grafic respectiv; n caz contrar, evenimentul nu va genera


vreo modificare vizibil pentru utilizator.
Fiecare control plasat pe un form (ca i form-ul nsui) suport mai multe tipuri de
evenimente. De exemplu, o caset de text poate rspunde la unul din urmtoarele
evenimente: clic, dublu clic, introducerea unui text. Dac pentru evenimentul clic este
scris o procedur, atunci cnd aplicaia se va lansa n execuie, iar utilizatorul va
efectua clic pe caseta de text (se produce n acest fel evenimentul) se va lansa
automat n execuie procedura definit.
n

cazul

VB

.NET,

metodele

de

tratare

evenimentelor

sunt

similare

metodelor/procedurilor clasice, diferena fiind dat de semntura specific:


Sub denumireMetoda(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles numeControlGrafic.numeEveniment
.... cod ....
End SUB
Aadar, n VB .NET, o metod se va declana automat la apariia unui eveniment
dac:
1. definete dou argumente

precum cele de mai sus, unde sender va fi

parametrul ce va deine o referin ctre controlul grafic ce a generat


evenimentul iar e va fi chiar obiectul-eveniment (un obiect ce conine
informaii specifice n funcie de tipul evenimentului )
2. adaug

la

finalul

semnturii

secvena

Handles

numeControlGrafic.numeEveniment n mod evident, aceast parte de


semntur precizeaz mediului run-time ca, la apariia evenimentului
numeEveniment

pentru obiectul grafic numeControlGrafic

s declaneze

execuia metodei denumireMetoda


Iat i un simplu exemplu:
Si metodele de tratare a catorva evenimente :
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs)Handles MyBase.Load
MsgBox("se initializeaza formularul")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)Handles Button1.Click
MsgBox("buton apasat")
End Sub
Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
Handles Button1.MouseLeave
MsgBox("cursorul mouse-ului a iesit din zona buton1")
End Sub

13
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CheckBox1.CheckedChanged
MsgBox("noua valoare a checkboxului este:" & Me.CheckBox1.Checked)
If Me.CheckBox1.Checked Then
Me.CheckBox1.Font = New Font(New FontFamily("Arial"), 14, FontStyle.Bold)
Else
Me.CheckBox1.Font = New Font(New FontFamily("Arial"), 10,
FontStyle.Regular)
End If
End Sub
End Class

Not. Semntura (declaraia) metodelor de tratare a evenimentelor poate fi


obinut automat prin utilizarea celor dou liste de tip comboBox indicate n figura de
mai jos : se va selecta mai inti obiectul i apoi evenimentul pentru care dorim s
scriem o secven de cod ce se va declana la apariia respectivei combinaii
eveniment/obiect

Lista de obiecte

Lista
evenimentelor
Exemplul formular
2
posibil
a
fi
generate
detrebui s-i ofere
Revenind la formularul din figura 4.1, comportamentul
acestuia ar
obiectul selectat
utilizatorului posibilitatea de a introduce valori ce vor fi in
apoi
n
listaascendent/descendent,
din stanga
grafice plasate pe

funcie de butonul radio selectat. Utilizatorul va avea la dispoziie o csu de text,


denumit TxtValoare, prin intermediul creia va actualiza (aduga,modifica,terge)
elementele listei de valori (de tip ListBox) cu numele LstStanga. CU ajutorul
butoanelor

> i < (cmdSelect i cmdUnslect) utilizatorul va putea selecta

elementele pe care dorete s le sorteze ascendent/descendent, n funcie de butonul


radio selectat
Utilizatorul va putea actualiza lista de valori posibile (stanga) prin una din
urmtoarele tehnici disponibile:
-

introduce un text n csua TxtValoare i l adaug n lista LstValori prin


intermediul butonului Add (cu numele cmdAddd)

tergerea elementului curent selectat n list prin apsarea butonului


Remove

O dat construit macheta formularului conform figurii 4-1, va trebui s


implementm procedurile specifice fiecrui eveniment prin care trebuie asigurat
funcionalitatea descris mai sus.
Primul pas n realizarea acestui deziderat este de a identifica evenimentele
generate de diversele componente grafice ce trebuiesc interceptate i la apariia
crora trebuie s se asigure un comportament addecvat. Important de remarcat este

14

faptul c, dei fiecare component grafic poate genera mai multe tipuri de
evenimente (click, change, gotfocus,lostfocus,valid, etc.), trebuie identificate
doar acelea care au relevan din perspectiva funcionalitii ce trebuie implementat.
Astfel:
-

pentru butoanele de comand vom identifica evenimentul click drept


eveniment relevant, acesta declanndu-se apsarea butonului att prin
intermediul mouse-ului ct i prin tastatur (tasta Enter atunci cnd butonul
deine controul curent al tastaturii). Pentru fiecare din butoanele de comand
vom impelmenta o secven de cod specific (ce se va executa drept
rspuns la acelai eveniment click) n funcie de operaia ce trebuie
realizat (adugare,modificare, tergere sau sortare);

pentru csua de text (txtValoare) nu exist deocamdat un eveniment ce


trebuie interceptat, ea fiind doar instrumentul prin care utilizatorul introduce
noile valori.

Pentru lista de elemente posibile (lstStanga) va trebui s identificm


evenimentul ce se declaneaz la selectarea unui element al listei, pentru a
prelua valoarea selectat i a o introduce n csua de text. Astfel, utilizatorul
va avea posibilitatea de a o modifica. Pentru componenta grafic de tip
ListBox, n VisualBasic, acest eveniment poate fi tot click (se declaneaz
fie la selectarea unui element cu ajutorul

mouse-ului, fie la selectarea cu

ajutorul tastaturii (tastele Up i Downd)) sau selectedIndexChanged (se


declaneaz i atunci cnd poziia selectat se schimb ca urmare a execuiei
unei secvene de cod).

Listing 4-1. Procedurile pentru implementarea comportamentului formularului

Public Class Form1


Private Sub cmdAdd_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdAdd.Click
If Me.txtValoare.Text = "" Then
MsgBox("Introduceti o valoare!", MsgBoxStyle.Critical, "Eroare")
Return
End If
'adauga valoarea introdusa in casuta in lista dreapta
Me.lstStanga.Items.Add(Me.txtValoare.Text)
'sterge valoarea din casuta si pozitioneaza cursorul
Me.txtValoare.Text = ""
Me.txtValoare.Focus()
End Sub
Private Sub cmdSelect_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdSelect.Click
Dim index As Integer
index = Me.lstStanga.SelectedIndex
If index <> -1 Then
lstDreapta.Items.Add(lstStanga.Items(index))

15
lstStanga.Items.RemoveAt(index)

Else

MsgBox("selectati un element din lista stanga!")


End If
End Sub
Private Sub cmdUnselect_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnselect.Click
Dim index As Integer
index = Me.lstDreapta.SelectedIndex
If index <> -1 Then
lstStanga.Items.Add(lstDreapta.Items(index))
lstDreapta.Items.RemoveAt(index)
Else
MsgBox("selectati un element din lista dreapta!")
End If
End Sub
Private Sub cmdRemove_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdRemove.Click
Dim index As Integer
index = Me.lstStanga.SelectedIndex
If index <> -1 Then
lstStanga.Items.RemoveAt(index)
Else

MsgBox("selectati un element din lista stanga!")


End If
End Sub
Private Sub cmdSort_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdSort.Click
Dim aElemente(lstDreapta.Items.Count - 1) As String
'incarca tabloul cu elementele din lista
lstDreapta.Items.CopyTo(aElemente, 0)
'sorteaza (metoda Sort sorteaza ascendent)
Array.Sort(aElemente)
'daca se doreste sortare descendenta:
If Me.radDescendent.Checked Then
Array.Reverse(aElemente)
End If
'reincarca lista dreapta cu elementele tabloului (acum sortate)
lstDreapta.Items.Clear()
lstDreapta.Items.AddRange(aElemente)
End Sub

Private Sub lstStanga_SelectedIndexChanged(ByVal sender As System.Object, ByVal e


As System.EventArgs) Handles lstStanga.SelectedIndexChanged
If (lstStanga.SelectedIndex <> -1) Then
Me.txtValoare.Text = lstStanga.Items(lstStanga.SelectedIndex)
End If
End Sub
Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUpdate.Click
Dim index As Integer
index = lstStanga.SelectedIndex
If index = -1 Then
MsgBox("nici o valoare selectata in lista stanga!!!")
Return
End If

16
lstStanga.Items.RemoveAt(index)
lstStanga.Items.Insert(index, Me.txtValoare.Text)
End Sub
End Class

4.2.3.

Validarea datelor

Pentru a exemplifica i interceptarea unui tip mai special de eveniment, s


presupunem c dorim s obligm utilizatorul s introduc doar secvene numerice n
csua de text. n caz contrar, formularul trebuie s nu permit prsirea csuei
de text pn cnd situaia nu este remediat. Acest aspect face parte dintr-o
problematic mai larg, cunoscut sub numele de validarea datelor. Spre
deosebire de alte limbaje, n VisualBasic validarea datelor poate fi realizat foarte
simplu prin scrierea unei metode care s rspund evenimentului Validating.
Evenimentul Validating deine o proprietate suplimentar fa de celelalte tipuri de
evenimente: proprietatea cancel, de tip boolean, care dac va primi valoarea false,
sistemul nu va permite prsirea obiectului grafic n cauz.
Iat metoda pentru validarea datelor numerice n csua TxtValoare a formularului
nostru (vezi i paragraful despre tratarea erorilor din prima parte a acestui material):
Varianta 1- prin apel la conversia automat VB.NET (atribuirea unei valori de un tip
diferit de tipul declarat de variabila asupra creia se face atribuirea).
Private Sub txtValoare_Validating(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles txtValoare.Validating
If txtValoare.Text = "" Then
Return
End If
Dim nr As Double
Try

nr = txtValoare.Text
Catch ex As Exception
MsgBox("Doar valori numerice!!!", MsgBoxStyle.Critical, "eroare validare date")
'modifica proprietatea "cancel" a evenimentului pentru a bloca
e.Cancel = True
End Try
End Sub

Iat i o variant mai interesant care utilizeaz funcia general CType pentru
conversia tipurilor i convertete parametrul sender (care nu este altceva dect
csua de text txtValoare) n tipul original (TextBox)
Private Sub txtValoare_Validating(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles txtValoare.Validating
Dim t As TextBox
Dim nr As Double
t = CType(sender, TextBox)

17
Try

nr = CType(t.Text, Double)
Catch ex As Exception
MsgBox("Doar valori numerice!!!", MsgBoxStyle.Critical, "eroare validare date")
'modifica proprietatea "cancel" a evenimentului pentru a bloca
e.Cancel = True
End Try
End Sub

4.2.4.

Consideraii finale legate de interfeele grafice

Spuneam mai devreme c prin definirea unui formular VB nu facem altceva dect
s definim, n mod vizual, o clas ale crei atribute (proprieti) sunt obiecte grafice.
Denumirile atributelor sunt valorile pe care le introducem n mod vizual pentru
proprietatea name a fiecrui obiect. Atunci cnd este lansat n execuie formularul, se
instaniaz clasa i se invoc n mod implicit metoda show(). Ne reamintim c a
instania o clas nseamn a obine un obiect care are anumite valori pentru fiecare
atribut definit de clas (ceea ce se numea starea obiectului). De asemenea, o clas
poate fi instaniat de mai multe ori, obinndu-se mai multe obiecte din acea clas,
fiecare cu o stare distinct de celelalte obiecte. Aceste afirmaii pot fi uor
demonstrate dac definim un formular cu un singur buton i secvena de cod
prezentat mai jos. Vom observa c obinem dou instane diferite ale aceluiai
formular i c putem foarte simplu manipula obiectele formularului n maniera clasic
prezentat n seciunea dedicat claselor i obiectelor (Partea 1 a cursului)
Public Class Form3
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim frm1, frm2, frm3 As Form1
Dim i As Integer
frm1 = New Form1()
frm2 = New Form1()

frm1.Show()
frm2.Show()
frm1.Top = 10
frm2.Top = frm1.Height + 30
MsgBox("next")
For i = 0 To 5
frm1.txtValoare.Text = Math.Round(Rnd() * 1000)
MsgBox("next")
frm1.cmdAdd_Click(frm1.cmdAdd, New EventArgs())
MsgBox("next")
Next
For i = 0 To 5

18
frm1.lstStanga.SelectedIndex = 0
MsgBox("next")
frm1.cmdSelect_Click(frm1.cmdSelect, New EventArgs())
MsgBox("next")
Next
'form 2
frm2.Activate()
For i = 0 To 5
frm2.txtValoare.Text = Math.Round(Rnd() * 1000)
MsgBox("next")
frm2.cmdAdd_Click(frm2.cmdAdd, New EventArgs())
MsgBox("next")
Next
For i = 0 To 5
frm2.lstStanga.SelectedIndex = 0
MsgBox("next")
frm2.cmdSelect_Click(frm2.cmdSelect, New EventArgs())
MsgBox("next")
Next
'sortare:
MsgBox("next")
frm2.radAscendent.Checked = True
MsgBox("next")
frm2.cmdSort_Click(frm2.cmdSort, New EventArgs())
MsgBox("next")
frm1.Activate()
MsgBox("next")
frm1.radDescendent.Checked = True
MsgBox("next")
frm1.cmdSort_Click(frm2.cmdSort, New EventArgs())

End Sub
End Class

Not. Pentru mai multe detalii legate de construirea interfeelor grafice, vezi
bibliografia furnizat la curs

4.3. Acces la baze de date din VB


n decursul timpului, Microsoft a dezvoltat mai multe tehnologii pentru a conecta o
aplicaie scris ntr-un limbaj de programare, precum VisualBasic, la o surs de date
extern. Iniial, cea mai popular astfel de tehnologie a fost: Data Access Objects
(DAO) - dedicat n exclusivitate accesului la baze de date Access (Jet). La un moment
dat, Microsoft a dezvoltat un o interfa de nivel intermediar - Remote Data Objects
(RDO) pentru manipularea datelor altor SGBD-uri relaionale, care nu se aflau pe
aceeai staie de lucru. Cu alte cuvinte, RDO asigur n plus nivelul de transport al
datelor prin reea, ntre server i aplicaia client. Aceast nou interfa nu este
destinat utilizrii directe de ctre dezvoltatorii de aplicaii ci se constituie ca un nivel
de mijloc ntre DAO i bazele de date relaionale.

19

n ultima vreme, un nou standard a fost impus ca fiind cea mai eficient modalitate
de acces la orice tip de surs de date extern (relaional i non-relaional):
Universal Data Access (UDA). Prin aceast nou abordare, dezvoltatorul de aplicaii
are la dispoziie un set predefinit de funcii specifice pe care le utilizeaz indiferent de
tipul sursei de date pe care dorete s o acceseze (FoxPro, Oracle, Access, Excel,
etc). Mai mult, UDA este un ansamblu de instrumente software independent de
limbaj, astfel c aceleai funcii specifice vor fi utilizate att de programatorii VB ct i
C#, .NET, etc.
n prezent standardul UDA este implementat de urmtoarele tehnologii (acestea
mpreun formeaz UDA) (vezi i figura 4-2):

Interfee de conectare cu surse de date externe (stratul middleware) - destinate


interconectrii ntre mediile de execuie a aplicaiilor i sursele de date externe
o ODBC Open Database Connectivity un standard middleware pentru
acces la baze de date relaionale;
o OLE-DB Object Linking and Embedding DB

- ultima generaie de

standard middleware pentru acces la orice surs de date, nu neaprat


relaional (XML, Text, Video, etc)

Interfee de nivel nalt, destinate utilizrii n scrierea aplicaiilor pentru utilizatorii


finali
o ActiveX Data Objects (ADO) o interfa software de nivel nalt, utilizat
de obicei n mod direct de ctre majoritatea dezvoltatorilor, ce furnizeaz
toate funciile necesare manipulrii datelor, din orice surs de date, pentru
aplicaii scrise ntr-un limbaj pre - .NET
o ADO .NET - acelai concept rescris pentru noua platform .NET ;
Figura 4-2 Tehnologii Microsoft pentru acces la surse de date externe (sursa - http://msdn.microsoft.com)

4.3.1.

Standarde de comunicare cu surse de date (stratul middleware)

ODBC
Open DataBase Connectivity constituie o interfa software al crei scop este acela
de a furniza o modalitate standardizat de acces la orice surs de date ce se
conformeaz modelului relaional, indiferent de furnizorul SGBD-ului (IBM-DB2, Oracle,
SQL-Server, FoxPro, Access, etc.). ODBC este un standard neutru (independent de un
anumit productor).
Pentru a furniza o modalitate standardizat de acces la date n diverse formate,
ODBC introduce un nivel-aplicaie intermediar, numit driver al bazei de date, ntre
aplicaia client i motorul bazei de date. Un driver este n esen un set de programe
dezvoltat de un furnizor de SGBD, set de programe care se conformeaz unui standard
(n cazul de fa ODBC) i al crui scop este:

20

de a asigura traducerea comenzilor de interogare/actualizare disponibile la


nivelul aplicaiei client n comenzi similare pentru SGBD-ul respectiv (comenzi
pe care acesta din urm le nelege);

de a returna rezultatul interogrilor (datele extrase) ntr-un format standard,


prin care s se ofere posibilitatea aplicaiei client de a le prelucra.

Caracteristicile generale ale ODBC sunt:


-

eficien sporit;

dificultate n scrierea codului

cerine de resurse (memorie, CPU) rezonabile

compatibilitate cu tehnologiile de daze de date existente

portabilitate la nivelul sistemelor de operare

Esenial de remarcat este faptul c ODBC se adreseaz aproape n exclusivitate


accesului la date stocate n baze de date relaionale, orice alt format de stocare fiind
complicat de gestionat prin intermediul ODBC.
La nivel arhitectural, ODBC are la baz patru componente:

Application programming interface (API) set de funcii (programe) la care au


acces aplicaiile client i care sunt utilizate de pentru a invoca funciile
interne ODBC n urmtoarele scopuri:
o Stabilirea unei conexiuni la baza de date
o Preluarea unui set de date din sursa de date
o Trimiterea spre executie a unor comenzi de actualizare a datelor
o

nchiderea conexiunii

Gestionar de drivere (Driver manager) furnizeaz informaii ctre aplicaia


client cu privire la lista de surse de date disponibile i ncarc driverele n
mod dinamic pe msur ce sunt necesare unei aplicaii sau alteia

Driver - este componenta furnizat n mod specific de proprietarul SGBD-ului


i care ndeplinete urmtoarele funcii:
o proceseaz efectiv apelurile aplicaiei client ctre funciile ODBC;
o i revine n exclusivitate sarcina de a gestiona schimburile de date ntre
aplicaia-client i baza de date ;
o dac este necesar, asigur translaia comenzilor SQL standard n SQL
nativ (specific) pentru sistemul respectiv de gestiune a BD

Sursa de date (data source) - cuprinde datele intrinseci i motorul de gestiune


a bazei de date asociat
Figura 4-3 Arhitectura ODBC

Aspectul fundamental ce trebuie reinut n legtur cu ODBC se refer la faptul c


dezvoltatorii de aplicaii vor utiliza acelai set de funcii furnizate de ODBC-API,
indiferent de SGBD-ul la care se conecteaz. Ca urmare, dezvoltatorii nu vor fi nevoii

21

s nvee comenzi SQL specifice fiecrui SGBD (dei SQL este n sine un standard,
majoritatea productorilor de SGBD-uri implementeaz i extensii proprii), funciunea
de translaie SQL standardSQL proprietar fiind asigurat de driver.
OLEDB
Din capul locului ODBC nu a fost conceput pentru a oferi un mecanism de conectare
la surse de date non-RDMBS (Relational Database management Systems), dei exist
drivere non-relaionale. Tocmai din acest motiv s-a simit nevoia dezvoltrii unui alt
mecanism.
OLE

DB este

tehnologia

actual

recomandat

de Microsoft

pentru

conectarea unei aplicaii la diverse surse de date (fiieree text, Excel, baze de
date relaionale, etc.) prin intermediul unei interfee software standard denumit
generic COM (Component Object Model)
OLE DB utilizeaz termenul providers pentru a defini acel middleware (setul de
programe ce gestioneaz specificul comunicaiei ntre dou sisteme eterogene)
corespunztor diverelor ODBC i care conine instruciunile necesare pentru a
comunica cu un anumit de depozit de date. Programatorii aplicaiilor front-end trebuie
s-i procure acest pachet software nainte de a putea realiza o conexiune la sursa de
date.

Figura: OLE DB ofer o interfa standard pentru conectare la surse de date diverse (nu doar la baze de date
relaionale)

Paii pe care o aplicaie i va parcurge pentru a manipula datele unei


surse de date externe
n general, pentru a lucra cu baze de date prin ODBC, o aplicaie va parcurge
urmtorii pai:
1. Alocarea unei conexiuni - se aloc spaiu de memorie pentru datele specifice
conexiunii
2. Conectare se specific informaiile de identificare a sursei de date i
autentificare (nume utilizator, parola)
3. Alocarea frazei SQL fraza SQL se asociaz unei conexiuni. Pot fi asociate mai
multe fraze SQL cu o coenxiune dar numai una este cea activ la un moment
dat
4. Execuia frazei SQL este faza de procesare a frazei SQL :
a. Fraza este trimis driver-ului
b. Driver-ul o convertete n SQL nativ SGBD-ului (eventual) i o trimite
motorului BD pentru execuie
c. Motorul BD execut fraza SQL i returneaz rezultatul
d. Driver-ul preia datele-rezultat, le convertete (eventual) pentru a fi
inteligibile aplicaiei-client, i le trimite aplicaiei-client

22

5. Prelucrarea setului de rezultate aplicaie client preia de la driver rezultatele i


le utilizeaz n mod specific;
6.

Eliberarea

conexiunii

(dealocarea

frazei

SQL)

aplicaia-client

distruge

elementele de asociere fraz-conexiune. n acest moment se poate aloca o nou


fraz SQL respectivei conexiuni;
7. Deconectarea presupune tergerea informaiilor de conectare de la nivelul
conexiunii;
8. Dealocarea conexiunii eliberarea spaiului de memorie utilizat de conexiune;

4.3.2.

ActiveX Data Objects .NET

Dup cum precizam i ceva mai devreme, ADO reprezint o interfa de nivel nalt
destinat utilizrii directe de ctre dezvoltatorii de aplicaii ce implic acces la date
stocate n surse externe.
ADO furnizeaz un model logic obiectual suficient de flexibil pentru a interoga i
actualiza datele rezidente n surse externe. Accesul la date se realizeaz prin
intermediul interfeei software OLE DB dar acest nivel de mijloc este total transparent
pentru programator. Ca urmare, programatorii nu trebuie dect s neleag filozofia i
funcionalitatea interfeei ADO pentru a dezvolta aplicaii robuste ce necesit acces la
baze de date.
Iat o parte din vasta funcionalitate a acestei tehnologii:

Interogarea unei baze de date, utiliznd SQL, i afiarea rezultatului;

Crearea i reutilizarea comenzilor SQL parametrizate;

Crearea dinamic a unei structuri tabelare flexibile, denumit Recodset,


pentru a manipula datele extrase din BD;

Furnizarea unui mecanism pentru a grupa actualizrile sensibile n tranzacii


distincte;

Conectarea atributelor unei tabele la controale grafice;

Filtrarea i sortarea dinamic (pe baza unor parametri furnizai la runtime) a


copiilor locale ale datelor extrase din BD

Actualizarea nregistrrilor tabelelor din baza de date;

Crearea obiectelor n baza de date;

Lansarea n execuie a procedurilor stocate n baza de date;

Extragerea informaiilor dintr-un fiier stocat pe Internet;

Manipularea mesajelor i structurilor de stocare ntr-un sistem e-mail;

Slavarea datelor extrase dintr-o baz de date ntr-un alt format: spre exemplu
fiier XML (eXtendedMarkupLanguage);

23

Pentru a oferi o asemenea flexibilitate, ADO furnizeaz o larg varietate de opiuni


de setare i funcii specifice. De aceea este important a se urmri o abordare
metodic pentru a identifica modalitatea de utilizare a ADO n aplicaiile proprii.
Modelul Obiectual ADO .NET
Tehnic vorbind, interfaa ADO se constituie dintr-un set de clase predefinite fiecare
specializat pentru o anumit operaie: realizarea conexiunii cu sursa de date,
execuia unei comenzi (SQL sau non-SQL) pe serverul BD, manipularea datelor din
sursa de date, tratarea erorilor. Figura 4-5 prezint ansamblul celor mai utilizate
dintre aceste clase, i dependenele dintre ele, iar tabelul 4-1 descrie succint
funcionalitatea (scopul) fiecreia.
Ca urmare, la nivelul aplicaiei-client, dezvoltatorul nu va trebui dect s
manipuleze n mod corespunztor obiecte din aceste clase pentru a-i asigura accesul
la date precum i prelucrarea acestora.
Clasa
Connection
obiect

Transaction

Command
obiect

DataReader

DataAdapter

Descriere
Un obiect din aceast clas reprezint o sesiune distinct
(conexiune)
ctre
sursa
de
date.
Prin
intermediul
proprietilor(atributelor) i metodelor acestei clase se specific
informaiile de conectare (localizarea sursei de date, nume de
utilizator, parol, etc.). Tot la acest nivel sunt furnizate i metode
pentru a iniializa un obiect pentru gestionarea tranzaciilor

Obiect ce furnizeaz metode pentru delimitarea tranzaciilor


(momentul de la care ncepe o nou tranzacie) i metode pentru
commit/rollback
(permanentizarea/anularea
modificrilor
efectuate asupra datelor din baza de date n cadrul tranzaciei
respective).

ncapsuleaz (conine intern) comenzi exprimate n limbajul


specific sursei de date (n cazul bazelor de date, comenzi SQL)
Prin intermediul unui obiect din acest clas se definesc
comenzi ce vor fi trimise sursei de date spre execuie ( SQL DML
(Select/Update/Delete/Insert) sau DDL (Create, Alter) ). Tot cu
ajutorul unui obiect de acest tip se pot executa proceduri
stocate.
Obiect ce permite obinerea unui set de date ce poate fi
parcurs doar ntr-un sisngur sens i este read-only (nu permite
modificri). Pentru c ofer o performan ridicat d.p.d.val
vitezei de ncrcare a datelor, este recomandat pentru cazurile
n care se dorete doar afiarea datelor
Realizeaz o punte de comunicare ntre sursa de date i setul
de date obinut local. Un obiect de acest tip va fi utilizat att
pentru obinerea i ncrcarea cu date a unuia sau mai multor
obiecte DataSet ct i pentru actualizarea sursei de date externe
cu datele modificate din obiectul DataSet manipulat local.
DataAdapter poate conine maxim 4 obiecte
Command
(pentru
extragere/modificare/tergere/adugare
date)
i
utilizeaz aceste obiecte atunci cnd aplicaia solicit ncrcarea

24

unui DataSet ori salvarea modificrilor din DataSet n sursa de


date.
Un obiect Dataset reprezint (ncapsuleaz) seturi de
nregistrri obinute n urma execuiei unor comenzi Select-SQL
sau adugate de aplicaie prin secvene de cod specifice (vor
deveni noi nregistrri n sursa de date). Exist posibilitatea ca
obiectul DataSet s conin nregistrrile obinute n urma mai
multor comenzi Select-SQL. Ca urmare, setul de date aferent
fiecrei comenzi Select-SQL va fi reprezentat sub forma unui
obiect DataTable

DataSet

DataTable

DataRow
DataColumn
Parameters
colecie

Conine setul de date aferent unei singure comenzi SQLSelect. Setul de date este reprezentat intern sub forma unor
colecii (obiecte Collection vezi partea 1 a cursului) de obiecte
de tip DataRow (DataRowCollection) i DataColumn
(DataColumnCollection)
Conine o colecie cu toate datele aferente unei singure
nregistrri.
Conine o colecie cu informaii despre fiecare atribut obinut
n urma unei interogri SQL (denumire, tip, dac este cheie
primar, etc)
Utilizat n cazul comenzilor SQL parametrizate. Conine
parametrii (obiecte de tip Parameter) asociai unei comenzi
(obiect Command).

Primul Test ADO.NET structura general a unui program ce manipuleaz


date din surse externe
Exemplele ce urmeaz vor avea drept surs de date o baz de date relaional
(MSAccess, PostgreSQL, Oracle, SQLServer, etc) cu dou tabele: Produse i Depozite
(vezi figura urmtoare)
Figura 4-5 bis - Date pentru teste

n general, pentru a utiliza surse de date externe, o aplicaie VB parcurge urmtorii


pai:
1. instaniaz clasa OleDBConnection i utilizeaz metodele obiectului obinut
pentru a furniza informaiile de conectare i a deschide conexiunea cu sursa
de date
2. efectueaz operaiuni de citire/actualizare date
o instaniaz clasa OleDbDataAdapter i OleDbDataSet, acest din
urm obiect fiind utilizat pentru citirea datelor, dup ce obiectul
OleDbDataAdapter ncarc datele n DataSet
o pentru citirea datelor se utilizeaz colecia DataRowsCollection
coninut de obiectul DataSet
o pentru actualizarea datelor se poate utiliza:
obiectul DataSet, asupra cruia se efectueaz operaiuni de
adugare/modificare/tergere nregistrri i, apoi, se utilizeaz
obiectul DataAdapter pentru a trimite modificrile n sursa de
date
un obiect OleDbCOmmand pentru a executa direct fraze SQL
Insert/Update/Delete n sursa de date

25

3. nchide conexiunea cu sursa de date atunci cnd nu mai sunt necesare


operaii de acces la date
Un prim exemplu va consta n extragerea i afiarea datelor pentru Produsele din
categoria A .
Not. Structura bazei de date este cea din figura 4-5
Iat codul surs VisualBasic .NET:
Listing 4-2 Afiarea nregistrrilor tabelei Personal prin intermediul ADO
Module TesteAccessDB
'variabila publica ce contine calea URL catre baza de date Access
Public AccessDBPath = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=
D:\DOT_NET\laboratoare\BD\db1.mdb"
'o functie-utilitar pentru obtinerea obiectului Connection si deschiderea conexiunii
Function getConexiune() As OleDb.OleDbConnection
Dim conexiune As OleDb.OleDbConnection
conexiune = New OleDb.OleDbConnection(AccessDBPath)
conexiune.Open()
Return conexiune
End Function
Sub primulTestADO()
Dim i As Integer
Dim conn As OleDb.OleDbConnection
Dim dataAdapter As OleDb.OleDbDataAdapter
Dim dataSetProduse As DataSet
deschid conexiunea vezi functia de mai sus
conn = getConexiune()
'construiesc obiectul dataAdapter
dataAdapter = New OleDb.OleDbDataAdapter("Select * FROM produse where
categorie=A order by denumire", conn)
dataSetProduse = New DataSet
'executa SQL si populeaza dataSet-ul
dataAdapter.Fill(dataSetProduse)
'parcuge dataSet-ul si afiseaza informatiile
Console.Clear()
For i = 0 To dataSetProduse.Tables(0).Rows.Count - 1
Console.WriteLine( _
dataSetProduse.Tables(0).Rows(i).Item("codProdus") & "/ " & _
dataSetProduse.Tables(0).Rows(i).Item("denumire") & "/ " & _
dataSetProduse.Tables(0).Rows(i).Item("categorie") _
)
Next
inchide conexiunea ! obligatoriu
Conn.close()
End Sub
End MOdule

Iat i rezulatul execuiei procedurii, obinut n fereastra Output

26

Actualizarea Datelor
Exist dou variante de lucru pentru actualizarea datelor din surse externe prin
intermediul componentelor ADO .NET:
1. Utilizarea unor obiecte Command (fie OledbCommand, fie OdbcCommand in
functie

de

tehnologia

middleware

de

conectare)

pentru

frazele

SQL

Insert/Update/Delete. n aceast variant, se pot construi :


a. Obiecte Command diferite (cte unul pentru update/insert/delete)
pentru fiecare tabel ce va fi actualizat ;
b. un singur obiect Command pentru care proprietatea commandText se
modific n mod dinamic.
2. utilizarea obiectelor DataSet i DataAdapter
Varianta 1- Actualizarea datelor prin intermediul obiectelor Command
(fraze SQL executate direct pe sursa de date)
n aceast variant se obine ct un obiect Command pentru fiecare fiecare fraz
SQL i se invoc metoda ExecuteNonQuery(). n acest caz, String-ul ce corespunde
frazei SQL se construiete n mod dinamic prin concatenarea prilor statice
(precum insert into <numetabela> values ( ) cu datele corespunztoare fiecrei
operaii.
Sub actualizari_2()
Dim cmd As OleDb.OleDbCommand, conn As OleDb.OleDbConnection
Dim codprod, pret As Double
Dim den, cat As String, data As Date
conn = getConexiune()' vezi functia in listingurile anterioare
' o noua inregistrare:
codprod = 105
den = "produs 105"
pret = 225
cat = "B"
data = #10/25/2005#
cmd = New OleDb.OleDbCommand("insert into produse values ( " & _
codprod & ", '" & den & "'," & pret & ", '" & cat & "'," & data & ")", conn)
'un mesaj cu fraza SQL generata. (doar pentru testare )
MsgBox(cmd.CommandText)
'executia frazei sql Insert pe sursa de date:
Try
cmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox("Eroare la inserarea inregistrarii -" & ex.Message)
End Try
' modificarea noii inregistrari direct in baza de date
codprod = 105
den = "produs 105 modificat"
data = #10/24/2005#
cmd = New OleDb.OleDbCommand("update produse set " & _
"denumire='" & den & "', dataintrare=" & data & "where codprodus=" &
codprod, conn)
MsgBox(cmd.CommandText)
'executia frazei sql Update pe sursa de date:

27
Try

cmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox("Eroare la modificarea datelor:" & ex.Message)
End Try

conn)

'stergerea unei inregistrari


codprod = 101
cmd = New OleDb.OleDbCommand("delete from produse where codprodus=" & codprod,
Try

cmd.ExecuteNonQuery()
Catch ex As Exception
MsgBox("Eroare la stergerea inregistrarii:" & ex.Message)
End Try
conn.Close()
End Sub

Varianta 2 Actualizarea datelor prin intermediul obiectului DataSet


n acest caz:
1. se obine un obiect DataAdapter, n mod similar situaiei de citire a datelor
(descris n paragraful anterior) . n aceast faz, din cele 4 obiecte
Command asociate (vezi figura 4-4) doar SelectCommand este iniializat
(cu fraza Select SQL utilizat pa construirea obiectului)
2. pentru

iniializa

celelalte

obiecte

interne

Command

(Insert/Update/Delete), se utilizeaz un obiect CommandBuilder.


acestuia

este

acela

de

genera

frazele

SQL

Rolul

Insert/Update/Delete

corespunztoare pentru a actualiza tabela specificat n fraza Select SQL la


construirea obiectului DataAdapter .
3. se actualizeaz obiectul DataSet prin actualizarea coleciei interne Rows ce
conine

obiecte

DataRow.

Actualizarea

presupune

modificarea

datelor/adugarea/tergerea/ unuia sau mai multor obiecte DataRow.


Sub Actualizari_1()
'o varianta posibila dar nerecomandata Dim conn As OleDb.OleDbConnection
Dim
Dim
Dim
Dim

dataAdapter As OleDb.OleDbDataAdapter
dataSetProduse As DataSet
nrlinie, i As Integer
builder As OleDb.OleDbCommandBuilder

conn = getConexiune()

dataAdapter = New OleDb.OleDbDataAdapter("Select * FROM produse order by


denumire", conn)
'construieste automat frazele SQL Insert/Update/Delete corespunzatoare
builder = New OleDb.OleDbCommandBuilder(dataAdapter)
'asociaza obiectele OledbCommand generate cu obiectul dataAdapter
dataAdapter.UpdateCommand = builder.GetUpdateCommand

28
dataAdapter.InsertCommand = builder.GetInsertCommand
dataAdapter.DeleteCommand = builder.GetDeleteCommand

dataSetProduse = New DataSet


'incarca obiectul DataSet cu datele returnate de fraza sql si atribuie un alias
dataAdapter.Fill(dataSetProduse, "Produse")
'adaugarea unei noi inregistrari:
Dim objLinieNoua As DataRow
objLinieNoua = dataSetProduse.Tables("Produse").NewRow()
objLinieNoua.Item("codProdus") = 104
objLinieNoua.Item("denumire") = "produs nou 104"
objLinieNoua.Item("pret") = 52.25
objLinieNoua.Item("categorie") = "A"
objLinieNoua.Item("dataintrare") = #10/23/2006#
'adauga noul obiect in lista de linii
dataSetProduse.Tables("Produse").Rows.Add(objLinieNoua)
' modificarea unora din datele ce corespund primei inregistrari
nrlinie = 0
dataSetProduse.Tables("Produse").Rows(nrlinie).Item("denumire") = "produs 101 cat"
dataSetProduse.Tables("Produse").Rows(nrlinie).Item("pret") = 25.65
dataSetProduse.Tables("Produse").Rows(nrlinie).Item("categorie") = "B"
dataSetProduse.Tables("Produse").Rows(nrlinie).Item("dataintrare") = #10/25/2006#
'stergerea celei de-a doua inregistrari:
nrlinie = 1
dataSetProduse.Tables("Produse").Rows(nrlinie).Delete()
Try
'transmiterea modificarilor efectuate(insert/update/delete) in baza de date:
dataAdapter.Update(dataSetProduse, "Produse")
' tranzactie.Commit()
Catch ex As Exception
MsgBox("Eroare la salvarea datelor:" & ex.Message)
End Try
'reincarcarea si afisarea datelor dupa modificare:
dataSetProduse.Clear()
dataAdapter.Fill(dataSetProduse, "produse")
For i = 0 To dataSetProduse.Tables(0).Rows.Count - 1
Console.WriteLine( _
dataSetProduse.Tables(0).Rows(i).Item("codProdus") & "/ " & _
dataSetProduse.Tables(0).Rows(i).Item("denumire") & "/ " & _
dataSetProduse.Tables(0).Rows(i).Item("categorie") _
)
Next
'in final, inchiderea conexiunii
conn.Close()
End Sub

29

Actualizarea datelor prin fraze SQL parametrizate


Cea mai facil i utilizat variant de actualizare a datelor utilizeaz obiecte
Command i obiecte Parameter, astfel:
1. se definesc frazele SQL de aa manier nct, acolo unde vor apare, ulterior (la
execuie), valori introduse de utilizator, se scrie un nume de variabil, precedat de
semnul @. Semnul @ are rolul de a delimita textul static al frazei SQL (insert
into...) de prile care vor prelua datele reale ce trebuie modificate. Spre exemplu,
trei fraze SQL parametrizate pentru actualizarea tabelei Produse pot fi scrise astfel:
"insert into produse values (@cod,@den,@pret,@categ,@data)"
"update produse set
codprodus=@newcod,denumire=@den,pret=@pret,categorie=@categ,dataintrare=@data where
codprodus=@oldcod"
"delete from produse where codprodus=@cod"

IMPORTANT : Fiecare semn @ definete un parametru. nainte ca fraza respectiv


s fie executat efectiv de motorul bazei de date, acel parametru va trebui s
primeasc o valoare
2. frazele SQL astfel definite se utilizeaz la iniializarea unui obiect Command:
Dim
cmd
As
New
OleDb.OleDbCommand(insert
(@cod,@den,@pret,@categ,@data), conn)

into

produse

values

3. PENTRU FIECARE PARAMETRU se definete cte un obiect Parameter, obiect ce


va conine valoarea acelui parametru. Iat modul de definire a doi parametri
pentru codul produslui (valoarea 1556) si denumirea acestuia (valoarea produs
test):
Dim paramCod As
paramCod = New
Dim paramDen As
paramDen = New

OleDb.OleDbParameter
OleDb.OleDbParameter("cod", 1556)
OleDb.OleDbParameter
OleDb.OleDbParameter("den", produs test)

primul argument al contructorului corespunde denumirii parametrului cod,


den se observ c n acest caz NU se utilizeaz semnul @

al doilea reprezint valoarea i trebuie s corespund restriciilor atributului,


din tabela surs, la care se refer. Principalele restricii sunt:
o tipul tipul valorii trebuie s corespund tipului atributului din tabel
(Integer/Double pentru numere, String, Date etc.);
o lungimea valoarea nu trebuie s depeasc lungimea maxim
definit pentru atributul tabelei;

4. obiectele Prameter obinute anterior se adaug n colecia parameters a obiectului


Command. Astfel, pentru exemplu de mai sus:

30

cmd.Parameters.Add(paramCod)
cmd.Parameters.Add(paramDen)

'corespunde parametrului @cod


'corespunde parametrului @den

5. dup adugarea valorilor poarametrilor, fraza SQL poate fiu executat, prin
intermediul metodei excuteNonQuery() a obiectului Command. Metoda va returna
numrul de nregistrri afectate sau valoarea 0 dac nu a fost actualizat nici o
nregistrare
EXEMPLU
n listingul de mai jos sunt prezentate trei proceduri pentru actualizarea tabelei
Produse (insert/update/delete). Fiecare procedur definete un numr corespunztor
de parametri cu numrul parametrilor din fraza SQL aferent.
Not. Se observ c String-urile ce reprezint frazele SQL sunt definite ca i varibile
publice globale (la nivel de modul) pentru a fi accesibile oricrei proceduri de
actualizare a datelor
Module TesteActualizariParametrizate
Public AccessOLEDBConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data
Source=D:\cretzanu\Cursuri_laboratoare\Programare_an3\DOT_NET\laboratoare\BD\db1.mdb"
Public PQSQLODBCConnString =
"DRIVER={PostgreSQL};SERVER=localhost;port=5432;DATABASE=BDSTUD;UID=test;PWD=test;"
'variabile publice pentru frazele SQL aferente tabelei Produse

Public SQLInsertProduse As String = "insert into produse values (@cod,@den,@pret,@categ,@data)"


Public SQLUpdateProduse As String = "update produse set
codprodus=@newcod,denumire=@den,pret=@pret,categorie=@categ,dataintrare=@data where codprodus=@oldcod"
Public SQLDeleteProduse As String = "delete from produse where codprodus=@cod"

Function getConexiune() As OleDb.OleDbConnection


Dim conexiune As OleDb.OleDbConnection
conexiune = New OleDb.OleDbConnection(AccessOLEDBConnString)
conexiune.Open()
Return conexiune
End Function
Sub adaugaProdus(ByVal codProdus As Integer, _
ByVal denumire As String, ByVal pret As Double, _
ByVal categorie As String, ByVal dataintrare As Date)
Dim conn As OleDb.OleDbConnection = getConexiune()
Dim cmd As New OleDb.OleDbCommand(SQLInsertProduse, conn)
Dim param As OleDb.OleDbParameter
param = New OleDb.OleDbParameter("cod", codProdus)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("den", denumire)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("pret", pret)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("categ", categorie)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("datai", dataintrare)

31
cmd.Parameters.Add(param)
Try
cmd.ExecuteNonQuery()
MsgBox("operatie realizata cu succes!")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Eroare")
End Try
conn.Close()
End Sub
Sub modificaProdus(ByVal newcodProdus As Integer, ByVal oldCOdProdus As Integer, _
ByVal denumire As String, ByVal pret As Double, _
ByVal categorie As String, ByVal dataintrare As Date)
Dim nrRowsUpdated As Integer
Dim conn As OleDb.OleDbConnection = getConexiune()
Dim cmd As New OleDb.OleDbCommand(SQLUpdateProduse, conn)
Dim param As OleDb.OleDbParameter
param = New OleDb.OleDbParameter("cod", newcodProdus)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("den", denumire)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("pret", pret)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("categ", categorie)
cmd.Parameters.Add(param)
param = New OleDb.OleDbParameter("datai", dataintrare)
cmd.Parameters.Add(param)
'parametrul din clauza where a frazei sql-update
param = New OleDb.OleDbParameter("oldcod", oldCOdProdus)
cmd.Parameters.Add(param)
Try
nrRowsUpdated = cmd.ExecuteNonQuery()
If nrRowsUpdated = 0 Then
MsgBox("NU EXISTA UN PRODUS cu acest cod:" & oldCOdProdus)
Else
MsgBox("operatie realizata cu succes!")
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Eroare")
End Try
conn.Close()
End Sub
Sub stergeProdus(ByVal codprodus As Integer)
Dim conn As OleDb.OleDbConnection = getConexiune()
Dim cmd As New OleDb.OleDbCommand(SQLDeleteProduse, conn)
Dim param As OleDb.OleDbParameter
param = New OleDb.OleDbParameter("cod", codprodus)
cmd.Parameters.Add(param)
Try
cmd.ExecuteNonQuery()
MsgBox("operatie realizata cu succes!")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Eroare")
End Try
conn.Close()
End Sub
End Module

32

Scurt test al procedurilor:


CALL
CALL
CALL

TesteActualizariParametrizate.adaugaProdus(585,"test A",203,"B",#05/05/2006#)
TesteActualizariParametrizate.modificaProdus(585,586,"test A",203,"A",#05/05/2006#)
TesteActualizariParametrizate.stergeProdus(586)

Managementul tranzaciilor
Sub test_tranzactii()
Dim conn As OleDb.OleDbConnection = getConexiune()
Dim tranzactie As OleDb.OleDbTransaction
conn = getConexiune()
'obiectele tranzactie se obtin cu metoda obiectului Connection
tranzactie = conn.BeginTransaction
Dim cmd As New OleDb.OleDbCommand("update produse set denumire = 'test' where
codprodus=585", conn)
'se ataseaza tranzactia la obiectul command:
cmd.Transaction = tranzactie
cmd.ExecuteNonQuery()
cmd.CommandText = "update produse set pret =0 where codprodus=585"
cmd.ExecuteNonQuery()
'comite - ambele modificari vor deveni permanente
tranzactie.Commit()
'sau rollback - toate modificarile efectuate in acea tranzactie vor fi anulate:
' tranzactie.Rollback()
conn.Close()
End Sub