Professional Documents
Culture Documents
Lab 2 5 Dataset
Lab 2 5 Dataset
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
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.
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.
emo postaviti tako da desnim klikom aktiviramo kontekstni izbornik i odaberemo opciju Set
primary key
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.
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.
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:
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
http://msdn.microsoft.com/en-us/library/ms190794.aspx
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
Slika 4: DataSet
http://msdn.microsoft.com/en-us/library/ms180730(v=vs.90).aspx
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.
ACME d.o.o.
CenterScreen
True
pokretanja
arobnjaka
za
Lociranje datoteke
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.
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.
10
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:
11
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
nazovemo je OrderID
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
Sada tablica izgleda neto drugaije, odnosno vidljiv nam je novi, upravo dodani upit.
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.
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.
14
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.
Primijetite da sada kako pretraujemo elemente, vie se ne prikazuje ifra, ve naziv artikla i
time je zavren Read.
prvi
puta
dodali
ordersDataGridView
kontrolu,
VisualStudio
je
generirao
15
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);
}
}
16
Formu za dodavanje narudbe kreirati emo unutar novog foldera naeg Solution Explorera,
DataCreateForms
nazvati
ju
frmCreateOrder.
Da
bismo
je
prikazali,
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:
Customers,
za
DisplayMember
odabrali
Customers
tablicu,
17
18
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)
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.
19
Slika 20: Forma za pretraivanje proizvoda koja vraa vrijednost odabira - Lookup
Sada moemo napisati kod kojim postavljamo vrijednosti svojstava. Dodajemo novu metodu
za obradu dogaaja SelectionChanged nad kontrolom productsDataGridView.
20
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());
}
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
21
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();
}
22
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();
}
23
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();
}
24
4. Pitanja za ponavljanje
1.
to je DataSet?
2.
3.
4.
to je pohranjena procedura?
5.
6.
to je TableAdapter?
7.
to je Identity polje?
8.
9.
to je MDI container?
25