Sunteți pe pagina 1din 21

Platforma 6.

1 Linq to SQL

Introducere

In laboratorul precedent a fost prezentata o metoda de conectare a aplicatiei


la baza de date, utilizand ADO.NET1.
.NET Framework dispune si de alte mecanisme ce realizeaza conexiunea cu
baza de date, unul dintre acestea fiind Linq to SQL.
Linq to SQL este un produs ORM2, high-level, ce permite programatorului sa
trateze informatiilor provenite dintr-o baza de date SQL intr-un mod similar cu
obiectele definite in limbajul de programare.

Avantaje ale Linq to SQL:

1. Conceput sa fie neintruziv: este posibil a se migra treptat partile


programului ce folosesc ADO.NET catre Linq to SQL, din moment ce LINQ
to SQL nu este altceva decat o alta componenta a familiei ADO.NET.

2. Este usor de creat o aplicatie basic ce foloseste LINQ to SQL: obiectele


asociate cu datele relationale pot fi definite ca orice alte obiecte, numai ca
sunt decorate cu atribute ce identifica modul in care proprietatile
corespund coloanelor din tabele. Insa nu este nevoie ca acest proces sa se
desfasoare manual. Un tool este integrat in Visual Studio pentru a
automatiza translatarea schemei bazei de date existente in obiecte gata a fi
folosite.

1ADO.NET este o componenta a .NET Framework ce permite accesarea si manipularea datelor.


Sursa o poate reprezenta un fisier text, XML sau o baza de date, Un avantaj al acestei tehnologii este
acela ca lucrul se poate face deconectat cu baza de date, ceea ce rezulta in imbunatatirea
performantei programului.

2 ORM (object-relational mapping) este o tehnica de convertire a datelor dintre 2 sisteme


fundamental incompatibile: cel relational, utilizat de bazele de date, si cel orientat pe obiecte,
intalnit in majoritatea limbajelor de programare.
Platforma 6. 2 Linq to SQL

Aplicatie

Pentru a lucra cu Linq to SQL este nevoie mai intai ca Microsoft SQL Server sa
fie instalat.
Lansati SQL Server Management Studio.
Creati o noua baza de date denumita online_tv.
Adaugati apoi doua tabele user si movie ca in imaginile de mai jos.

Setati user_id drept cheie primara. De asemenea, user_id trebuie sa fie


indexabil. Aceasta optiune o gasiti la Identity Specification -> Is Identity, din
fereastra Column Properties.
Platforma 6. 3 Linq to SQL

Creati un alt tabel, pentru filme, cu urmatoarea structura:

Crearea interfetei grafice

Deschideti Microsoft Visual Studio si creati o noua aplicatie de tipul


Windows Forms Application. Modificati Form1 astfel incat sa arate ca in
imaginea de mai jos
Platforma 6. 4 Linq to SQL

Conectarea la SQL

Adaugati un nou fisier in proiect, de tipul Linq to SQL Classes. Denumiti-l


online_tv.dbml.

Dupa ce dati Add, in Solution Explorer vor aparea 3 fisiere noi: online_tv.dbml,
online_tv.dbml.layout, online_tv.designer.cs. Primul retine interfata de design a
modelului bazei de date, cel de-al doilea este reprezentarea in XML a acestuia, iar
ultimul contine clasele auto-generate, ce corespund tabelelor.

Acum trebuie sa adaugam o conexiune catre baza de date.


1. Selectati View -> Server Explorer
2. In Server Explorer dati click dreapta pe Data Connections si selectati Add
Connection.
3. In fereastra nou deschisa, la Server name, dati click pe sageata din
dreptul casutei de text, apoi selectati {user}\SQLEXPRESS
4. In regiunea Connect to a database, selectati Select or enter a database
name si introduceti online_tv in casuta de text
5. Dati click pe OK pentru a adauga conexiunea.
Platforma 6. 5 Linq to SQL

Noua conexiune online_tv.dbo ar trebui sa apara acum in Server Explorer. In


continuare, vom adauga cele doua tabele in interfata de design:
1. Deschideti online_tv.dbml
2. Din Server Explorer deschideti conexiunea (click pe +) pana cand ambele
tabele sunt afisate, apoi faceti drag-and-drop la fiecare tabel in suprafata de design.
Platforma 6. 6 Linq to SQL

Fisierul online_tv ar trebui sa arate ca in imaginea de mai jos.

Conexiunea la baza de date fiind stabilita, putem acum incepe scrierea


metodelor necesare.
Mai intai avem nevoie sa incarcam filmele din tabela movie. Pentru a interoga
o baza de date utilizand Linq to SQL trebuie mai intai sa construim un obiect de tipul
DataContext.
Acesta implementeaza interfata IDisposable (ce contine o metoda Dispose,
apelata pentru a elibera din memorie resursele nefolosite). C# vine cu un
mechanism ce permite apelarea automata a metodei Dispose: block-ul using.
Platforma 6. 7 Linq to SQL

In metoda LoadMovies este definit un obiect db, de tip online_tvDataContext,


clasa ce mosteneste DataContext.

Obiectul db reprezinta legatura dintre LINQ si baza de date. Prin intermediul


acestuia avem acces la tabelele definite. Astfel, el contine o colectie de obiecte movie
numita movies, fiecare obiect corespunzand unui rand din tabela movie.

In continuare vom crea o metoda ce va afisa filmele in ListBox-ul creat.

Definim apoi o alta functie, pentru a aduce ListBox-ul si TextBox-ul la valorile


initiale:

Vom grupa acum aceste 3 metode intr-o alta functie, care va fi reutilizata
oriunde avem nevoie sa incarcam tabelele din baza de date.
Platforma 6. 8 Linq to SQL

Functia va fi acum apelata din Form1_Load:

Introduceti in baza de date, in tabela movie doua inregistrari:

Daca rulati programul fereastra Form1 ar trebui sa arate ca mai jos:


Platforma 6. 9 Linq to SQL

In continuare veti afisa detaliile filmului selectat din ListBox-ul din stanga, in
TextBox-ul din dreapta

Selectati ListBox-ul, va duceti la Properties, apasati pe Events (iconita de


arata ca un fulger) si dati dublu click pe SelectedIndexChanged.

Creati eventul ce se va declansa atunci cand un film este selectat:


Platforma 6. 10 Linq to SQL

Trebuie acum sa cream metoda de extensie 3 Info:

Rezultatul rularii va fi:

3
Metodele de extensie au fost adaugate in C# 3.0. Ele permit adaugarea a noi metode unei clase
existente, fara a fi nevoie ca aceasta sa fie modificata.
Platforma 6. 11 Linq to SQL

Adaugati un nou fisier de tip Windows Form (va fi denumit automat Form2).

Modificati-l astfel incat sa arate ca in imaginea de mai jos:

TextBox-urile trebuie sa aiba, de sus in jos, urmatoarele denumiri: textBox1,


textBox2, ... , textBox6, iar dateTimePicker-ul trebuie sa aiba denumirea
dateTimePicker1. (foarte important!).
Dati click pe butonul OK, iar apoi in fereastra Properties, in dreptul liniei
Name scrieti: buttonOK. Procedati la fel pentru butonul Cancel (buttonCancel).

Dati dublu click pe butonul Cancel si introduceti urmatorul cod:


Platforma 6. 12 Linq to SQL

La fel pentru butonul OK:

Este nevoie sa modificam textbox-urile 3, 4, 5 si 6 pentru a accepta numai


cifre.
Platforma 6. 13 Linq to SQL

Selectati TextBox 3, iar la Properties -> Events, in dreptul KeyPress scrieti


OnTextBoxKeyPress. Repetati pentru textbox 4, 5, 6.

Reveniti la Form1 si dati click pe butonul Add.

La fel si pentru butonul Remove.


Platforma 6. 14 Linq to SQL

Observati sintaxa de pe randul unde se face atribuirea in variabila


movieToDelete:
var movieToDelete = db.movies.Single(m => m.movie_id ==
selectedMovie.movie_id)

O expresie de forma a => b se numeste expresie lambda. Acesta nu este


altceva decat un alt nume pentru o functie anonima4. Functia primeste ca parametru
a si returneaza b.

In exemplul nostru, Single accepta ca parametru o functie. Aceasta din urma


primeste drept parametru o variabila m, de tip movie (tipul este dedus automat de
compilator, pentru ca functia este aplicata unei colectii de tip IEnumerable<movie>),
si returneaza un rezultat de tip bool. Astfel, functia Single intoare filmul ce are id-ul
egal cu id-ul selectedMovie.

Un alt exemplu de expresie lambda: n => n%2 == 1

n este parametrul functiei, iar n%2 == 1 este expresia.

Se citeste astfel: functia primeste ca parametru pe n si returneaza true daca n


este impar.

Aceasta functie o vom folosi pentru a gasi toate numerele impare dintr-o lista
data.

var numbers = new List<int> {11, 37, 52};


var oddNumbers = numbers.Where(n => n%2 == 1).ToList();

Acum oddNumbers va contine pe 11 si pe 37.

4
O functie anonima este o functie care nu are un nume asociat. Sunt folosite ca argumente pentru
functii de ordin inalt (functii ce accepta ca parametru sau returneaza o alta functie). Sunt intalnite
cu precadere in limbajele functionale - Lisp, Haskell, F#, Javascript, insa recent au fost adaugate si
unor limbaje orientate pe obiecte gen C# si Java (desi erau folosite de asemenea in Smalltalk, un
limbaj orientat pe obiecte, aparut cu mult inaintea C# sau Java)
Platforma 6. 15 Linq to SQL

Cea de-a treia si ultima fereastra care trebuie adaugata este cea pentru
modificarea unui film:

Mai intai trebuie ca in Form1 sa adaugam codul pentru a deschide fereastra


atunci cand se apasa butonul Modify.

Constructorului clasei noii forme ii trimitem ca parametru filmul ce dorim sa-l


modificam.
Platforma 6. 16 Linq to SQL

Atunci cand utilizatorul apasa butonul Save din fereastra Modify


programul il va ruga sa confirme actiunea dorita. Daca Apasa ‘Yes’, se va salva
filmul modificat in baza de date.

La deschiderea formei dorim ca detaliile filmului sa fie deja introduse


in TextBox-uri. Deci trebuie ca pe event-ul Load al formei sa legam o metoda
Platforma 6. 17 Linq to SQL

In final, codul din clasa Form1 arata astfel:


Platforma 6. 18 Linq to SQL
Platforma 6. 19 Linq to SQL

Clasa Form2:
Platforma 6. 20 Linq to SQL

Clasa Form3:
Platforma 6. 21 Linq to SQL

Clasa Extensions:

S-ar putea să vă placă și