You are on page 1of 25

Katedra za razvoj informacijskih sustava

Programsko inenjerstvo, akademska godina: 2012/13

Laboratorijske vjebe 2.5


Pristup bazi podataka koritenjem DataSet-ova

Saetak
U ovim vjebama proi emo kroz gotovo najstariji nain koritenja baze podataka koju
podrava .NET, odnosno koritenjem DataSet-ova. Uz same DataSet-ove proi emo kratko i
kroz SQL Server 2012. Proiti emo pohranjene procedure, okidae (engl. trigger) i vezanje
podataka sa kontrolama (engl. data binding)
Kljune rijei: ADO.NET, DataSet, SQL Server 2012

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Sadraj

1. Uvod ....................................................................................................................................................................................... 2
2. SQL Server 2012 ................................................................................................................................................................ 2
2.1. Kreiranje baze podataka i tablica ......................................................................................................................... 3
2.2. Postavljanje upita ....................................................................................................................................................... 4
2.3. Pohranjene procedure i okidai............................................................................................................................ 4
2.4. Okida ............................................................................................................................................................................. 5
2.5. Detach / Attach database ....................................................................................................................................... 6
2.6. Northwind baza podataka ...................................................................................................................................... 6
3. Pristupanje bazi podataka koritenjem DataSet-ova. ........................................................................................ 7
3.1. Kreiranje nove aplikacije sa pristupom podacima ........................................................................................ 8
3.2. Spajanje na bazu podataka .................................................................................................................................... 9
3.3. Prikaz podataka READ ....................................................................................................................................... 10
3.4. Brisanje podataka - Delete .................................................................................................................................. 15
3.5. Dodavanje novih redaka Create..................................................................................................................... 16
3.6. Dodavanje stavki ..................................................................................................................................................... 19
3.7. Auriranje zapisa - Update .................................................................................................................................. 22
4. Pitanja za ponavljanje .................................................................................................................................................. 25
5. Literatura (pristupano u periodu ljetnog semestra ak.g. 2012/2013) ....................................................... 25

1. Uvod
U ovim materijalima koristi emo sustav za upravljanje bazom podataka, kako bismo kreirali
bazu podatka i isprobali dohvaanje, pohranu, auriranje i brisanje podataka (CRUD), a nakon
toga emo napraviti jednu aplikaciju koja samostalno pristupa podacima i omoguuje CRUD
operacije.

2. SQL Server 2012


Microsoft SQL Server je sustav za upravljanje relacijskom bazom podataka. Iako postoji vie
definicija baze podataka, mi emo koristiti najjednostavniju prema kojoj je baza podataka
(kolokvijalno nazivana samo baza) organizirani skup podataka. Organiziran u ovom sluaju
znai da postoje stroga formalno definirana pravila koja se primjenjuju za pohranu podataka.
Sustav za upravljanje bazom podataka omoguuje kreiranje, itanje, auriranje i brisanje baza
podataka, dok baza podataka sadri tablice, koje su preslika relacijskog modela podataka i u
2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

njima pohranjuje strukturirane zapise. Uz Microsoft SQL Server 2012 kojeg emo koristiti na
ovom kolegiju, postoji jo mnogo drugih, primjerice: MySQL, PostgreSQL, Oracle, Sybase,
dBase, IBM DB2 itd.

2.1. Kreiranje baze podataka i tablica


Pokrenuti emo SQL Server Management Studio koji e nam omoguiti pregled baza
podataka. Ovisno o instalaciji sustav nas trai lozinku i korisniko ime. Nakon uspjene
prijave, prikazuje se prozor aplikacije vrlo sline strukture kao Visual Studio.
Prema uputama u tablici 1, kreirati emo bazu podataka. U stablastom ispisu na Databases
emo pritisnuti desni klik i odabrati New Database, nakon toga navodimo ime baze podataka
i zavreno je kreiranje. Bazu emo nazvati PIDatabase. Postoje jo i napredne mogunosti
kreiranja baze podataka, no kako to nije temelj ovog kolegija i potrebna su odreena
predznanja, u ovim materijalima neemo ii u daljnje razmatranje kreiranje baze podataka.
Tablica 1: Postupak kreiranja baze podataka, dodavanja nove tablice i otvaranja prozora za upite

Kreiranje baze podataka

Dodavanje nove tablice

Postavljanje upita nad bazom

Nakon uspjeno kreirane baze podataka,


unutar datoteke Databases pojaviti e se i
upravo kreirana PIDatabase. Na nju emo
ponovno pritisnuti desni klik mia i odabrati
New Table. Nakon toga otvara se tablica
koja izgleda poput tablice na slici 1. Dodati
emo te atribute i za svakog odabrati tip
podataka iz padajueg izbornika Data
Type. Polje ID e nam biti primarni klju, to
Slika 1: Kreiranje strukture tablice

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

emo postaviti tako da desnim klikom aktiviramo kontekstni izbornik i odaberemo opciju Set
primary key

Slika 2: Automatsko poveavanje primarnog kljua

Obzirom da je primarni klju prirodni broj i da iza njega ne stoji poslovna logika, moemo
koristiti samo-poveavajue polje. Da bismo to napravili u donjem prozoru sa svojstvima
proiriti emo opcijuIdentity specification, kao na slici 2. Polje Is Identity emo postaviti na
Yes, polje Identity Increment emo postaviti na 1 (vrijednost za koju se svaki puta kod
dodavanja novog zapisa u bazu, primarni klju povea) i polje Identity Seed emo postaviti
na 1 (vrijednost od kojeg se primarni klju poinje brojat).
Da bismo okonali proces kreiranja tablice, kliknuti emo na Save. To e nam otvoriti novi
prozor u kojem biramo naziv tablice, napisati emo Customer.

2.2. Postavljanje upita


Prije postavljanja upita, moramo otvoriti prozor u kojeg emo ih pisati. Da bismo to napravili,
na bazu podataka koju elimo koristiti pritisnemo desni klik i odaberemo opciju New Query,
kao na tablici 1. Sada moemo unijeti kod kojim emo dodati prvi zapis u bazu podataka:
Kod
insert
into Customer
(CompanyName, ContactName, ContactTitle, Email, Active)
values
('Microsoft', 'Joe Willson', 'MR', 'joe.willson@microsoft.com', 0);

Konano, da bismo upit izvrili, oznaiti emo upit koji elimo izvriti i odabrati emo opciju
Execute. Mogue je napisati vie upita, a SQL Server e izvriti samo one oznaene.

2.3. Pohranjene procedure i okidai


Pohranjena procedura je blok SQL upita koji omoguuje funkcionalnost slinu kao metoda u
objektno orijentiranom programiranju. Primjerice, niz upita koji rade zapis, validaciju, zamjenu
2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

podataka itd., pohranimo kao proceduru koju moemo iznova pozivati. Narudba i ponuda u
bazi podataka mogu biti tablice vrlo sline (esto i jednake) strukture. U poslovnom procesu
klijent dobiva ponudu koju moe potvrditi. U tom trenutku, da ne bismo ponovno zapisivali
podatke kao narudbu (ukoliko se ponuda ne promjeni), moemo napraviti proceduru koja e
ponudu pretvoriti u narudbu. Sljedei kod prikazuje kako kreirati pohranjenu proceduru koja
aktivira klijenta u bazi podataka. Neka je svaki klijent u bazi neaktivan, sve dok ne narui
jedan proizvod. Kada ga narui, korisnik e pokrenuti ActivitySet proceduru (npr. u aplikaciji
odabere opciju Aktiviraj)
Kod
create procedure ActivitySet
@CustomerID integer
AS
update Customer set Active = 1 where ID = @CustomerID;
GO

Ponovno oznaimo kod (upit) procedure i odaberemo Execute. Kao rezultat trebali bismo
dobiti poruku Command(s) completed successfully. Time je procedura pohranjena, a da bismo
je pokrenuli moramo izvriti sljedei upit: execute ActivitySet 1;
Ulazi parametar je 1, jer to je primarni klju retka koji mijenjamo. Ako pogledamo proceduru
onda se vidi da koristimo parametar @CustomerID.

2.4. Okida
Okida je pohranjena procedura ili upit koji poziva pohranjenu proceduru koja se automatski
izvrava kao odgovor na neki dogaaj u bazi podataka. Sljedei upit prikazuje okida koji
svaki puta nakon dodavanja klijenta u tablicu Customer automatski radi aktivaciju.
Kod
create trigger UpdateActivityTrigger on Customer
after insert
as
declare @varijabla AS int;
set @varijabla = (select id from inserted);
execute dbo.ActivitySet @varijabla;
print 'Uspjesno sam upisao aktivnost za ' + convert(varchar, @varijabla);
go
Command(s) completed successfully.

Nakon izvravanja upita koji kreira ovaj okida, svaki puta kada dodamo novi redak dobiti
emo poruku o uspjenom zapisu u bazu podataka i poruku od okidaa.
Sintaksa okidaa je sljedea:

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Kod
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name

2.5. Detach / Attach database


Podaci baze podataka mogu se otkaiti i ponovno zakaiti na istu ili neku drugu instancu
SQL servera. Taj je postupak vrlo koristan zbog migracije baze podataka i tim vie to korisnik
koji kasnije koristi bazu podataka u aplikaciji ne mora nuno imati instalaciju SQL Server-a.
Baza podataka koja se otkai zapisana je u .mdf formatu koji je portabilna baza podataka,
odnosno baza podataka u jednoj datoteci. Obzirom na reeno, imamo dvije mogunosti
koritenja baze podataka; a) pristupanje preko DBMS-a (u naem sluaju SQL Server), b)
pristupanje kao datoteci (u naem sluaju .mdf)1.
Da bismo otkaili bazu podataka (engl. detach), najprije je moramo ugasiti (Take offline), a
nakon toga pokrenemo postupak kojim se ona otkai od posluitelja baze podataka.
Moemo to zamisliti kao sljedee, posluitelj baze podataka, u naem sluaju SQL Server
2012 je niz utinica koje sadre odgovarajui napon i frekvenciju napona, svaki ureaj spojen
na utinicu je u ovom sluaju jedna baza podataka. Bazu podataka je u ovom sluaju, kao i
neki elektrini ureaj, mogue iskljuiti, prenijeti na drugi posluitelj jednakih karakteristika i
ponovno ukljuiti. Da bismo to napravili, desnim klikom na bazu podataka u izborniku Tasks
odaberemo opciju Take offline, a nakon toga, ponovno desni klik, izbornik Tasks, opcija
Detach database. Time dobijemo dvije datoteke (.mdf podaci i .ldf log podaci).

2.6. Northwind baza podataka


Kako ne bismo radili posebnu bazu podataka (to je gradivo ranijih kolegija) samo za pokazne
primjere ove vjebe, koristiti emo pokaznu bazu podataka koja dolazi sa Visual Studijom,
Northwind database. Northwind baza podataka implementira model podataka manje
organizacije i prati proces dobavljanja, naruivanja, prodaje, praenje klijenata, zaposlenika i
1

http://msdn.microsoft.com/en-us/library/ms190794.aspx

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

dostavljaa (slika 3). Northwind takoer sadri procedure i okidae. U prilogu ove vjebe
dolazi otkaena datoteka Northwind koju emo koristiti u Visual Studiu da bismo pokazali
proces kreiranja, prikazivanja, auriranja i brisanja podataka putem aplikacije.

Slika 3: Struktura Northwind baze podataka - nije u pravilnoj ERA notaciji, ve u MS SQL Server notaciji

3. Pristupanje bazi podataka koritenjem DataSet-ova.


DataSet je klasa koja omoguuje offline pristup bazi podataka i njeni objekti predstavljaju
memorijske reprezentacije dohvaenih podataka iz nekog izvora podataka (ne mora biti baza
podataka iako najee jest). DataSet predstavlja sve podatke ukljuujui tablice, ogranienja i
veze izmeu tablica.

Slika 4: DataSet

http://msdn.microsoft.com/en-us/library/ms180730(v=vs.90).aspx

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Promotrimo sliku 4. Na lijevom rubu slike nalazi se neki izvor podataka (XML datoteka ili baza
podataka), a na desnom rubu slike nalazi se korisnik koji pregledava podatke pomou
DataGrid kontrole. Koritenjem DataSeta procedura za dobavljanje podataka je sljedea.
Korisnik tri neke podatke za ispis na DataGrid kontrolu. DataGrid kontrola pomou
BindingSource klase povezana je sa podacima. BindingSource ponaa se kao izvor podataka
za neku kontrolu (primjerice TextBox, ComboBox ili DataGridView). Svaku promjenu korisnika
propagira na sljedei sloj prema bazi podataka, a svaku promjenu baze podataka propagira
dalje prema korisniku. Ukratko omoguuje vezanje kontrole za podatak. Te podatke dobiva
iz DataSet kontrole koja je memorijska preslika baze podataka, a ta memorijska preslika baze
podataka puni se pomou TableAdapter klase. Dakle korisnik zatrai podatke, BindingSource
potrai te podatke u DataSet-u, kojeg je prethodno napunilo TableAdapter. TableAdapter
sadri upite prema kojima ima mogunost filtrirati DataSet. Ukoliko korisnik mijenja podatke,
oni e se putem BindingSource-a mjenjati samo do DataSet-a. Tek nakon to korisnik
odabere Save (ili programer tako isprogramira), podaci iz DataSet-a preslikavaju se u bazu
podataka. Vie o tome na http://blogs.msdn.com/b/bethmassi/archive/2007/09/19/bindingmultiple-comboboxes-to-the-same-datasource.aspx.

3.1. Kreiranje nove aplikacije sa pristupom podacima


Kreiranje aplikacije s modalnim prozorima
Nakon to smo kreirali Windows Forms projekt, Form1 emo preimenovati u frmMain i urediti
svojstva:
Text
StartPosition
IsMdiContainer

ACME d.o.o.
CenterScreen
True

Ovo zadnje svojstvo nam omoguuje kreiranje forme


koja moe ugnijezditi druge forme. Na frmMain emo
jo dodati MenuStrip kontrolu koja e biti glavni
izbornik aplikacije. Strukturu izbornika emo napraviti
tako da File sadri opciju Exit, a Data sadri opcije za
prikaz tablica iz baze podataka kao na slici. Name

Slika 5: Glavni izbornik aplikacije

svojstvo izbornika emo postaviti msMain, a svaki


element izbornika emo poeti prefiksom mi (kao menu item) i nastaviti sa strukturom
izbornika. Prema slici, Orders opcija e se zvati miDataBrowseOrders, opcija Browse e se
zvati miDataBrowse.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

3.2. Spajanje na bazu podataka


Kao to smo najavili, za ovu vjebu koristiti
emo pokaznu bazu podataka Northwind koja
je u obliku Microsoft SQL Database datoteke.
Prvi korak je dodavanje izvora podataka (Data
Source). U izborniku DataSources (ukoliko nije
vidljiv, unutar izbornika View, Other Windows,
Data Sources) odaberemo Add new datasource.
Nakon

pokretanja

arobnjaka

za

Slika 6: Dodavanje izvora podataka

dodavanje novog izvora podataka, odabrati


emo bazu podataka (Database), nakon toga DataSet. Iz sljedeeg izbornika kliknuti emo na
gumb New Connection. Na novom prozoru ima nekoliko zanimljivih opcija. Gumbom Change
se otvara novi prozor na kojem biramo tip baze podataka na kakvu se spajamo. U ovom
prozoru moemo postaviti korisniko ime, lozinku, kreirati novu bazu podataka itd. Mi emo
odabrati Change i odabrati Microsoft SQL Server Database File.

Lociranje datoteke

Testiranje veze prema bazi podataka

Nakon toga e se dialog s kojeg smo krenuli promijeniti i traiti e nas lokaciju .mdf datoteke.
Kada smo je pronali, testirati emo vezu prema bazi podataka pritiskom gumba Test
Connection. Ako je rezultat Test connection succeded tada je baza podataka spremna za
koritenje i moemo kliknuti na OK.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Slika 7: elimo li presnimati datoteku baze podataka u projekt?

Nakon tog koraka otvara se prozor koji nas elimo li presnimiti bazu podataka u projekt, mi
emo odabrati NE.
U posljednjem koraku moramo odabrati koje emo
sve tablice, poglede, procedure i funkcije iz baze
podataka koristiti.

Kao i na slici odaberemo

Categories, Customers, Employees, Order Details,


Orders, Products i Suppliers. Neemo koristiti sve
tablice, ve emo pokazati samo jedan CRUD primjer a
ostatak ostavljamo itateljima za implementaciju.

Slika 8: Tablice koje emo koristiti

3.3. Prikaz podataka READ


Podatke emo prikazivati na prozoru kojeg emo aktivirati iz izbornika. Napraviti emo novi
direktorij u strukturi projekta i nazvati ga DataBrowseForms. Unutar tog direktorija emo
dodati novu formu i nazvati je frmBrowseOrders. Unutar izbornika Data, Browse, Orders
odabrati emo novu metodu za rukovanje dogaajem MouseUp i tu emo pokretati formu za
prikaz narudbi:
Kod
private void miDataBrowseOrders_MouseUp(object sender, MouseEventArgs e)
{
DataBrowseForms.frmBrowseOrders browseOrdersFrom = new
DataBrowseForms.frmBrowseOrders();
browseOrdersFrom.MdiParent = this; //<- postavlja prozor kao dijete od frmMain
browseOrdersFrom.WindowState = FormWindowState.Maximized;
browseOrdersFrom.Show();
}

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

10

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Ona e nam posluiti za prikaz narudbi i stavki narudbi. Za to moramo napraviti sljedee:
1. Dodati DataGridView kontrole za narudbe (Orders) i stavke narudbi (Order Details).
To emo napraviti tako da iz DataSources prozora kliknemo na tablicu i dovuemo je
na prozor. To napravimo za svaku tablicu.
2. Sada emo promjeniti svojstva forme (Text = Browse orders, StartPosition=
CenterParent)
3. Za DataGridView kontrole koje smo dodali promijenimo svojstvoj Anchor da dobijemo
otprilike jednaki izgled kao i na slici:

Slika 9: Pripremljene DataGridView kontrole

4. Za DataGridView kontrole svojstvo SelectionMode emo postaviti na FullRowSelect,


svojstvo AllowUsersToAddRows = false.
Moemo pokrenuti aplikaciju i primijetiti da se ispisuju podaci, no tablica sa narudbama
nije povezana sa tablicom stavki. Korisnik eli takav prikaz da svaki puta kada oznai neku
narudbu, vidi njene detalje, odnosno stavke. Pogledajmo programski kod koji se nalazi
ispod ove forme:
Kod
private void ordersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.ordersBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.northwndDataSet);
}
private void frmBrowseCategories_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'northwndDataSet.Order_Details'
table. You can move, or remove it, as needed.
this.order_DetailsTableAdapter.Fill(this.northwndDataSet.Order_Details);
// TODO: This line of code loads data into the 'northwndDataSet.Orders' table.
You can move, or remove it, as needed.
this.ordersTableAdapter.Fill(this.northwndDataSet.Orders);
}

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

11

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Prva metoda izvrava se kada korisnik u Binding Navigator kontroli pritisne na ikonu za
spremanje. Pokrene se postupak validacije podataka, zatvara se BindingSource i TableAdapter
preslikava sadraj naeg DataSet-a u bazu podataka (vidi uvodni tekst). Druga metoda,
prilikom uitavanja forme proita podatke iz baze u tablice unutar DataSet-a. DataGridView
kontrole povezane preko BindingSource-a na northwindDataSet. Za svaki DataGridView to je
mogue vidjeti u svojstvu DataSource. Ono to elimo jest OrderDetails tablicu puniti ovisno
o odabranom primarnom kljuu iz Orders tablice. Za to moramo napraviti novi upit u bazi
podataka.
5. Da bismo kreirali novi upit iz Solution Explorer
prozora odabrati emo northwindDataSet.xsd
pronai tablicu Order Details i u njezin
TableAdapter kliknuti desnim gumbom mia.
Odabiremo opciju Add Query kao na slici.
U sljedeem prozoru koji se otvori, odabrati emo
Use SQL statements, nakon toga SELECT which
returns rows i zatim odaberemo Query Builder i
podesimo upit tako da vraa samo one retke od
odreene narudbe. Napravimo novu varijablu i

Slika 10: Dodavanje novog upita na


TableAdapter

nazovemo je OrderID

Slika 11: Query Builder

Moemo testirati upit da vidimo dobivamo li dobre rezultate. Nakon toga, odabiremo Next
i promjenimo nazive metoda. Ono to se dogaa u pozadini jest da e Visual Studio
generirati metode na TableAdapter-u za Order Details tablicu, pa emo umjesto dosadanje
metode Fill (vidi raniji kod), pozivati novu metodu (prema slici).
2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

12

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Slika 12: Odabir naziva metoda za punjenje DataTable-a

Sada tablica izgleda neto drugaije, odnosno vidljiv nam je novi, upravo dodani upit.

Slika 13: Konaan izgled TableAdapter-a nakon dodavanja novog upita

Vraamo se u frmBrowseOrders dizajner i dodati emo novu metodu za rukovanje


dogaajem SelectionChanged nad kontrolom ordersDataGridView, te promjeniti raniju
metodu za rukovanje dogaajem Load:
Kod
private void frmBrowseOrders_Load(object sender, EventArgs e)
{
this.ordersTableAdapter.Fill(this.northwndDataSet.Orders);
}
private void ordersDataGridView_SelectionChanged(object sender, EventArgs e)
{
if (ordersDataGridView.RowCount > 0)
{
int orderID =
int.Parse(ordersDataGridView.CurrentRow.Cells[0].Value.ToString());
this.order_DetailsTableAdapter.FillByOrderID(this.northwndDataSet.Order_Details,
orderID);
}
}

Ako sada pokrenemo aplikaciju i navigiramo kontrolom za prikaz narudbi, stavke e se


mijenjati i prikazivati samo one za narudbu koju promatramo.
Fino podeavanje prikaza DataGridView kontrole

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

13

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Kao to moete uoiti neki atributi tablice Orders i Order Details su nepotrebni ili nejasni.
Primjerice, CustomerID, EmployeeID ili RequiredDate nam ne znae mnogo isto kao iz
ProductID nismo sigurni o kojem se proizvodu radi toliko dugo dok ne znamo ifru. Najprije
emo neke atribute sakriti, a ProductID emo izmijeniti tako da prikazuje naziv, a ne ifru.
Odabrati emo orderDataGridView i u njenom gornjem desnom kutu kliknuti na malu ikonu
trokuta.

Slika 14: Izbornik za fino podeavanje DataGridView kontrole

Pojaviti e se izbornik kao na slici na kojem trebamo odabrati Edit Columns Time dobivamo
detaljan prikaz svih redaka te moemo mijenjati njihov tip, naziv, prikaz itd. Za Kolone
CustomerID, EmployeeID i RequiredDate emo postaviti na Visible = false.

Slika 15: Ureivanje stupaca

Slino emo napraviti i za order_DetailsDataGridView. Umjesto da vidimo ifre, ProductID


elimo korisniku prikazati naziv proizvoda. Da bismo to omoguili za ColumnType emo
odabrati DataGridViewComboBoxColumn i kao na slici emo odabrati novi DataSource,
tablicu Products iz northwindDataSet.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

14

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Slika 16: Ureivanje izvora podataka, podataka za prikaz i podatka za selekciju

Nakon toga imamo mogunost napraviti razliku izmeu toga to korisniku prikazujemo, a to
e VisualStudio u pozadini koristiti i to preko DisplayMember opcije koju emo postaviti na
ProductName, a ValueMember na ProductID. Time prikazujemo naziv a koristimo ifru. Da bi
tablica i dalje izgledala kao tablica (bez kolone sa ComboBox kontrolom) unutar kategorije
Apperence, za DisplayStyle emo odabrati Nothing i kao naziv kolone (Header text) emo
staviti Product.
Pokrenemo aplikaciju.

Slika 17: Aplikacija - promjenjeni izgled stupca vanjskih kljueva

Primijetite da sada kako pretraujemo elemente, vie se ne prikazuje ifra, ve naziv artikla i
time je zavren Read.

3.4. Brisanje podataka - Delete


Ukoliko nita ne diramo, aplikacija koju smo do sada napravili omoguiti e brisanje. Kada
smo

prvi

puta

dodali

ordersDataGridView

kontrolu,

VisualStudio

je

generirao

BindingNavigator kontrolu sa prikazom trenutne pozicije, gumbima za pomicanje po tablici,


gumbima za spremanje, brisanje i dodavanje novih zapisa.
2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

15

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Moemo probati koristiti tipku brisanja. Primjetite da ukoliko ne odaberemo opciju Save,
podaci se nee obrisati. To je upravo zbog DataSet-a. Nama se ne svia ova generirana
metoda za brisanje, ve elimo vlastitu i to takvu, da korisnika pitamo dali je siguran eli li
obrisati zapis. Za to, u dnu dizajnera odaberemo ordersBindingNavigator i postaviti svojstvo
DeleteItem postaviti na (none). Dva puta emo kliknuti na opciju za brisanje kako bi nam se
generirala metoda za rukovanje klikom.
Obzirom da su nam narudbe vezane uz detalje narudbi, odnosno stavke, ne moemo
narudbu toliko dugo obrisati dok postoji stavaka, stoga, moramo najprije obrisati sve stavke,
a onda tek narudbu. To moemo napraviti na nekoliko naina, no mi emo napisati
jednostavan kod koji e to napravit. Kliknuti emo na ikonu za brisanje i izmijeniti kod
metoda.
Kod
private void ordersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.order_DetailsBindingSource.EndEdit();
this.ordersBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.northwndDataSet);
}
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Do you whish to delete this order?", "Question",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
System.Windows.Forms.DialogResult.Yes)
{
//delete order details
for (int i = 0; i < order_DetailsDataGridView.Rows.Count; i++)
{
order_DetailsDataGridView.Rows.RemoveAt(i);
}
ordersDataGridView.Rows.RemoveAt(ordersDataGridView.CurrentRow.Index);
}
}

3.5. Dodavanje novih redaka Create


Ono to sada elimo napraviti je dodavanje novih narudbi. Za to moramo imati novu formu
koja e prihvaati podatke i zapisivati ih u bazu. No svaka narudba ima neke stavke, stoga
moramo napraviti i formu koja e omoguiti dodavanje stavaka. Kada korisnik dobije novi
prozor sa mogunou kreiranja narudbe, postaviti emo gumb kojim e se narudba
spremiti (kako bismo dobili primarni klju iz baze podataka), proslijediti klju putem
konstruktora forme za dodavanje stavaka i vezati nove stavke uz klju upravo kreirane
narudbe.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

16

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Formu za dodavanje narudbe kreirati emo unutar novog foldera naeg Solution Explorera,
DataCreateForms

nazvati

ju

frmCreateOrder.

Da

bismo

je

prikazali,

orderBindingNavigatoru emo opciju AddNewItem postaviti na (none) i dodati metodu za


rukovanje klikom.
Kod
private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
{
DataCreateForms.frmCreateOrder frmOrder = new
DataCreateForms.frmCreateOrder();
frmOrder.ShowDialog(); //<- dialog ne dozvoljava fokus drugih kontroli
}

A na novu formu, ovaj put neemo dovlaiti tablicu iz izbornika DataSources, ve element po
element. Visual Studio e nam generirati labelu i kontrole za odabrane tipove podataka, koje
su ve povezane na bazu podataka (engl. Binding). Da nisu povezane, morali bismo imati kod
koji svaku vrijednost ita iz odreene kontrole (npr. TextBox) i stavlja ih u upit za kreiranje
zapisa. Prije nego to ponemo dovlaiti atribute na kontrole, za CustomerID i EmployeeID za
vrstu kontrole odabrati emo ComboBox. Napraviti emo kontrolu da nam izgleda kao slika:

Slika 18: Ureivanje forme za dodavanje nove narudbe - ComboBox zamjena

Kao to smo ranije kod DataGridView kontrole


odabirali ValueMember i DisplayMember,
ovdje emo napraviti slino. Klikom trokuta na
customerIDComboBox, za DataSource emo
odabrati

Customers,

za

DisplayMember

CustomerName, za ValueMember CustomerID


i za SelectedValue CustomerID. SelectedValue
se u ovom sluaju odnosi na vezu prema
trenutnoj Narudbi. Obzirom da smo za
DataSource

odabrali

Customers

tablicu,

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

17

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

kontrolu smo razdvojili od Orders tablice, pa pomou SelectedValue odabiremo da nam


unutar konteksta orderBindingSource SelectedValue bude ValueMember.
Visual Studio je generirao novu kontrolu BindingNavigator koju neemo koristiti, pa je
moemo obrisati. Umjesto toga dodati emo tri nova gumba: (btnAddDetails) koji e nam
sluiti za otvaranje stavki, Create kojim emo napraviti narudbu i Clear pomou kojeg
zatvaramo prozor.
Sada emo dodati kod za MouseUp dogaaje na te gumbe:
Kod (konstruktor kod frmCreateDetails)
private void btnCreate_MouseUp(object sender, MouseEventArgs e)
{
createNewEntry();
}
private void createNewEntry()
{
this.Validate();
this.ordersBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.northwndDataSet);
}
private void btnAddDetails_MouseUp(object sender, MouseEventArgs e)
{
createNewEntry();
int OrderId = (int)northwndDataSet.Orders.Rows[0]["OrderID"];
// frmCreateDetails emo kreirati neto kasnije, no ovdje prosljedimo ID
frmCreateDetails frmCreateDetails = new frmCreateDetails(OrderId);
if (Editing) frmCreateDetails.Editing = true;
frmCreateDetails.ShowDialog();
}
private void btnClear_MouseUp(object sender, MouseEventArgs e)
{
this.Close();
}

Takoer, elimo da im se otvori ovaj prozor, korisnik ve ureuje novu narudbu, pa


moramo promjeniti metodu Load.
Kod (konstruktor kod frmCreateDetails)
public frmCreateOrder()
{
InitializeComponent();}
private void frmCreateOrder_Load(object sender, EventArgs e)
{
this.employeesTableAdapter.Fill(this.northwndDataSet.Employees);
this.customersTableAdapter.Fill(this.northwndDataSet.Customers);
ordersBindingSource.AddNew();
}

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

18

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Sada imamo sav kod koji nam je potreban da bismo kreirali i spremili nove narudbe. (OPREZ,
neka su polja obavezna, pa ovdje treba jo finog podeavanja i interakcije s korisnikom)

3.6. Dodavanje stavki


Kreirati emo novu formu unutar direktorija DataCreateForms i nazvati je frmCreateDetails.
Promjeniti emo joj svojstvo Text (Add order details) i na slian nain kao ranije povui
tekstualna polja iz DataSources izbornika, no ovaj put emo povui i itavu tablicu u obliku
DataGridView kontrole kako bismo vidjeli stavke koje smo dodali do sada. Uz to, pored
productIDTextBox kontrole emo dodati gumb , koji e nam kasnije prikazati listu svih
proizvoda i u taj TextBox zapisati ifru odabranog proizvoda.

Slika 19: Forma za dodavanje stavki narudbe

Kao i za dodavanje narudbi, moramo podesiti formu tako da kad je korisnik otvori,
automatski se dodaje novi zapis, a kada klikne na , otvara se forma sa proizvodima i
ona ima mogunost vratiti ProductID i UnitPrice. Da bismo mogli vratiti ifru proizvoda i
cijenu, trebamo tablicu sa proizvodima. Idemo u direktorij DataBrowseForms i dodajemo
novu formu frmBrowseProducts. U nju emo iz DataSource kontrole povui tablicu
Products i napraviti sve promjene (postavke svojstva, selekcije, dodavanje novog
elementa u glavni izbornik, otvaranje forme na klik, sve kao i za frmBrowseOrders). Kako
elimo da nam ta tablica vraa vrijednosti, trebamo napraviti nova svojstva koja emo
itati i gumbe koji e upravljati formom.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

19

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Slika 20: Forma za pretraivanje proizvoda koja vraa vrijednost odabira - Lookup

Otvoriti emo formu frmBrowseProducts i dodati emo svojstva; ProductID i UnitPrice te


njihove gettere i sttere. Kada korisnik klikne na dataGridView kontrolu ta e se svojstva
postaviti, a njih emo moi dohvatiti i zapisati vrijednosti u polja koja nedostaju. Stoga emo
morati obraditi dogaaj selekcije i jo moramo iz tablice itati vrijednosti. Da bismo to lake
napravili moramo si unutar productsDataGridView kontrole postaviti imena.
Kao to slika prikazuje odabiremo opciju najprije ProductID pa UnitPrice i mijenjamo svojstvo
DataPropertyName u ProductIDColumn i UnitPriceColumn.

Slika 21: Imenovanje stupaca

Sada moemo napisati kod kojim postavljamo vrijednosti svojstava. Dodajemo novu metodu
za obradu dogaaja SelectionChanged nad kontrolom productsDataGridView.

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

20

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Kod
public int ProductID { get; set; }
public float UnitPrice { get; set; }
private void productsDataGridView_SelectionChanged(object sender, EventArgs e)
{
this.ProductID = int.Parse(productsDataGridView["ProductIDColumn",
productsDataGridView.CurrentRow.Index].Value.ToString());
this.UnitPrice = float.Parse(productsDataGridView["UnitPriceColumn",
productsDataGridView.CurrentRow.Index].Value.ToString());
}

Na gumb OK emo zatvarati formu (kasnije se to moe izmjeniti po potrebi).


***
Sada se moemo vratiti na frmCreateDetails i moemo obraditi MouseUp dogaaj za gumb
.
Kod
private void btnListProducts_Click(object sender, EventArgs e)
{
DataBrowseForms.frmBrowseProducts frmProducts = new
DataBrowseForms.frmBrowseProducts();
frmProducts.ShowDialog();
productIDTextBox.Text = frmProducts.ProductID.ToString();
unitPriceTextBox.Text = frmProducts.UnitPrice.ToString();
}

Pomou tog koda dohvatili smo vrijednosti i zapisali ih unutar productIDTextbox kontrole i
unitPriceTextBox kontrole koje su ve vezane za bazu podataka. Time je postupak dodavanja
stavki skoro zavren, no ono to jo moramo napraviti jest prosljeivanje ifre narudbe na
koju veemo stavke, stoga promjenimo konstruktor (ime i raniji kod na frmCreateOrder za
btnAddDetails_MouseUp):.
Kod (konstruktor kod frmCreateDetails)
public int OrderId { get; set; }
public frmCreateDetails(int orderId)
{
InitializeComponent();
this.OrderId = orderId;
}

Takoer

emo

izmijeniti

kod

za

spremanje

dodavanje

elementa.

Najprije

za

order_DetailsBindingNavigator treba promjeniti svojstvo AddNewItem na none. A nakon toga


emo dodati metodu koja obrauje dogaaj klik za bindingNavigatorAddNewItem i za
order_DetailsBindingNavigatorSaveItem. Kod e izgledati ovako:
2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

21

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Kod
private void frmCreateDetails_Load(object sender, EventArgs e)
{
this.productsTableAdapter.Fill(this.northwndDataSet.Products);
this.order_DetailsTableAdapter.FillByOrderID(this.northwndDataSet.Order_Details,
OrderId); // moramo napraviti filtriranje za samo one stavke koje dodajemo
}
private void order_DetailsBindingNavigatorSaveItem_Click(object sender, EventArgs
e)
{
SaveCurrent();
}

private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)


{
addNewEntry();
}
private void addNewEntry()
{
try
{
this.order_DetailsBindingSource.AddNew();
orderIDTextBox.Text = OrderId.ToString();
}
catch (Exception ex)
{
MessageBox.Show("Exception: " + ex.Message);
}
}
private void SaveCurrent()
{
this.Validate();
this.order_DetailsBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.northwndDataSet);
}

Time smo zavrili kod za dodavanje zapisa u tablicu Order i OrderDetails.

3.7. Auriranje zapisa - Update


Da bismo omoguili auriranje trebamo napraviti minimalne promjene na postojeim
formama. Naime, kako koristimo kontrole koji su vezani za podatke (engl. data bound
controls) puno nam je lake napraviti auriranje jer podatke koje prikazujemo moemo
mjenjati i spremati. Ono to nam preostaje je eliminirati automatsko dodavanje redaka
prilikom otvaranja prozora za dodavanje novih redaka. Iste emo koristiti i za auriranje.
Stoga, najprije emo promjeniti formu za narudbe, odnosno frmCreateOrder.
Kod
private bool Editing { get; set; }

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

22

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

public int OrderID { get; set; }


public frmCreateOrder()
{
InitializeComponent();
OrderID = -10; //<- mora biti postavljena pa koristimo neutralnu vrijednost 10
}
// preoptereenje konstruktora (ovaj emo konstruktor koristiti kada korisnik
odabere auriranje
public frmCreateOrder(int OrderID)
{
InitializeComponent();
this.OrderID = OrderID;
this.Editing = true;
}
private void frmCreateOrder_Load(object sender, EventArgs e)
{
this.employeesTableAdapter.Fill(this.northwndDataSet.Employees);
this.customersTableAdapter.Fill(this.northwndDataSet.Customers);
if (this.OrderID != -10)
{
this.ordersTableAdapter.FillByOrderID(this.northwndDataSet.Orders,
this.OrderID); // ako je auriranje popuni prema ID-u
}
else
{
ordersBindingSource.AddNew(); // ako nije auriranje
}
}

Sada znamo koju narudbu ureujemo i znamo da je ureujemo pa te iste podatke moemo
proslijediti i formi za dodavanje stavki:
Kod
private void btnAddDetails_MouseUp(object sender, MouseEventArgs e)
{
createNewEntry();
int OrderId = (int)northwndDataSet.Orders.Rows[0]["OrderID"];
frmCreateDetails frmCreateDetails = new frmCreateDetails(OrderId);
if (Editing) frmCreateDetails.Editing = true;
frmCreateDetails.ShowDialog();
}

A u formi za dodavanje stavki samo moramo osigurati da se ne dodaje novi redak im se


forma otvori, pa emo i njezin kod izmjeniti:

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

23

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

Kod
public int OrderId { get; set; }
public bool Editing { get; set; }
public frmCreateDetails(int orderId)
{
InitializeComponent();
this.OrderId = orderId;
Editing = false;
}
private void frmCreateDetails_Load(object sender, EventArgs e)
{
this.productsTableAdapter.Fill(this.northwndDataSet.Products);
this.order_DetailsTableAdapter.FillByOrderID(this.northwndDataSet.Order_Details,
OrderId);
if (!Editing)
{
addNewEntry();
}
}

I sada moemo dodati kontekstni izbornik, koji e se pojaviti kada unutar tablice
frmBrowseOrders kliknemo desni gumb mia, a sadrava opciju auriranja. Za to, iz izbornika
sa kontrolama dodajemo novi ContextStripMenu i nazovemo ga ordersContextStripMenu.
Unutar njega slino kao i za glavni izbornik dodajemo novu opciju Edit i na nju metodu za
rukovanje dogaajem MouseUp. Prije toga, moramo obraditi klik desnog gumba mia na
ordersDataGridView kontrolu koja e prikazati izbornik i oznaiti redak (jer tako moemo
dohvatiti ifru). Moramo simulirati klik mia i oznaavanje redka. Konaan kod izgleda:
Kod
private void ordersDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
DataGridView.HitTestInfo hitTest = ordersDataGridView.HitTest(e.X, e.Y);
ordersDataGridView.ClearSelection();
ordersDataGridView.Rows[hitTest.RowIndex].Selected = true;
ordersContextStripMenu.Show(ordersDataGridView,e.Location);
}
}
private void editToolStripMenuItem_MouseUp(object sender, MouseEventArgs e)
{
int OrderID =
int.Parse(ordersDataGridView.SelectedRows[0].Cells["OrderIDColumn"].Value.ToString
());
DataCreateForms.frmCreateOrder order = new
DataCreateForms.frmCreateOrder(OrderID);
order.ShowDialog();
}

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

24

Katedra za razvoj informacijskih sustava


Programsko inenjerstvo, akademska godina: 2012/13

4. Pitanja za ponavljanje
1.

to je DataSet?

2.

to je okida (trigger) u bazi podataka?

3.

Navedite primjer okidaa (triggera) i scenarij koritenja.

4.

to je pohranjena procedura?

5.

Dali se podaci u DataSetu automatski auriraju u bazi podataka?

6.

to je TableAdapter?

7.

to je Identity polje?

8.

emu slui attach/detach baze podataka?

9.

to je MDI container?

10. to je data binding?

5. Literatura (pristupano u periodu ljetnog semestra ak.g.


2012/2013)
1. http://msdn.microsoft.com/en-us/library/ss7fbaez.aspx
2. http://msdn.microsoft.com/en-us/library/h43ks021.aspx
3. http://msdn.microsoft.com/en-us/library/ms189799.aspx

2013, University of Zagreb, Faculty of Organization and Informatics, Varadin

25

You might also like