SPECIALIZAREA TEHNICI INFORMATICE Î N INGINERIA ELECTRICĂ LUCRARE DE DISERTAȚ IE Coordonator științ ific: Conf. Dr. Ionel MUSCALAGIU Absolvent:… [607308]
UNIVERSITATEA POLITEHNICA TIMIȘOARA
FACULTATEA DE INGINERIE HUNEDOARA
DEPARTAMENTUL DE INGINERIE ELECTRICĂ ȘI
INFORMATICĂ INDUSTRIALĂ
SPECIALIZAREA TEHNICI INFORMATICE Î N INGINERIA
ELECTRICĂ
LUCRARE DE DISERTAȚ IE
Coordonator științ ific:
Conf. Dr. Ionel MUSCALAGIU Absolvent: [anonimizat]
2019
UNIVERSITATEA POLITEHNICA TIMIȘOARA
FACULTATEA DE INGINERIE HUNEDOARA
DEPARTAMENTUL DE INGINERIE ELECTRICĂ ȘI
INFORMATICĂ INDUSTRIALĂ
SPECIALIZAREA TEHNICI INFORMATICE ÎN INGINERIA
ELECTRICĂ
TEHNICI INFORMATICE APLICATE
LA GESTIONAREA ABONAȚILOR
UNUI FURNIZOR DE ENERGIE
ELECTRICĂ
Coordonator științ ific:
Conf. Dr. Ionel MUSCALAGIU Absolvent: [anonimizat]
2019
CUPRINS
INTRODUCERE ………………………….. ………………………….. ………………………….. ………….. 4
CAPITOLUL 1 . BAZE DE DATE MICROSOFT SQL SERVER ………………………….. …… 5
1.1. Introducere în baze de date ………………………….. ………………………….. ………….. 5
1.2. Microsoft SQL Server ………………………….. ………………………….. ………………….. 5
1.2.1. Scurtă istorie ………………………….. ………………………….. ………………………….. … 5
1.2.2. Descriere ………………………….. ………………………….. ………………………….. ……… 5
1.3. Arhitectura unei baze de date ………………………….. ………………………….. ……….. 6
1.4. Modele de date pentru baze de date – modele conceptuale ……………………….. 6
1.5. Arhiectura client/server ………………………….. ………………………….. …………………. 6
1.6. Structura fizică a bazelor de date ………………………….. ………………………….. …… 7
1.7. Normalizarea bazei de date ………………………….. ………………………….. …………… 8
1.8. SQL Server Management Studio(SSMS) ………………………….. …………………….. 9
CAPITOLUL 2 . LIMBAJUL C# ………………………….. ………………………….. ………………… 10
2.1. Introducere ………………………….. ………………………….. ………………………….. …… 10
2.2. Principiile programarii orientate obiect ………………………….. ……………………….. 10
2.3. Structura unui program C# ………………………….. ………………………….. ………….. 10
2.4. Sintaxa limbajului ………………………….. ………………………….. ……………………….. 11
2.4.1 . Comentarii ………………………….. ………………………….. ………………………….. ….. 11
2.4.2. Nume ………………………….. ………………………….. ………………………….. …………. 12
2.4.3. Constante ………………………….. ………………………….. ………………………….. …… 12
2.4.4. Variabile ………………………….. ………………………….. ………………………….. ……… 12
2.4.5. Expresii și operatori ………………………….. ………………………….. ………………….. 12
2.4.6. Conversii boxing și unboxing ………………………….. ………………………….. ……… 13
2.4.7. Conversii între numere și șiruri de caractere ………………………….. ………………………. 13
2.5. Tipuri de date ………………………….. ………………………….. ………………………….. … 14
CAPITOLUL 3. PROGRAMAREA VIZUALĂ ÎN VISUAL STUDIO …………………………. 15
3.1. Concepte de bază ale programării vizuale ………………………….. …………………. 15
3.2. Mediul de dezvoltare Visual Studio ………………………….. ………………………….. .. 16
3.2.1 . Ferestre ………………………….. ………………………….. ………………………….. ………………………….. 17
3.2.2 . Controale ………………………….. ………………………….. ………………………….. ……………………….. 19
3.3. Obiecte grafice ………………………….. ………………………….. ………………………….. 19
3.4. Validarea informațiilor de la utilizator ………………………….. …………………………. 20
CAPITOLUL 4. PROIECTAREA Ș I IMPLEMENTAREA APLICAȚIEI …………………….. 22
4.1. Analiza problemei ………………………….. ………………………….. ………………………. 22
4.2. Proiectarea bazei de date ………………………….. ………………………….. …………… 22
4.3. Realizarea interfeței aplicației ………………………….. ………………………….. ………. 23
Concluzii ………………………….. ………………………….. ………………………….. …………………. 42
Bibliografie ………………………….. ………………………….. ………………………….. ……………… 43
LUCRAREA DE DISERTAȚIE
4
INTRODUCERE
Lucrarea de față are ca scop prezentarea unei soluții informatice pentru a rezolva
o problema din domeniul ingineriei electrice și anume evidența consumului de energiei
electrică al abonațiilor unui furnizor.
Pentru a rezolva aceastră problemă s -a realiza t o aplicație informatică cu baze
de date și o interfață utilizator.
Această aplicație are o interfață utilizator cu un design moder n și de asemenea
dispune de foarte multe facilități, cum ar fi: filtrarea abonaților în funcție de județ,
căutarea abonați lor în funchție de id, nume, prenume, localitate. Aplicația conține și o
interfață cu statistici al numărului de abonați în funcție de județ.
Tehnologiile folosite la realizarea aplicației sunt printre cele ma i folosite în
industrie și anume : Microsoft S QL Server pentru proiectarea bazei de date , Microsoft
Visual Studio pentru proiectarea interfețelor utilizator , C# pentru partea de programare
și Entity Framework care este un set de tehnologii î n ADO.NET ce simplifică foarte mult
conectarea interfeței utilizator la baza de date.
Proiectul prezentat , este structurat în 4 capitole astfel încât să fie prezentate atât
elemente descriptive necesare proiectării unui astfel de minisistem informatic, dar și
elem ente specifice programării vizuale precum și câteva informații referitoare la Baze
de date Microsoft SQL Server și C#.
Capitolul 1. În primul capitol sunt prezentare câteva informații despre baze de
date, mai precis despre baze de date Microsoft SQL Server .
Capitolul 2. În acest capitol este prezentat limbajul C# alături de p rincipiile
programarii orientate obiect .
Capitolul 3. Prezintă câteva informații despre programarea vizuală precum și
mediu l de dezvoltare Microsoft Visual Studio. Sunt prezentate conceptele de bază ale
programării vizuale alături de cele mai importante controale și propietăți ale form -urilor.
Capitolul 4. Acest capitol conține explicaț ia aplica ției de evidență a consumului
de energie electr ică, realizată cu interfa ța Visual Studio și cu baza de date SQL Server .
Sunt prezentate analiza problemei împreună cu proiectarea bazei de date care con ține
tabelele și interfa ța aplica ției explicată amănun țit.
LUCRAREA DE DISERTAȚIE
5
CAPITOLUL 1
BAZE DE DATE MICROSOFT SQL SERVER
În acest capitol s -au folosit informații din [1], [5].
1.1. Introducere în baze de date
O bază de date este un instrument pentru colectarea și organizarea informațiilor.
Bazele de date pot stoca informații despre persoane, produse, comenzi sau orice
altceva. Multe baze de date încep ca o listă într -un program de procesare a textului sau
o foa ie de calcul. Pe măsură ce lista se mărește, datele încep să conțină redundanțe și
inconsistențe. Ele devin greu de înțeles sub formă de listă și există modalități limitate de
a căuta sau a extrage subseturi de date pentru revizuire. După ce încep să apară
aceste probleme, este o idee bună ca datele să fie transferate într-o bază de date
creată de un sistem de gestionare a bazelor d e date (DBMS), cum ar fi Access sau
Microsoft SQL Server.
1.2. Microsoft SQL Server
Microsoft SQL Server este un sistem de gestionare al baze lor de date relaționale
produs de compania Microsoft. Limbajul de interogare este SQL iar e xtensia folosită de
Microsoft este T -SQL.
Suportă versiunea companiei Microsoft de SQL (Structured Query Lan guage –
limbaj structurat de interogări), cel mai răspândit limbaj de interogare pentru bazele de
date. Sistemul de gestionare al bazelor de date poate fi folosit atât de firme mici și mari
cât și de utilizatori obișnuiți. Microsoft oferă mai multe tipuri de licențe în funcție de
necesități, de la licențe gratuite, până la licențe plătite. Astfel că în prezent putem spune
că SQL Server se poate folosi pentru baze de date de orice dimensiune.
1.2.1. Scurtă istorie
Codul sursă pentru Microsoft SQL Server își are or iginile în Sybase SQL Server
și a reprezentat intrarea Microsoft în industria bazelor de date, concurând cu Sybase,
Oracle și IBM . Microsoft, Sybase si Ashton -Tate s -au unit pentru a crea și a scoate pe
piață prima versiune numită SQL Server 4.2 pentru Win OS/2.
SQL Server 7.0 a fost primul server de baze de date bazat pe interfață grafică . O
variantă de SQL Server 2000 a fost prima variantă comercială pentru arhitectura Intel.
In anii următori s -au lansat și alte versiuni, ce au adus îmbunătățiri de perfo rmanță, tool –
uri IDE și ETL, suport pentru date XML, geometrice sau spațiale, căutare în text, self –
tuning, clustering și HADR: SQL Server 2005, SQL Server 2008, SQL Server 2012 și
SQL Server 2014. Ulti ma versiune este SQL Server 2019 .
1.2.2. Descriere
Microsoft SQL Server se bazează pe o variantă de SQL numită T -SQL, sau
Transact -SQL, o implementare de SQL -92 (standardul ISO pentru SQL) cu unele
extensii. SQL în principal adaugă sintaxă adițională pentru procedurile stocate și pentru
tranzacții. Standardele SQL necesită ACID; acesta est e un acronim pentru cele 4
condiții ce trebuie îndeplinite de orice tranzacție: atomicitate, consistență, izolare,
durabilitate. MS SQL Server suportă ODBC (Open Database Connectivity).
Stocarea datelor se face pe modelul relațional, sub forma unei colecț ii de tabele
cu rânduri și coloane. Fiecare coloană este de un anumit tip: SQL Server suportă atât
tipurile primare, precum întreg, zecimal, caracter, dată calendaristică, dar și tipuri mai
complexe precum text, date binare, date geometrice, date spațiale, XML, etc.
LUCRAREA DE DISERTAȚIE
6
1.3. Arhitectura unei baze de date
Datele din baza de date sunt păstrate după un model de organizare, utilizatorului
fiindu -I accesibile și vizibile acele date conform unui model . Pentru a putea fi
gestionate, datele unei b aze de date sunt descris e cu ajutorul unui limbaj specializat ce
folosește struct uri de date . Astfel se obțin mai mu lte structuri ale bazei de date.
1.4. Modele de date pentru baze de date – modele conceptuale
După cum am văzut , baza de date este descrisă conceptual de administratorul
bazei de date . Pentru aceasta, el apelează la un model de date cu ajutorul căruia
poate structura informația din lumea reală pe care dore ște să o păstreze. Modelul de
date e ste de fapt un fel de ghid pentru reprezentarea datelor. Acesta se referă doar la
structura virtuală și cea logică, nicidecum la structura fizică ( care structură fizică
depinde de sistemul de operare și de S.G.B.D. -ul folosit).
Modelul de date folosit de un SGBD descrie modul de organizare a datelor în
baza de date. Modelul de date reprezintă un tipar după care este organizată din punct
de vedere logic baza de date. Modelul de date nu specifică datele, implementarea sau
organizarea lor fizică, ci doar mod ul lor de organizare logică. După modelul folosit,
există mai multe categorii principale de SGBD -uri.
Există mai multe modele conceptuale principale folosite pentru modelarea
conceptuală a datelor, dintre acestea cele mai cunoscute fiind :
– modelul re lațional
– modelul rețea
– modelul ierarhic
– modelul obiect pe obiect.
Fiecare model captează într -un anumit fel proprietățile lumii înconjurătoare pe
care dorim să o modelăm.
1.5. Arhiectura client/server
Asistăm la promovarea arhitecturilor client/server (C/S) și în cazul bazelor de
date. Aceste a rhitecturi se fondează, în esenț ă, pe un dialog între două categorii de
entităț i, entitatea Client (c are interoghează baza de date) ș i respectiv entitatea Server
(care gestionează baza de date), dispuse într -o rețea de calculatoare.
Clientul – este entitatea care asigură interfața cu utilizatorul, lansează cereri de
executare a unor operații către o entitate server și se ocupă de punerea într -o anumită
formă a date lor primite de la server în urma executării operației.
Serverul – este entitatea care recepționează, interpretează și execută cererile
(operațiile) lansate de clienți. De asemenea, el furnizează răspunsul către client.
Cele două entități se pot găsi sub fo rmă de calculatoare diferite, sau pot conviețui
pe același calculator. În această din urmă situație, calculatorul trebuie să aibă instalat
un sistem de operare multi -proces, cele două entități menționate regăsindu -se sub
formă de procese distincte. Un clie nt poate să efectueze cereri către mai multe servere,
iar un server poate satisface cererile lansate de mau mulți clienți. Sintetic, dialogul
realizat într -un sistem client -server, se p oate reprezenta astfel (figura 1.1):
LUCRAREA DE DISERTAȚIE
7
Fig. 1.1. Sistem client -server
Un sistem client -server funcționează într -o rețea de calculatoare, calculatoarele
din rețea netrebuind să fie omogene. Din punct de vedere al adresării într -o rețea de
calculatoare, în contextul arhitecturii client/server, serverul trebuie întotdeauna să se
găsească la o singură adresă, sau la un set de adrese stabilite. Clienții pot lansa
cererile de oriunde neavând nevoie de o adresă fixă. În cazul în care adresa asociată
unui server este independentă de modul de adresare din rețeaua unde este amplasat,
acesta poate fi reamplasat practic oriunde fără a afecta procesele clienților.
În cazul în care într -o rețea de calculatoare bazată pe arhitectura C/S pot fi
conectate calculatoare eterogene, transmisiile efectuate între clienți și server sunt
codificate diferit (figura 2) fiind necesar un protocol de schimb standard pentru
codificare (la transmisie) și decodificare (la recepție). În momentul de față sunt definite
mai multe protocoale standard de schimb : XDR elaborat de firma SUN, COURRIER,
elaborat de firma XEROX, ASN1 elaborat de CCIT, etc.
Fig. 1.2. Sistem client -server
1.6. Structura fizică a bazelor de date
Deoarece bazele de date sunt în general prea mari pentru a fi stocate în
memoria internă a unui calculator ele sunt stocate în me moria externă a compu terului .
Baza de da te fizică este o colecț ie de fiș iere care implementează un anumit
model de date logice ( structura logică) . Fișierele sunt integrate de către structura
logică a bazei de date și ele pot comunica înt re ele. Baza de date este organizată sub
formă de colecții de înregistrări . Înregistrarea este unitatea de bază de transfer de
date între memoria externă și memoria internă (în care are loc prelucrarea ) . Mai mult,
pentru reducerea numărului de acce se la memoria externă, mai multe înregistrări
sunt citite sau sc rise printr -un singur acces ( se grupează mai multe înreg istrări în
blocuri ).
Fișierele care formează baza de date sunt de 2 tipuri :
• fișiere de date: acestea conțin datele efective .
LUCRAREA DE DISERTAȚIE
8
• fișere index: acestea precizează modul de acces la fi șiere (păstrează anumite
date din b. d. pentru a putea regăsi mai ușor datele ) .
Fig. 1.3. Structura bazei de date
Trebuie subliniat faptul că SGBD -ul trebuie să ofere un serviciu de acces la
structurile de date fizice . Programatorul sau utilizatorul nu trebuie să -ș bată capul
cu structura fizică , acest lucru se realizează de SGBD. împreună cu sistemul de
operare.
În funcție de organizare se d etermină operațiile necesar e pentru a găsi
înregistrările . Evident, putem avea acces direct la înregistrări sau a cces secvențial la
înregistrări . Înregistrările se pot adăuga într -o ordine oarecare fie într -o ordine sortată
în concordanță cu valorile din tr-un anumit câmp . Cel mai simplu și cel mai folosit mod
de organizare al colecției de înregi strări este fișierul secvențial . Înregistrările sunt scrise
consecutiv în f ișierul de date, în ordinea creării .
1.7. Normalizarea bazei de date
Pentru proiectar ea unei baze de date relaționale este necesar să se creează mai
întâi schema conceptuală a acesteia (folosind de obicei modelul entitate -legătură), care
este transformată apoi într -un design logic, folosind metodologia descrisă anterior. O
altă metodă poat e fi folosită, în locul acestei tehnici de modelare conceptuală, pentru
proiectarea unei baze de date relaționale. Aceasta este numită tehnica normalizării, ce
constă în adunarea informațiilor într -un tabel relațional și din din descompunerea
acestui tabel relațional în mai multe tabele care satisfac anumite reguli și care
stochează aceleași date ca și tabelul inițial.
In prezent, normalizarea se folosește pentru a rafina design -ul logic al bazei de
date rezultat în urma transformării schemei conceptuale, eliminând unele probleme care
pot apărea în urma procesului de proiectare inițial. Evident, dacă schema conceptuală
este corectă și dacă transformarea acesteia în tabele relaționale este corectă, procesul
de normalizare nu mai este necesar. Totuși, cunoaș terea acestei tehnici este necesară
pentru că este utilă la bazele mici sau ca o etapă suplimentară sau ca o tehnică rapidă
de proiectare.
După transformarea modelului entitate -legătură în tabele relaționale, în baza de
date rezultată poate exista redundan ță în date cât și anomalii de actualizare, adică
LUCRAREA DE DISERTAȚIE
9
anumite rezultate nedorite în timpul încărcării, exploatării și întreținerii bazei de date.
1.8. SQL Server Management Studio (SSMS )
Este un mediu de dezvoltare creat de Microsoft și folosit pentru gestioanrea bazelor de
date. SSMS oferă instrumente pentru configurare a, monitorizare și administrare bazelor de
date SQL Server
.
Fig. 1.3. Microsoft SQL Server Management Studio
LUCRAREA DE DISERTAȚIE
10
CAPITOLUL 2
LIMBAJUL C#
În acest capitol s -au folosit informații din [2], [3], [4].
2.1. Introducere
Limbajul C# a fost dezvoltat de către compania Microsoft. Principalii dezvoltatori
ai limbajului sunt Peter Golde, Scott Wiltamuth și Anders Hejlsberg (autorul limbajului
Turbo Pascal și membru al echipei care a dezvoltat Borland Delphi) . Prima variantă C#
larg distribuită a fost lansată de către Microsoft ca parte a platformei . NET în iulie 2000.
Din acel moment, C# s -a bucurat de o evolu ție spectaculoasă. Mii de programatori de
C, C++ și Java, au trecut cu ușurință spre C#, datorită asemănării acestor limbaje, dar
mai ales calită ților noului limbaj. La acest moment, C# și-a câ știgat și atrage în
continuare numero și adep ți, devenind printre cele mai utilizate limbaje din lume.
Numele limbajului C# a avut ca inspirație notația # (diez) din muzică, care indică
faptul că nota muzicală urmată de # este mai înaltă cu un semiton. Este asemănător cu
numele limbajului C++, unde ++ reprezintă atât incrementarea unei variabile cu
valoarea 1, dar și faptul că C++ este mai mult decât limbajul C.
C# este un limbaj ușor de înțeles , cu circa 80 de cuvinte cheie și 12 tipuri de date
predefinite. El dă posibilitatea programării structurale , modulară și ori entată obiectual,
conform perceptelor moderne ale programării profesioniste.
2.2. Principiile programă rii orientate obiect
Metodele de programare s -au modificat continuu de la apariția calculatoarelor
pentru a ține pasul cu creșterea complexităț ii programelor . La apariția primelor
calculatoare programarea se făcea introducând instructiunile masină scrise î n binar .
Odată ce programele au crescut s -a dezvoltat limbajul de asamblare, in care se puteau
gestiona programe mai mari prin utilizarea unor re prezent ări simbolice ale instructiunilor
mașină . Cum programele continuau s ă creasca, s -au introdus limbaje de nivel î nalt,
precum COBOL și FORTRAN , iar apoi s -a dezvoltat programarea structurată .
Programarea orientată pe obiecte a preluat cele mai bune idei de la programarea
structurată, combinanu -le cu noțiunile noi . A rezultat o mod alitate diferită de a organiza
un program . De regulă , un program poate fi gestionat in doua moduri : in jurul codului
(mod de lucru descris de sintagma “codul action eaza asupra datelor” , valabil în cazul
programă rii structurate) sau in jurul datelor (abordare descrisa de sintagma “datele
contro leaza accesul la cod” , valabilă în cazul programă rii orientate obiect) .
Toate limbajele de programare orientate pe obiecte au p atru caracteristici
comune, și anume polimorfismul, mostenirea , incapsularea si reutilizarea
2.3. Structura unui program C#
Majoritatea cărților de programare încep cu următorul exemplu:
1 using System;
2
3 namespace HelloWorld
4 {
5 class Program
6 {
7 static void Main()
8 {
9 Console.WriteLine( "Hello World!" );
10 }
LUCRAREA DE DISERTAȚIE
11
11 }
12 }
Acest exemplu a devenit celebru datorită cărții "The C Programming Language" scrisă
de Brian W. Kernighan și Dennis M. Ritchie, considerați "părinții" limbajului C.
linia 1: faptul că se vor folosi c lase incluse în spațiul de nume System . În exemplul
nostru, se va folosi clasa Console .
linia 3: spațiul de nume
linia 5: orice program C# este alcătuit din una sau mai multe clase
linia 7: metoda Main , numită și „punctul de intrare” în program
linia 9: clasa Console de mai sus, este folosită pentru operațiile de intrare/ieșire.
WriteLine se apelează pentru afișarea mesajului dorit pe ecran.
O aplicație C# este comupusă din una sau mai multe clase , grupate în spații de
nume (namespaces ). Este obligatoriu ca doar una din aceste clase să conțină un
„punct de intrare” (entry point ), și anume metoda (funcția) Main.
Clasa (class ), reprezintă principalul element structural și de organizare în
limbajele orientate spre obiecte, grupând date cât și funcții care prelucrează
respectivele date.
Spațiul de nume (Namespaces) : din rațiuni practice, pr ogramele mari, sunt
divizate în module, dezvoltate separat, de mai multe persoane. Din ace st motiv, există
posibilitatea de a apărea identificatori cu același nume. Pentru a evita erori fur nizate din
acest motiv, în 1955 limbajul C++ introduce noțiunea și cuvântul cheie namespace .
Fieca re mulțime de definiții dintr -o librărie sau program este g rupată într -un spațiu de
nume, existând astfel posibilitatea de a avea într-un program definiții cu nume identic,
dar situate în alte spații de nume. În cazul în care, într -o aplicație, unele clase sunt deja
definite, ele se pot folosi importând spațiile d e nume care conți n definițiile acestora. Mai
menționăm faptul că un spațiu de nume po ate conține mai multe spații de nume.
Convenție : S-a adoptat următoarea convenție de scriere: în cazul în care folosim
nume compuse din mai multe cuvinte, fiecare cuvânt este scris cu majusculă:
HelloWorld , WriteLine . Această convenție poartă numele de Convenție Pascal .
Asemănătoare este Convenția cămilă , cu diferența că primul caracter din primul
cuvânt este literă mică .
2.4.Sintaxa limbajului
Ca și limbajul C++ cu care se înrudește, limbajul C# are un al fabet format din
litere mari și mici ale alfabetului englez, cifre și alte semne. Vocabularul l imbajului este
format din acele „simboluri” cu semnificații lexicale în scrierea programelor: cuvinte
(nume ), expresii, separatori, delimitatori și comentarii.
2.4.1. Comentarii
Limbajul C# admite trei tipuri de comentarii:
comentariu pe un rând
//Acesta este un comentariu pe un singur rând
comentariu pe mai multe rânduri
/* Acesta este un
comentariu care se
intinde pe mai multe randuri */
LUCRAREA DE DISERTAȚIE
12
2.4.2. Nume
Definiție: Prin nume dat unei variabile, clase, metode etc. înțelegem o
succesiune de caractere care îndeplinește următoarele reguli:
numele trebuie să înceapă cu o literă sau cu unul dintre caracterele ” _” și
”@”;
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 caracte r (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ă.
2.4.3 Constante
În C# există două metode de declarare a constantelor: folosind const sau
folosind modificatorul readonly . Constantele declarate cu const trebuie să fie
inițializate la declararea lor.
Exemplul 1:
const int x; //gresit
const int x = 13; //corect
Constantele declarate cu ajutorul lui readonly sunt doar v ariabilele membre ale
claselor, ele putând fi inițializate doar de către constructorii claselor respective.
Exemplul 2:
readonly int x; //corect
readonly int x = 13; //corect
2.4.4. Variabile
O variabilă în C# poate să conțină fie o valoare a unui tip elementar, fie o
referință la un obiect. C# este „case sensitive”, deci face distincție între litere mari și
mici.
Exemplul 3:
int variabila;
char caracter;
2.4.5. Expresii și operatori
Definiție: Prin expresie se înțelege o secvență formată din operatori și
operanzi . Un operator este un simbol ce indică acțiunea care se efectuează, iar
operandul este valoarea asupra căreia se execută operația.
Operatorii se împart în trei categorii:
LUCRAREA DE DISERTAȚIE
13
Unari: – acționează asupra unui singur operand
Binari: – acționează între doi operanzi
Ternari: – acționează asupra a trei operanzi; există un singur operator
ternar și acesta este ?:
În C# sunt definiți mai mulți operatori. În cazul în care într -o expresie nu intervin
paranteze, operațiile se execută conform priorității operatorilor. În cazul în c are s unt mai
mulți operatori cu aceeași prioritate, evaluarea expresiei se realizează de la stânga la
dreapta. În tabelul de mai jos prioritatea descrește de la 0 la 13.
2.4.6. Conversii boxing și unboxing
Datorită faptului că în C# toate tipurile sunt derivate din clasa Object
(System. Object), prin conversiile boxing (împachetare) și unboxing (despachetare)
este permisă tratarea tipurilor valoare drept obiecte și reciproc. Prin conversia boxing a
unui tip v aloare, care se păstrează pe stivă, se produce ambalarea în interiorul unei
instanțe de tip referință, care se păstrează în memoria heap, la clasa Object . Unboxing
permite convertirea unui obiect în tipul valoare echivalent.
Exemplu 5:
Prin boxing, variabila i este asignata unui obiect ob:
int i = 13;
object ob = (object)i; //boxing explicit
sau
int i = 13;
object ob = i; //boxing implicit
În prima linie din exemplu se declară și se inițializează o variabilă de tip valoare,
care va conține valoarea 13, valoare care va fi stocată pe stivă. Linia a doua creează o
referință către un obiect alocat în heap, care va conține atât valoarea 13, cât și
informația
referitoare la tipul de dată conținut .
2.4.7. Conversii între numere și șiruri de caractere
Limbajul C# oferă posibilitatea efectuării de conversii între numere și șiruri de
caractere. Sintaxa pentru conversia număr în șir de caractere:
număr → șir “” + număr
Pentru conversia inversă, adică din șir de caractere în număr, sintaxa este:
șir → int int.Parse(șir) sau Int32.Parse(șir)
șir → long long.Parse(șir) sau Int64.Parse(șir)
șir → double double.Parse(șir) sau Double.Parse(șir)
șir → float float.Parse(șir) sau Float.Parse(șir)
Observație: În cazul în care șirul de caractere nu reprezintă un număr valid,
conversia acestui șir la număr va eșua.
2.5. Tipuri de date
În C# există două categorii de tipuri de date:
tipuri valoare
– tipul simplu predefinit: byte, char , int, float etc.
LUCRAREA DE DISERTAȚIE
14
– tipul enumerare – enum
– tipul structură – struct
tipuri referință
– tipul clasă – class
– tipul interfață – interface
– tipul delegat – delegate
– tipul tablou – array
Observație: Toate tipurile de date sunt derivate din tipul System.Object
Toate tipurile valoare sunt derivate din clasa System.ValueType , derivată la
rândul ei din clasa Object (alias pentru System.Object ).
Pentru tipurile valoare , declararea unei variabile implică și alocarea de spațiu.
Dacă inițial, variabilele conțin valoarea implicită specifică tipului, la atribuire, se face o
copie a datelor în variabila destinație care nu mai este legată de variabila inițială. Acest
proces se numește transmitere prin valoare, sau value semantics .
Spre deosebire de tipurile valoare, pentru tipurile referință , declararea unei
variabile n u implică automat alocarea de spațiu: inițial, referin_ele sunt null și trebuie
alocată explicit memorie pentru obiectele propriu -zise. În plus, la atribuire, este copiată
referința în variabila destinație, dar obiectul spre care indică rămâne același ( aliasing ).
Aceste reguli poarta denumirea de reference semantics .
LUCRAREA DE DISERTAȚIE
15
CAPITOLUL 3
PROGRAMARE A VIZUALĂ ÎN VISUAL STUDIO
În acest capitol s -au folosit informații din [1], [6], [7].
3.1. Concepte de bază ale programării vizuale
Programarea vizuală este un mod de proiectare al unui program prin folosirea
unui set de elemente grafice.
Adăugarea acestor elemente grafice are ca efect scrierea automată a unor
secvențe de program, secvențe care, împreună cu secvențele scrise vor forma
programul.
O aplicație este vizuală dacă dispune de o interfa ță grafică de utilizator sugestivă
și oferă utilizatorului instrumente specifice de utilizare ( clic, drag&drop , hint etc.)
Realizarea unei aplicații vizuale nu constă doar în desena re și aranjare de
controale, ci presupune în principal stabilirea unor decizii arhitecturale, decizii ce au la
bază unul dintre modelele arhitecturale de bază :
Modelul arhitectural orientat pe date . Acest model nu este orientat pe
obiecte, timpul de dezvoltare al unei astfe l de aplicații este foarte mic, o parte
a codul ui este generată automat de Vis ual St udio, codul nu este foarte ușor
de întreținut și este recomandat pentru aplica ții relativ mici sau cu multe
operații de acces (in/out) la o bază de date.
Modelul arhitectural Model -view -controller Este caracterizat de cele trei
concepte de bază : Model ( reprezentarea datelor se realizează într -o
manieră specifică aplicației: conține obiecte le de „business”, încapsulează
accesul la date), View (sunt utilizate elemente de interfață, este format din
Form -uri), Controller ( procesează și răspunde la evenimente iar SO, clasele
Form și Control din .Net rutează evenimentul către un „handler”, eve niment
tratat în codul din spatele Form -urilor).
Modelul arhitectural Multi -nivel
o Nivelul de prezentare( interfața) – afișează informațiile către utilizator și
stochează cele introduse de acesta
o Nivelul de logică a aplicației – se ocupa cu calcule și se lucrează cu
obiecte de tipuri definite de programator
o Nivelul de acces la date – reprezintă codul care se ocupă cu accesul
la baza de date, la fișiere și la alte servicii.
Principiile proiectării interfețelor :
Simplitatea : Interfața trebuie să fie cât mai intuitivă și ușor de învățat de către
utilizator și să permită acestuia să efectueze operațiile dorite De aceea , este
esențial colectarea de informații despre utilizatorii finali ai aplicației și a felului în
care aceștia interacționează cu aplicația .
Poziția controalelor : Într-o interfață controalele trebuie așezate astfel încât să
reflecte importanța relativă și frecvența de utilizare .
LUCRAREA DE DISERTAȚIE
16
Consistența : Ferestrele și controalele trebuie să aibă un design asemănător pe
parcursul utilizării aplicației. De aceea implementarea unui design trebuie să fie
stabilită de la început.
Estetica : Interfața trebuie să fie plăcută și atrăgătoare, de aceea se recomandă
un design cât mai modern.
3.2. Mediul de dezvoltare Visual Studio
Mediul d e dezvoltare Microsoft Visual Studio are mai multe instrumente
specializate de proiectare, ceea ce permite crea rea aplicațiilor în mod interac tiv, rapid și
ușor. Pentru a cons trui o aplicație Windows (File → New Project) se selectează ca
template Windows Application .
Fig. 3.1. Meniu New Project
O apli cație Windows conține cel puțin o fereastră de tipul Form Application în
care se poate crea o cu mai multe controale.
Pentru adăugarea componentelor vizuale se folosește modul Designer (
Shift+F7 ) de unde se poate stabili și proprietățile acestora. Cod ul “din spatele ” unei
componente se accesează folosind modul Code (F7 ).
În fereastra Solution Explorer sunt afișate toate fișierele pe care Visual Studio
le-a inclus în proiect. Form1.cs este componenta creat ă implicit de Visual Studio ca
parte a proiectului.
Fereastra Properties este utilizată pentru a vizualiza și schimba proprietățile
obiectelor.
Toolbox conține controale standard de tipul drag-and-drop ș i componente
utilizate în crearea aplicației Windows. Controalele sunt grupate în categoriile logice di n
imaginea alăturată.
LUCRAREA DE DISERTAȚIE
17
Designer , Code , Solution Explorer și celelalte se află grupate în meniul View .
La proiectarea unei noi a plicații vizuale, Visual Studio gener ează un spațiu de nume c e
conține clasa statică Program , cu metoda statică ce constituie punctul de intrare (de
lansare) a aplicației:
static void Main()
{ …
Application .Run( new Form1 ());
}
Fig. 3.2. Meniu design
Clasa Application este responsabilă cu administrarea unei aplicații Windows,
pun ând la dispoziție proprietăți pentru a obține informații despre aplica ție, metode de
lucru cu aplicația și altele. Toate metodele și pro prietățile clasei Application s unt
statice . Metoda Run invocată mai sus creează un formular implicit, aplicația
răspunzând la m esajele utilizatorului până când formularul va fi închis.
Compilarea modulelor aplicației și asamblarea lor într -un singu r fișier
”executabil” se realizează cu ajutorul opțiunilo r din meniul Build, uzuală fiin d 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 p ot 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 timp ul procesului de
depanare, sau pot fi activate din submeniul Windows al meniului Debug .
3.2.1. Ferestre
Spațiul Forms ne oferă clase specializate pentru: creare de fer estre sau
formul are (System.Windows.Forms.Form) , elemente specifice (controale ) cum ar fi
butoan e (System.Windows.Forms.Button) , casete de text
(System.Windows.Forms.TextBox) etc. Pro iectarea unei ferestre are la bază un cod
complex, generat a utomat pe măsură ce noi desemnăm componentele și
comportamentul acesteia. În fapt, aces t cod realizează: derivarea unei clase proprii din
LUCRAREA DE DISERTAȚIE
18
System.Windows.Forms.Form , clasă care este înzestrată cu o colecție de controale
(inițial vidă). Constructorul ferestrei realizază instanțieri ale claselor Button , MenuStrip ,
Timer etc. (orice plasăm noi în fereastră) și adaugă referințele acestor obiecte la
colecția de controale ale ferestrei.
Dacă modelul de fereastră reprezintă ferestra principală a apli caț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 ma rginilor, 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, Click 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 activa t 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 f ormularului d
eținut. Activarea propietarului unui formular deschis modal va determin a activarea
formularului deschis modal. Când un nou formular este activat folosind form.Show() nu
va avea nici un deținător, acesta stabilindu -se direct :
public Form Owner { get ; set ; }
F_nou form= new F_nou();
form.Owner = this ; form.Show();
Formularul deschis modal va avea un proprietar setat pe null . Deținătorul se
poate stabili setând proprietarul înainte să apelăm Form.ShowDialog() sau apelând
From.ShowDialog() cu proprietarul ca argument.
F_nou form = new F_nou();
form.ShowDialog( this );
Vizibilitatea unui formular poate fi setată folosind metodele Hide sau Show .
Pentru a ascunde un formular putem folosi :
this .Hide(); // setarea propietatii Visible indirect sau
this .Visible = false ; // setarea propietatii Visible direct
Definirea unei funcții de tratare a unui eveniment asociat controlului se realizează
prin selectarea grupului Events din ferestra Properties a controlului respectiv și alegerea
evenimentului dorit.
Dacă nu scriem nici un nume pent ru funcția de tratare, ci efect uăm dublu click în
căsuța respectivă, se generează automat un nume pentru această funcție, ținând cont
de numele controlului și de num ele evenimentului (de exemplu button1_Click ).
Dacă în Designer efectuăm dublu click pe un cont rol, se va genera automat o
funcție de tratare pentru evenimentul im plicit asociat controlului (pen tru un buton
evenimentul implicit este Click , pentru TextBox este TextChanged , pentru un formular
Load etc.).
Printre evenimentele cele mai des utilizate, se numără :
Load apare când formularul este pent ru prima data încărcat în memor ie.
FormClosed apare când formularul este închis.
FormClosing apare când formula rul se va inchide ca rezultat al acțiunii uti
lizatorului asupra butonului Close (Dacă se setează CancelEventArgs.Cancel
= True atunci se va o pri închiderea formularului).
LUCRAREA DE DISERTAȚIE
19
Activated apare pentru formularul activ.
Deactivate apare atunci când utilizatorul va da click pe alt formular al a
plicatiei.
3.2.2 . Controale
Unitatea de bază a unei interfețe Windows o reprezintă un control. Acesta poate
fi „găzduit” de un container ce poa te fi un formular sau un alt co ntrol.
Un control este o instanță a unei clase derivate din System.Win dows.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 po t fi grupate
astfel:
Controale de actiune
Controale valoare
Controale de selecție (CheckBox , RadioButton
LinkLabel
Controale pentru listare (ListBox , CheckedListBox , ComboBox ,
ImageList )
MonthCalendar
DateTimePicker
ListView
Controale container
Grupuri de controale tip
3.3. Obiecte grafice
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țiul bidimensional (exemplu: Point myPoint = new Point(1,2) ).
Point este utilizat frecvent nu numai pe ntru desene, ci și pen tru a identifica în
program 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 butonulu i (button.Location = new Point(100,
30)). Putem construi un obiect de tip Point pentru a redimensiona un alt obiect.
Size mySize = new Size(15, 100);
Point myPoint = new Point(mySize);
System.Console.WriteLine( "X: " + myPoint.X + ", Y: " + myPoint.Y);
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 permit e
instanțiere, constru ctori, destructor, moștenire.
Color myColor = Color.Brown; button1.BackColor = myColor;
Substructura FromArgb a structurii Color returnează o culoare pe baza celor trei
componente ale oricărei culori (red, green, blue) .
Clasa Graphics este o clasă sigilată reprezentând o arie rectangulară care p
ermite reprezentări grafice. De exemplu , o linie frântă se poate reali za astfel :
Point [] points = new Point [4];
LUCRAREA DE DISERTAȚIE
20
points[0] = new Point(0, 0);points[1] = new Point(0, 120);
points[2] = new Po int(20, 120);points[3] = new Point(20, 0);
Graphics g = this .CreateGraphics();
Pen pen = new Pen ( Color .Yellow, 2); g.DrawLines(pen, points);
3.4. Validarea informațiilor de la utilizator
Înainte ca informațiile de la utilizator să fie preluate și tra nsmise către alte clase,
este necesar să fie validate. Acest aspect este important, pentru a preveni posibilele
erori. Astfel, dacă utilizatorul in troduce o valoare reală ( float) când aplicația așteaptă un
întreg ( int), este posibil ca aceasta să se co mporte neprevăzut abia câteva secund e
mai târziu, și după multe apeluri de metode, fiind foarte greu de identificat cauza prima
ră a problemei.
Validarea la nivel de câmp
Datele pot fi validate pe măsură ce sunt introduse, asociind o prelucrare unuia
dintre handlerele asociate eveni mentelor la nivel de control ( Leave , Textchanged ,
MouseUp etc.)
private void textBox1_KeyUp( object sender,
System.Windows.Forms.KeeyEventArgs e) {
if (e.Alt== true ) MessageBox.Show ( "Tasta Alt e apasata" ); // sau
if (Char.IsDigit(e.KeyChar)== true ) MessageBox.Show("Ati apasat o cifra" );
}
Validarea la nivel de utilizator
În unele situații (de exemplu at unci când valorile introduse tr ebuie să se afle într –
o anumită relație între ele), validarea se face la sfârșitul intr oducerii tuturor datelor la
nivelul unui buton final sau la închiderea ferestrei de date.
private void btnValidate_Click( object sender, System.EventArgs e)
{ foreach (System.Windows.Forms.Control a in this .Controls)
{ if (a is System.Wind ows.Forms.TextBox & a.Text== "" )
{
a.Focus(); return ;
}
}
}
ErrorProvider
O manieră simplă de a semnala erori de validare este aceea de a seta un mesaj
de eroare pentru fiecare contro l.
myErrorProvider.SetError(txtName, " Numele nu are spatii in stanga" );
LUCRAREA DE DISERTAȚIE
21
Capitolul 4
PROIECTAREA Ș I IMPLEMENTAREA
APLICAȚ IEI INFORMATICE PENTRU GESTIONAREA
ABONAȚILOR UNUI FURNIZOR DE ENERGIE ELECTRICĂ
4.1. Analiza problemei
În aplica ția de fa ță s-a pus problema evidenței consumului de energie electrică al
abonaților unui furnizor de energie electrică. Se dorește realizarea unei aplicații care să
țină evidența abonaților precum și a consumului de energie electrică al acestora.
4.2. Proiectarea bazei de date
Baza de date a fost realizată cu ajutorul sistem ului de gestionare a baze lor de
date Microsoft SQL Server . Aceasta cuprinde 3 tabele : Administratori, Abonați și
Consum .
1. Tabelul ADMINISTRATORI (Fig. 4.1.) reține datele despre administratorii
care pot adauga abonați noi, de asemenea administratorii pot să gestioneze
tabelul Consum și să se conecteze în aplicație folosind un nume de utilizator
și o parolă.
Fig. 4.1. Tabel Administratori
CREATE TABLE [dbo].[Administratori] (
[Id_Admin] [int] IDENTITY (1,1) NOT NULL,
[Nume] [nvarchar] (50) NULL,
[Prenume] [nvarchar] (50) NULL,
[NumeUtilizator] [varchar] (50) NULL,
[Parola] [varchar] (50) NULL,
[Telefon] [varchar] (50) NULL,
[Email] [nvarchar] (320) NULL,
CONSTRAINT [PK_Administratori] PRIMARY KEY CLUSTERED
(
[Id_Admin] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
2. Tabelul ABONAȚI (Fig. 4.2.) reține date precum numele și prenumele
abonaților, adresa de email, telefon ul, adresa și seria contor ului
corespunzătoar fiecărui abonat.
LUCRAREA DE DISERTAȚIE
22
Fig 4.2. Tabel Abonați
CREATE TABLE [dbo].[Abonati] (
[IdAbonat] [int] IDENTITY (1,1) NOT NULL,
[Nume] [nvarchar] (50) NULL,
[Prenume] [nvarchar] (50) NULL,
[Telefon] [varchar] (50) NULL,
[Email] [nvarchar] (320) NULL,
[Judet] [nvarchar] (50) NULL,
[Localitate] [nvarchar] (50) NULL,
[Adresa] [nvarchar] (320) NULL,
[SerieContor] [int] NOT NULL,
CONSTRAINT [PK_Abonati] PRIMARY KEY CLUSTERED
(
[IdAbonat] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ,
UNIQUE NONCLUSTERED
(
[SerieContor] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
3. Tabelul CONSUM (Fig. 4.3.) reține date despre consumul abonaților . De
asemenea între tabelul Consum și tabelul Abonați exist ă o relație de legatură
de tipul unul la mai mulți . Prin intermediul câmpului SerieContor se face
legătura intre cele doua tabele. Astfel un singur abonat poate avea mai multe
intrări în tabelul Consum.
Fig. 4.3. Tabel Consum
CREATE TABLE [dbo].[Consum] (
LUCRAREA DE DISERTAȚIE
23
[IdIntrare] [int] IDENTITY (1,1) NOT NULL,
[SerieContor] [int] NULL,
[IndexVechi] [int] NULL,
[IndexNou] [int] NULL,
[Consum] [int] NULL,
[Data] [date] NULL,
CONSTRAINT [PK_Consum] PRIMARY KEY CLUSTERED
(
[IdIntrare] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Consum] WITH CHECK ADD CONSTRAINT [FK_Consum_Abonati]
FOREIGN KEY([SerieContor] )
REFERENCES [dbo].[Abonati] ([SerieContor] )
GO
ALTER TABLE [dbo].[Consum] CHECK CONSTRAINT [FK_Consum_Abonati]
GO
Mai jos se poate vedea diagrama bazei de date :
Fig. 4.4. Diagrama bazei de date
4.3. Realizarea interfeței aplicaț iei
Pentru realizarea aplicației s-a folosit mediu de dezvoltare Microsoft Visual
Studio 2017 iar ca limbaj de programare aplicația a fost scrisă în C#.
Prin urmare, s -a realizat și s -a implementat o interfață care să permită accesar ea
diverselor opț iuni ale aplicației din meniu, folosind atât mouse -ul, cât și tastatura.
LUCRAREA DE DISERTAȚIE
24
Aplicația se lansează prin următoarea fereastră de autentificare (Fig. 5.5.) :
Fig. 4.5. Fereastra de Autentificare
Aceasă interfață dispune de două câmpuri care preiau numele de utilizator și
parola, introduse de la tastatură de către utilizator. La apăsarea butonului “Login” se
realizează o interogare a bazei de date cu scopul de a vedea dacă există în baza de
date numele de utilizator și parola introduse de utilizator. Dacă în urma interogării au
fost găsite datele introduse de utilizator se va afișa meniul principal, în caz contrar, se
va afișa un mesaz de avertizare.
Codul sursă folosit pentru această fereastră este următorul:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
namespace ConsumEnergieElectrica
{
public partial class Login : MetroFramework.Forms. MetroForm
{
static Login _instance;
public static Login Instance
{
get
{
if (_instance == null)
_instance = new Login();
return _instance;
}
}
public Login()
{
InitializeComponent();
}
LUCRAREA DE DISERTAȚIE
25
//Cu ajutorul funcției următoare șirul de caractere introdus de utilizator în
câmpul parola este criptat folosind algoritmul MD5 pentru ca mai apoi sa fie
comparat cu parola criptată din baza de date.
static string Encrypt( string value)
{
using (MD5CryptoServiceProvider md5 = new
MD5CryptoServiceProvider ())
{
UTF8Encoding utf8 = new UTF8Encoding ();
byte[] data = md5.ComputeHash(utf8 .GetBytes(value));
return Convert.ToBase64String(data);
}
}
private void Login_Load( object sender, EventArgs e)
{
_instance = this;
this.BringToFront();
txtUsername.Focus();
}
private void metroButton1_Click( object sender, EventArgs e)
{
//Se verifică dacă utilizatorul a introdus nmele de utilizator și
parola, dacă nu au fost introduse se va afișa un mesaj.
if ((string.IsNullOrEmpty(txtUsername.Text)) ||
(string.IsNullOrEmpty(txtPassword.Text)))
{
MetroFramework. MetroMessageBox .Show(this, "Introduceți numele
de utilizator și parola", "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Information);
txtUsername.Focus();
return;
}
try
{
//Variabila „parola‟ stochează parola introdusa de
utilizator sub formă criptată
string parola = Encrypt(txtPassword.Text);
using (DbConsumEnergieElectricaEntities db = new
DbConsumEnergieElectricaEntities ())
{
//Se realizează o interogare a bazei de date pentru a
vedea dacă datele introduse de utilizator se regăsesc in baza de date.
var query = from u in db.Administratori
where u.NumeUtilizator == txtUsername.Text &&
u.Parola == parola
select u;
if (query.SingleOrDefault() != null)
{
this.Hide();
MeniuPrincipal mp = new
MeniuPrincipal (string.Format( "Utilizator: {0}" , txtUsername.Text));
mp.Show();
}
else
{
//Dacă datele introduse te utilizator nu se regasesc
în baza de date se va afișa un mesaj.
LUCRAREA DE DISERTAȚIE
26
MetroFramework. MetroMessageBox .Show(this, "Numele de
utilizator sau parola sunt incorecte." , "Message" , MessageBoxButtons .OK,
MessageBoxIcon .Information);
}
}
}
catch (Exception ex)
{
MetroFramework. MetroMessageBox .Show(this, ex.Message,
"Message" , MessageBoxButtons .OK, MessageBoxIcon .Error);
}
}
}
}
Meniul principal al aplicației sau interfața principal ă face legătura cu celelalte
interfețe ale aplicației.
Fig. 4.6. Meniul Principal
Codul sursă :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsumEnergieElectrica
{
public partial class MeniuPrincipal : MetroFramework.Forms. MetroForm
LUCRAREA DE DISERTAȚIE
27
{
bool _logOut;
public MeniuPrincipal( string userInfo)
{
InitializeComponent();
lblUserInfo.Text = userInfo;
}
//Se inchide fereastra principală si se afișeaza fereastra de logare
private void lnkLogOut_Click( object sender, EventArgs e)
{
_logOut = true;
this.Close();
Login.Instance.Show();
}
private void MeniuPrincipal_FormClosed( object sender,
FormClosedEventArgs e)
{
if (!_logOut)
Application .Exit();
}
//Se deschide fereastra Abonati
private void tileAbonati_Click( object sender, EventArgs e)
{
MeniuAbonati ab = new MeniuAbonati ();
ab.Show();
}
//Se deschide fereastra Administratori
private void mtAdministratori_Click( object sender, EventArgs e)
{
MeniuAdministratori ma = new MeniuAdministratori ();
ma.Show();
}
//Se deschide fereastra Index
private void mtIndex_Click( object sender, EventArgs e)
{
MeniuIndex mi = new MeniuIndex ();
mi.Show();
}
//Se deschi de fereastra Consum Abonați
private void metroTile1_Click( object sender, EventArgs e)
{
MeniuConsumAbonati mca = new MeniuConsumAbonati ();
mca.Show();
}
//Se deschide fereastra Statistici
private void metroTile2_Click( object sender, EventArgs e)
{
MeniuStatistici ms = new MeniuStatistici ();
ms.Show();
}
}
}
LUCRAREA DE DISERTAȚIE
28
Interfața Abonați (Fig 4.7) permide adăugarea, editarea și ștergerea abonaților
precum și tipărirea de rapoarate. De asemenea interfața mai dispune și de alte opțiuni
cum ar fi : filtrarea abonaților în funcție de județ si căutarea lor după ID, nume,
prenume, telefon, etc.
Fig. 4.7. Interfața Abonați
Codul sursă :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DGVPrinterHelper;
namespace ConsumEnergieElectrica
{
public partial class MeniuAbonati : MetroFramework.Forms. MetroForm
{
public MeniuAbonati()
{
InitializeComponent();
}
private async void mtAdauga_Click( object sender, EventArgs e)
{
using (InfoAbonati infAb = new InfoAbonati (new Abonati()))
{
if (infAb.ShowDialog() == DialogResult .OK)
{
try
LUCRAREA DE DISERTAȚIE
29
{
abonatiBindingSource.Add(infAb.AbonatiInfo);
db.Abonati.Add(infAb.AbonatiInfo);
await db.SaveChangesAsync();
}
catch(Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj",
MessageBoxButtons .OK, MessageBoxIcon .Error);
}
}
}
}
DbConsumEnergieElectricaEntities db;
private void MeniuAbonati_Load( object sender, EventArgs e)
{
db = new DbConsumEnergieElectricaEntities ();
abonatiBindingSource.DataSource = db.Abonati.ToList();
}
private void mtRefresh_Click( object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
txtSearch.Text = String.Empty;
// Cursor.Current = Cursors.WaitCursor;
abonatiBindingSource.DataSource = db.Abonati.ToList();
// dataGridView1.DataSource = db.Abonati.ToList();
//Cursor.Current = Cursors.Default;
dataGridView1.DataSource = abonatiBindingSource;
}
private async void mtEditeaza_Click( object sender, EventArgs e)
{
Abonati obj = abonatiBindingSource.Current as Abonati;
if (obj != null)
{
using(InfoAbonati frm = new InfoAbonati (obj))
{
if(frm.ShowDialog() == DialogResult .OK)
{
try
{
abonatiBindingSource.EndEdit();
await db.SaveChangesAsync();
}
catch(Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj",
MessageBoxButtons .OK, MessageBoxIcon .Error);
}
}
}
}
}
private async void mtStergere_Click( object sender, EventArgs e)
{
LUCRAREA DE DISERTAȚIE
30
try
{
if (MessageBox .Show("Sunteti sigur ca doriti sa stergeti
aceasta inregistrare?" , "Mesaj", MessageBoxButtons .YesNo,
MessageBoxIcon .Question) == DialogResul t.Yes)
{
int rows = dataGridView1.RowCount;
for (int i = rows – 1; i >= 0; i –)
{
if (dataGridView1.Rows[i].Selected)
{
db.Abonati.Remove(dataGridView1.Rows[i].DataBoundItem as Abonati);
abonatiBindingSource.RemoveAt(dataGridView1.Rows[i].Index);
await db.SaveChangesAsync();
}
}
}
}
catch(Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
private async void mtSalveaza_Click( object sender, EventArgs e)
{
try
{
if (MessageBox .Show("Doriti sa salvati modificarile?" ,
"Mesaj", MessageBoxButtons .YesNo, MessageBoxIcon .Question) ==
DialogResult .Yes)
{
//End edit data & save
abonatiBindingSource.EndEdit();
await db.SaveChangesAsync();
}
}
catch (Exception ex)
{
MessageBox .Show(ex .Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
private void mtPrintare_Click( object sender, EventArgs e)
{
DGVPrinter printer = new DGVPrinter ();
printer.Title = "Raport" ;//Header
printer.SubTitle = string.Format( "Date: {0}" ,
DateTime .Now.Date.ToString( "dd/MM/yyyy" ));
printer.SubTitleFormatFlags = StringFormatFlags .LineLimit |
StringFormatFlags .NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment .Near;
printer.Footer = "Abonati" ;//Footer
printer.FooterSpacing = 15;
LUCRAREA DE DISERTAȚIE
31
printer.printDocument.DefaultPageSettings.Landscape = true;
// printer.PrintDataGridView(dataGridView1);
printer.PrintPreviewDataGridView(dataGridView1);
}
private void comboBox1_SelectedIndexChanged( object sender, EventArgs
e)
{
try
{
var query = from o in abonatiBindingSource.DataSource as
List<Abonati>
where o.Judet ==
comboBox1.SelectedItem.ToString()
select o;
dataGridView1.DataSource = query.ToList();
}
catch(Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
private void btnCauta_Click( object sender, EventArgs e)
{
try
{
if (string.IsNullOrEmpty(txtSearch.Text))
{
dataGridView1.DataSource = abonatiBindingSource;
}
else if (cmbCategorie.SelectedIndex == 0)
{
var query2 = from o in abonatiBindingSource.DataSource as
List<Abonati>
where o.IdAbonat ==
Convert.ToInt32(txtSearch .Text)
select o;
dataGridView1.DataSource = query2.ToList();
}
else if (cmbCategorie.SelectedIndex == 1)
{
var query3 = from o in abonatiBindingSource.DataSource as
List<Abonati>
where o.SerieContor ==
Convert.ToInt32(txtSearch.Text)
select o;
dataGridView1.DataSource = query3.ToList();
}
else
{
var query4 = from o in abonatiBindingSource.DataSource as
List<Abonati>
where o.Nume == txtSearch.Text || o.Prenume
== txtSearch.Text || o.Telefon == txtSearch.Text || o.Localitate ==
txtSearch.Text || o.Email == txtSearch.Text || o.Judet == txtSearch.Text
select o;
dataGridView1 .DataSource = query4.ToList();
LUCRAREA DE DISERTAȚIE
32
}
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
}
}
La apăs area butonului adăugare sau editare se va deschide o noua interfață
numită Info Abonați (Fig 4.8) care permite introducerea sau editarea datelor unui
abonat.
Fig. 4.8. Interfața Info Abonați
Codul sursă :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsumEnergieElectrica
{
public partial class InfoAbonati : MetroFramework.Forms. MetroForm
{
public InfoAbonati( Abonati obj)
LUCRAREA DE DISERTAȚIE
33
{
InitializeComponent();
bindingSourceAbonati.DataSource = obj;
}
public Abonati AbonatiInfo { get { return
bindingSourceAbonati.Current as Abonati; } }
private void btnSalvare_Click( object sender, EventArgs e)
{
bindingSourceAbonati.EndEdit();
DialogResult = DialogResult .OK;
}
}
}
Interfața Index (Fig 4.9)
Această interfață permite introducerea index -ului unui contor în funcție de seria
acestuia.
Fig. 4.9. Interfața Index
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DGVPrinterHelper;
namespace ConsumEnergieElectrica
{
LUCRAREA DE DISERTAȚIE
34
public partial class MeniuIndex : MetroFramework.Forms. MetroForm
{
public MeniuIndex()
{
InitializeComponent();
}
DbConsumEnergieElectricaEntities db;
private async void mtAdaugare_Click( object sender, EventArgs e)
{
using (AddEditIndex aei = new AddEditIndex (new Consum()))
{
if (aei.ShowDialog() == DialogResult .OK)
{
try
{
consumBindingSource.Add(aei.ConsumInfo);
db.Consum.Add(aei.ConsumInfo);
await db.SaveChangesAsync();
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj",
MessageBoxButtons .OK, MessageBoxIcon .Error);
}
}
}
}
private void mtRefresh_Click( object sender, EventArgs e)
{
txtSearch.Text = String.Empty;
consumBindingSource.DataSource = db.Consum.ToList();
dataGrid ViewIndex.DataSource = consumBindingSource;
}
private void MeniuIndex_Load( object sender, EventArgs e)
{
db = new DbConsumEnergieElectricaEntities ();
consumBindingSource.DataSource = db.Consum.ToList();
}
private async void mtEditare_Click( object sender, EventArgs e)
{
Consum obj3 = consumBindingSource.Current as Consum;
if (obj3 != null)
{
using (AddEditIndex frm = new AddEditIndex (obj3))
{
if (frm.ShowDialog() == DialogResult .OK)
{
try
{
consumBindingSource.EndEdit();
await db.SaveChangesAsync();
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj",
MessageBoxButtons .OK, MessageBoxIcon .Error);
}
}
LUCRAREA DE DISERTAȚIE
35
}
}
}
private void mtStergere_Click( object sender, EventArgs e)
{
if (MessageBox .Show("Sunteti sigur ca doriti sa stergeti aceasta
inregistrare?" , "Mesaj", MessageBoxButtons .YesNo, MessageBoxIcon .Question) ==
DialogResult .Yes)
{
int rows = dataGridViewIndex.RowCount;
for (int i = rows – 1; i >= 0; i –)
{
if (dataGridViewIndex.Rows [i].Selected)
{
db.Consum.Remove(dataGridViewIndex.Rows[i].DataBoundItem as Consum);
consumBindingSource.RemoveAt(dataGridViewIndex.Rows[i].Index);
}
}
}
}
private async void mtSalvare_Click( object sender, EventArgs e)
{
try
{
if (MessageBox .Show("Doriti sa salvati modificarile?" ,
"Mesaj", MessageBoxButtons .YesNo, MessageBoxIcon .Question) ==
DialogResult .Yes)
{
//End edit data & save
consumBindingSource.EndEdit();
await db.SaveChangesAsync();
}
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
private void mtPrint_Click( object sender, EventArgs e)
{
DGVPrinter printer = new DGVPrinter ();
printer.Title = "Raport" ;//Header
printer.SubTitle = string.Format( "Date: {0}" ,
DateTime .Now.Date.ToString( "dd/MM/yyyy" ));
printer.SubTitleFormatFlags = StringFormatFlags .LineLimit |
StringFormatFlags .NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment .Near;
printer.Footer = "Consum" ;//Footer
printer.FooterSpacing = 15;
//printer.PrintDataGridView(dataGridViewIndex);
printer.PrintPreviewDataGridView(dataGridViewIndex);
}
LUCRAREA DE DISERTAȚIE
36
private void txtSearch_KeyDown( object sender, KeyEventArgs e)
{
}
private void txtSearch_KeyPress( object sender, KeyPressEventArgs e)
{
try
{
if (e.KeyChar == ( char)13)
{
if (string.IsNullOrEmpty(txtSearch.Text))
{
dataGridViewIndex.DataSource = consumBindingSource;
}
else
{
int serCont = Convert.ToInt32(txtSearch.Text);
var query = from d in consumBindingSource.DataSource
as List<Consum>
where d.SerieContor == serCont
select d;
dataGridViewIndex.DataSource = query.ToList();
}
}
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageB oxIcon.Error);
}
}
}
}
La apăsarea butonului adăugare sau editare se va deschide o noua fereastră(Fig
4.10).
Fig. 4.10. Interfața Adaugare Index
LUCRAREA DE DISERTAȚIE
37
Codul sursă :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsumEnergieElectrica
{
public partial class AddEditIndex : MetroFramework.Forms. MetroForm
{
public AddEditIndex( Consum obj3)
{
InitializeComponent();
bindingSourceIndex.DataSource = obj3;
}
public Consum ConsumInfo { get { return bindingSourceIndex.Cu rrent as
Consum; } }
DbConsumEnergieElectricaEntities dbb;
private void AddEditIndex_Load( object sender, EventArgs e)
{
using (DbConsumEnergieElectricaEntities db = new
DbConsumEnergieElectricaEntities ())
{
bindingSourceSerieContor.DataSource = db.Abonati.ToList();
AutoCompleteStringCollection ac = new
AutoCompleteStringCollection ();
foreach (Abonati a in bindingSourceSerieContor.DataSource as
List<Abonati>)
ac.Add(Convert.ToString(a.SerieContor));
txtSerieContor.AutoCompleteCustomSource = ac;
}
dbb = new DbConsumEnergieElectricaEntities ();
bindingSource1.DataSource = dbb.Consum .ToList();
}
private void Save_Click( object sender, EventArgs e)
{
bindingSourceIndex.EndEdit();
DialogResult = DialogResult .OK;
}
private void checkIndexVechi_Click( object sender, EventArgs e)
{
try
{
var query2 = ( from c in bindingSource1.DataSource as
List<Consum>
where c.SerieContor ==
Convert.ToInt32(txtSerieContor.Text)
orderby c.Data descending
select c.IndexNou).FirstOrDefault();
if (query2 == null)
{
LUCRAREA DE DISERTAȚIE
38
txtIndexVechi.Text = "0";
}
else
{
txtIndexVechi.Text = Convert.ToString(query2);
}
}
catch (Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
}
}
private void txtConsum_Click( object sender, EventArgs e)
{
int indNou = Convert.ToInt32(txtIndexNou.Text);
int indVechi = Convert.ToInt32(txtIndexVechi.Text);
int consum = indNou – indVechi;
txtConsum.Text = Convert.ToString(consum);
}
}
}
Interfața Consum Abonați
Fig. 4.11. Interfața Consum Abonați
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DGVPrinterHelper;
LUCRAREA DE DISERTAȚIE
39
namespace ConsumEnergieElectrica
{
public partial class MeniuConsumAbonati : MetroFramework.Forms. MetroForm
{
DbConsumEnergieElectricaEntities db;
public MeniuConsumAbonati()
{
InitializeComponent();
db = new DbConsumEnergieElectricaEntities ();
abonatiBindingSource.DataSource = db.Abonati.ToList();
consumBindingSource.DataSource = d b.Consum.ToList();
}
private void MeniuConsumAbonati_Load( object sender, EventArgs e)
{
comboBox1.SelectedIndex = 1;
var query = from a in abonatiBindingSource.DataSource as
List<Abonati>
join b in consumBindingSource.DataSource as
List<Consum> on a.SerieContor equals b.SerieContor
select new {a.IdAbonat, a.Nume, a.Prenume,
b.SerieContor, b.Data, b.IndexVechi, b.IndexNou, Consum = b.Consum1};
dataGridView1.DataSource = query.ToList();
}
private void btnSearch_Click( object sender, EventArgs e)
{
try
{
if (comboBox1.SelectedIndex == 1)
{
var query2 = from a in abonatiBindingSource.DataSource as
List<Abonati>
join b in consumBindingSource.DataSource as
List<Consum> on a.SerieContor equals b.SerieContor
where a.Nume.Contains(txtSearch.Text) ||
a.Prenume.Contains(txtSearch.Text)
select new { a.IdAbonat, a.Nume, a.Prenume,
b.SerieContor, b.Data, b.IndexVechi, b.IndexNou, Consum = b.Consum1 };
dataGridView1.Dat aSource = query2.ToList();
}
else
{
var query2 = from a in abonatiBindingSource.DataSource as
List<Abonati>
join b in consumBindingSource.DataSource as
List<Consum> on a.SerieContor equals b.SerieContor
where a.IdAbonat ==
Convert.ToInt32(txtSearch.Text) || b.SerieContor ==
Convert.ToInt32(txtSearch.Text)
select new { a.IdAbonat, a.Nume, a.Pre nume,
b.SerieContor, b.Data, b.IndexVechi, b.IndexNou, Consum = b.Consum1 };
dataGridView1.DataSource = query2.ToList();
}
}
catch(Exception ex)
{
MessageBox .Show(ex.Message, "Mesaj", MessageBoxButtons .OK,
MessageBoxIcon .Error);
LUCRAREA DE DISERTAȚIE
40
}
}
private void mtRefresh_Click( object sender, EventArgs e)
{
txtSearch.Text = String.Empty;
var query = from a in abonatiBindingSource.DataSource as
List<Abonati>
join b in consumBindingSource.DataSource as
List<Consum> on a.SerieContor equals b.SerieContor
select new { a.IdAbonat, a.Nume, a.Prenume,
b.SerieContor, b. Data, b.IndexVechi, b.IndexNou, Consum = b.Consum1 };
dataGridView1.DataSource = query.ToList();
}
private void mtPrint_Click( object sender, EventArgs e)
{
DGVPrinter printer = new DGVPrinter ();
printer.Title = "Raport" ;//Header
printer.SubTitle = string.Format( "Date: {0}" ,
DateTime .Now.Date.ToString( "dd/MM/yyyy" ));
printer.SubTitleFormatFlags = StringFormatFlags .LineLimit |
StringFormatFlags .NoClip;
printer.PageNumbers = true;
printer.PageNumberInHeader = false;
printer.PorportionalColumns = true;
printer.HeaderCellAlignment = StringAlignment .Near;
printer.Footer = "Consum" ;//Footer
printer.FooterSpacing = 15;
//printer.PrintDataGridView(dataGridViewIndex);
printer.PrintPreviewDataGridView(dataGridView1);
}
}
}
Interfața Statistici
Fig. 4.12. Interfața Statistici
LUCRAREA DE DISERTAȚIE
41
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsumEnergieElectrica
{
public partial class MeniuStatistici : MetroFramework.Forms. MetroForm
{
public MeniuStatistici()
{
InitializeComponent();
db = new DbConsumEnergieElectricaEntities ();
bindingSourceAbonati1.DataSource = db.Abonati.ToList() ;
chart1.ChartAreas[ "ChartArea1" ].AxisX.Interval = 1;
}
DbConsumEnergieElectricaEntities db;
private void MeniuStatistici_Load( object sender, EventArgs e)
{
var query = ( from a in bindingSourceAbon ati1.DataSource as
List<Abonati>
group a by a.Judet into g
select new {Judet = g.First().Judet, Nr =
g.Count()}).OrderBy(a => a.Judet);
chart1.Series[ "Judet"].XValueMember = "Judet";
chart1.Series[ "Judet"].YValueMembers = "Nr";
chart1.DataSource = query.ToList();
chart1.DataBind();
var query2 = ( from b in bindingSourceAbonati1.DataSource as
List<Abonati>
select b).Count();
metroLabel2.Text = query2.ToString();
}
}
}
LUCRAREA DE DISERTAȚIE
42
CONCLUZII
Lucrarea a prezentat tehnologiile informatice utilizate în prezent în toate
domeniile. Aplicațiile specifice utilizează baze de date și medii de programare dedicate
numite sisteme de gestiune a bazelor de date.
Lucrarea a abordat mai multe tehnologii informatice utilizate pentru a permite
evidenț a consumului de energie el ectrică al abonaților unui furnizor de energie electrică .
Se apelează la tehnolologii informatice existente pe platforma .NET FRAMEWORK.
Studiul de caza propune o soluție de integrare a bazelor de date SQL Server cu
interfețe dezvoltate in NetFramework. Sunt alese baze de date relaționale, iar interfata
este programată în C# .
Studiul de caz folosește baze de date SQL Server pentru stocarea datelor, iar
pentru construirea interfeței client, se folosește Visual Studio, utilizând limbajul de
programare C#. Soluția aleasă este modernă, permite stocarea datelor și accesarea lor
prin intermediul interfețelor client. Sunt folosite obiecte ADO.NET existente pe platforma
NetFramework.
LUCRAREA DE DISERTAȚIE
43
BIBLIOGRAFIE
[1]. MSDN Microsoft – Documentația pentru Microsoft Visual Studio, SQL Server.
[2]. Ian G riffiths – Programming C# , Editura O’Reilly , 2010.
[3]. Andrew Troelsen, Philip Japikse – C# 6.0 and the .NET 4.6 Framework , Editura Apress, 2015
[4]. Herbert Schildt, C#: A Beginner’s Guide , 2001
[5]. Florescu V, Staciu V. – Baze de date , Editura Economică, Bucuresti 1999.
[6]. Bruce J ohnson , Professional Visual Studio 2013 .
[7]. Tim Patrick, Microsoft ADO.NET 4 Step by Step .
.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: SPECIALIZAREA TEHNICI INFORMATICE Î N INGINERIA ELECTRICĂ LUCRARE DE DISERTAȚ IE Coordonator științ ific: Conf. Dr. Ionel MUSCALAGIU Absolvent:… [607308] (ID: 607308)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
