3.1 Povezivanje na bazu podataka - Visoka škola za primijenjeno

 autori:
Marko Petričević dipl.ing.,prof.; Danijel
Kučak dipl.ing. urednica:
Ana Rutar, prof.
naslov:
Pristup podacima iz programskog koda
stručni recezenti:
mr. sc. Goran Đambić; Bojan Petrović
lektorica:
Dijana Stilinović
grafički urednik:
Krešimir Pletikosa, ACE
nakladnik:
Algebra d.o.o., 2010.
za nakladnika:
mr.sc. Mislav Balković
mjesto i godina izdavanja:
Zagreb, 2010
Sva prava pridržana. Niti jedan dio ove
knjige ne smije se reproducirati ili prenositi
u bilo kojem obliku, niti na koji način.
Zabranjeno je svako kopiranje, citiranje te
upotreba knjige u javnim i privatnim
edukacijskim organizacijama u svrhu
organiziranih školovanja, a bez pisanog
odobrenja nositelja autorskih prava.
Copyright © Algebra d.o.o.
CIP zapis dostupan u računalnom katalogu
Nacionalne i sveučilišne knjižnice u Zagrebu
pod brojem 743050
ISBN 978-953-322-022-2
Sadržaj:
1. Poglavlje: ...... UVOD ......................................................................................................................................................................... 5 1.1 Baze podataka ..................................................................................................................................................................... 6 1.2 RDBMS vs. OODBMS.......................................................................................................................................................... 6 1.3 Web-servisi .......................................................................................................................................................................... 7 1.4 Visual Studio ........................................................................................................................................................................ 7 1.5 Data Access Application Block............................................................................................................................................. 7 2. Poglavlje: ...... ADO.NET ................................................................................................................................................................... 9 2.1 Objektni model ADO.NET .................................................................................................................................................. 10 2.1.1 Povezano okruženje i podatkovni dobavljači ................................................................................................................ 11 2.1.2 Nepovezano okruženje ................................................................................................................................................. 14 3. Poglavlje: ...... RAD U POVEZANOM OKRUŽENJU ...................................................................................................................... 17 3.1 Povezivanje na bazu podataka .......................................................................................................................................... 18 3.1.1 Što je Connection objekt ............................................................................................................................................... 18 3.1.2 Povezivanje na SQL Server bazu podataka ................................................................................................................. 20 3.1.3 Povezivanje na druge baze podataka ........................................................................................................................... 23 3.1.4 ConnectionStringBuilder klasa ...................................................................................................................................... 24 3.1.5 Spremanje konekcijskih stringova u konfiguracijsku datoteku ...................................................................................... 26 3.1.6 Naredba using ............................................................................................................................................................... 27 3.1.7 Konekcijski događaji...................................................................................................................................................... 27 3.1.8 Konekcijske pričuve ...................................................................................................................................................... 29 3.2 Izvršavanje komandi .......................................................................................................................................................... 30 3.2.1 Svojstva Command klase.............................................................................................................................................. 30 3.2.2 Metode Command klase ............................................................................................................................................... 31 3.2.3 Izvršavanje SQL naredbi ............................................................................................................................................... 32 3.2.4 DataReader objekt i metoda ExecuteReader................................................................................................................ 34 3.2.5 Izvršavanje procedura ................................................................................................................................................... 35 3.2.6 Asinkrono izvršavanje komandi..................................................................................................................................... 36 3.2.7 Izvršavanje višestrukih SQL naredbi korištenjem DataReader objekta ........................................................................ 39 3.3 Rad s parametrima............................................................................................................................................................. 40 3.3.1 Tipovi (smjer) parametara ............................................................................................................................................. 41 3.3.2 Kreiranje parametara .................................................................................................................................................... 41 3.3.3 Dodavanje parametara Command objektima................................................................................................................ 41 3.3.4 Primjer kreiranja i izvršavanja parametriziranih komandi .............................................................................................. 42 3.4 Spremanje i dohvaćanje BLOB vrijednosti ......................................................................................................................... 45 3.4.1 Primjer spremanja i dohvaćanja BLOB vrijednosti ........................................................................................................ 46 3.5 Transakcije ......................................................................................................................................................................... 50 3.5.1 Postavljanje izolacijske razine transakcije .................................................................................................................... 51 3.5.2 Primjer korištenja Transaction objekta .......................................................................................................................... 52 3.5.3 TransactionScope klasa ................................................................................................................................................ 53 4. Poglavlje: ...... PRISTUP PODACIMA IZ JAVA APLIKACIJA........................................................................................................ 55 4.1 Uvod ................................................................................................................................................................................... 56 4.2 JDBC .................................................................................................................................................................................. 56 4.3 JDBC aplikacijsko programsko sučelje .............................................................................................................................. 57 4.3.1 Učitavanje pogonskog programa .................................................................................................................................. 58 4.3.2 Kreiranje konekcije ........................................................................................................................................................ 59 4.3.3 Kreiranje naredbe.......................................................................................................................................................... 59 5. Poglavlje: ...... NAPREDNI JDBC KONCEPTI ................................................................................................................................ 65 5.1 Metapodaci......................................................................................................................................................................... 66 5.2 Sučelje PreparedStatement ............................................................................................................................................... 69 5.3 Izvršavanje pohranjenih procedura .................................................................................................................................... 72 5.4 Rad s transakcijama........................................................................................................................................................... 74 6. Poglavlje: ...... RAD U NEPOVEZANOM OKRUŽENJU ................................................................................................................. 79 6.1 Rad s podacima u nepovezanom okruženju ...................................................................................................................... 80 6.2 DataSet objekti ................................................................................................................................................................... 80 6.2.1 Kreiranje DataSet objekata u kôdu ............................................................................................................................... 80 6.2.2 Spajanje DataSet objekata............................................................................................................................................ 81 6.2.3 Kopiranje DataSet objekata .......................................................................................................................................... 83 6.3 DataTable objekti ............................................................................................................................................................... 83 6.3.1 Kreiranje DataTable objekta.......................................................................................................................................... 83 6.3.2 Kreiranje stupaca .......................................................................................................................................................... 83 6.3.3 Validacijska svojstva i ograničenja ................................................................................................................................ 84 6.3.4 Dodavanje redaka ......................................................................................................................................................... 86 6.3.5 Izmjena podataka .......................................................................................................................................................... 87 6.3.6 Rad s null vrijednostima ................................................................................................................................................ 87 6.3.7 Brisanje podataka ......................................................................................................................................................... 87 6.3.8 Upravljanje izmjenama DataRow objekata ................................................................................................................... 88 6.3.9 Prihvaćanje i odbijanje izmjena u DataTable objektu.................................................................................................... 88 6.3.10 Događaji DataTable objekta .......................................................................................................................................... 88 6.3.11 Greške u DataRow objektima ....................................................................................................................................... 89 6.3.12 Primjer kreiranja i rada s DataTable objektom .............................................................................................................. 89 6.4 DataAdapter objekti............................................................................................................................................................ 93 6.4.1 Kreiranje komandi za upis, izmjenu i brisanje ............................................................................................................... 93 6.4.2 Dohvaćanje i spremanje podataka ................................................................................................................................ 94 6.4.3 Rješavanje sukoba (konflikata) kod dohvaćanja podataka u DataSet .......................................................................... 94 6.4.4 Rješavanje konflikata pri spremanju promjena u bazu ................................................................................................. 96 6.4.5 Izvršavanje grupnih operacija pomoću DataAdapter objekata ...................................................................................... 99 6.4.6 Primjer kreiranja DataAdapter objekta kroz kôd............................................................................................................ 99 6.5 Rad s XML-om u DataSet objektima ................................................................................................................................ 100 6.5.1 Spremanje podataka iz DataSet objekta u XML ......................................................................................................... 101 6.5.2 Spremanje definicijske sheme DataSet objekta kao XML sheme ............................................................................... 101 6.5.3 Učitavanje DataSet objekta iz XML toka ili dokumenta ............................................................................................... 101 6.5.4 Učitavanje definicijske sheme u DataSet objekt iz XML tijeka ili dokumenta .............................................................. 101 6.5.5 Sinkroniziranje DataSet objekta s XmlDataDocument objektom ................................................................................ 101 6.5.6 Pozivanje XPath upita na DataSet objektu ................................................................................................................. 102 6.5.7 Primjer spremanja i učitavanja DataSet objekta u i iz XML-a ..................................................................................... 102 6.6 DataView objekti .............................................................................................................................................................. 103 6.6.1 Kreiranje DataView objekata ....................................................................................................................................... 103 6.6.2 Razvrstavanje (sortiranje) podataka ........................................................................................................................... 103 6.6.3 Filtriranje podataka...................................................................................................................................................... 103 6.6.4 Pregled podataka ........................................................................................................................................................ 104 6.6.5 Izmjena podataka ........................................................................................................................................................ 104 6.6.6 Pretraživanje ............................................................................................................................................................... 104 6.6.7 Navigiranje povezanim podacima ............................................................................................................................... 105 6.6.8 Događaji DataView objekta ......................................................................................................................................... 105 6.6.9 Postavljanje predodređenih DataView objekata korištenjem DataViewManagera ..................................................... 105 6.6.10 Primjer korištenja DataView objekta ........................................................................................................................... 105 7. Poglavlje: ...... DATA ACCESS APPLICATION BLOCK .............................................................................................................. 109 7.1 Data Access Application Block i SqlHelper klasa ............................................................................................................ 110 7.1.1 Primjer korištenja SqlHelper klase .............................................................................................................................. 110 8. Poglavlje: ...... VISUAL STUDIO – ALATI ..................................................................................................................................... 113 8.1 Server Explorer ................................................................................................................................................................ 114 8.1.1 Dodavanje konekcija ................................................................................................................................................... 114 8.2 DataSet dizajner............................................................................................................................................................... 115 8.2.1 Primjer kreiranja DataSet objekta pomoću DataSet dizajnera .................................................................................... 115 8.3 Data Source Configuration Wizard................................................................................................................................... 118 8.3.1 Primjer kreiranja tipiziranog DataSeta pomoću Data Source Configuration Wizarda ................................................. 118 8.4 Konfiguriranje (netipiziranih) DataSet objekata pomoću alata Visual Studia ................................................................... 121 8.4.1 Primjer korištenja kolekcijskih editora: Tables, Columns, Relations, Constraints ....................................................... 121 8.5 Data Adapter Configuration Wizard ................................................................................................................................. 126 8.5.1 Primjer kreiranja DataAdaptera pomoću Data Adapter Configuration Wizarda .......................................................... 127 9. Poglavlje: ...... PODATKOVNO-POVEZIVE KONTROLE ............................................................................................................. 131 9.1 Rad u Windows Forms aplikacijama ................................................................................................................................ 132 9.1.1 Kreiranje podatkovno-povezane forme pomoću alata Visual Studia .......................................................................... 132 9.1.2 Povezivanje kontrola s podacima................................................................................................................................ 133 9.1.3 Rad s DataGridView kontrolom ................................................................................................................................... 137 9.2 Rad u web-okruženju ....................................................................................................................................................... 142 9.2.1 Podatkovno-poveziva svojstva .................................................................................................................................... 143 9.2.2 Načelo inicijalnog punjenja kontrola podacima i PostBack mehanizam ..................................................................... 147 9.2.3 Primjeri povezivanja temeljenog na klasičnim podatkovnim izvorima ......................................................................... 147 9.2.4 Spremanje promjena u bazu ....................................................................................................................................... 150 9.2.5 GridView kontrola ........................................................................................................................................................ 150 9.2.6 DataSource komponente ............................................................................................................................................ 156 9.2.7 Podatkovno-povezivajući izrazi i jednostavno podatkovno povezivanje ..................................................................... 161 10. Poglavlje: .... RAD S XML-OM .................................................................................................................................................... 167 10.1 XML .................................................................................................................................................................................. 168 10.1.1 Čitanje i zapisivanje XML-a pomoću XmlReader i XmlWriter klasa ............................................................................ 168 10.1.2 XmlReader klasa ......................................................................................................................................................... 168 10.1.3 XmlWriter klasa ........................................................................................................................................................... 170 10.1.4 Primjer korištenja XmlReader i XmlWriter klasa ......................................................................................................... 172 10.2 XML DOM ........................................................................................................................................................................ 174 10.2.1 XmlDocument klasa .................................................................................................................................................... 174 11. Poglavlje: .... ENTITETSKA OKOLINA ....................................................................................................................................... 181 11.1 ADO.NET Entity Framework ............................................................................................................................................ 182 11.1.1 Entiteti ......................................................................................................................................................................... 183 11.1.2 Pozadinska podrška .................................................................................................................................................... 184 11.1.3 Primjer kreiranja EDM modela .................................................................................................................................... 184 11.1.4 Jednina ili množina naziva generiranih entiteta .......................................................................................................... 187 11.1.5 Dizajnerska podrška za rad u entitetskom podatkovnom modelu ............................................................................... 187 11.1.6 Unutrašnja struktura entitetskog podatkovnog modela ............................................................................................... 189 11.2 Zadavanje upita u entitetskoj okolini ................................................................................................................................ 191 11.2.1 LINQ to Entities i sintaksne opcije............................................................................................................................... 192 11.2.2 Entity SQL ................................................................................................................................................................... 193 11.2.3 11.2.4 11.2.5 11.2.6 11.2.7 11.2.8 EntityClient .................................................................................................................................................................. 194 Odgođeno i trenutačno izvršavanje upita .................................................................................................................... 195 Rad s entitetima .......................................................................................................................................................... 196 EDM i procedure ......................................................................................................................................................... 202 Odnosi i asocijacije ..................................................................................................................................................... 209 Podatkovno povezivanje s entitetskom okolinom........................................................................................................ 211 12. Poglavlje: .... INDEKS .................................................................................................................................................................. 215 13. Poglavlje: .... POPIS LITERATURE ............................................................................................................................................ 219 3. Poglavlje: RAD U POVEZANOM OKRUŽENJU
U ovom poglavlju naučit ćete:
;
;
;
;
;
Uspostaviti vezu s bazom podataka
Koristiti komande
Upotrebljavati parametre u komandama
Pomoću komandi pozivati procedure
Koristiti transakcije
Str.18§
3.1
§PRISTUP PODACIMA IZ PROGRAMSKOG KODA
Povezivanje na bazu podataka
Većinom se ADO.NET programski model temelji na neovisnim koracima u ostvarivanju
komunikacije s bazom podataka. Najprije kreiramo vezu s bazom, zatim kreiramo komandu koja
izvršava određeni upit i konačno dobivamo podatke. To je načelo isto koristimo li bilo koji od
prethodno spomenutih podatkovnih dobavljača. Klase koje koristimo za povezivanje na bazu
nalaze se unutar imenskog prostora System.Data i, ovisno o vrsti baze i podatkovnog dobavljača
koje koristimo, unutar određenog njegovog podprostora.
3.1.1
Što je Connection objekt
Connection objekt predstavlja otvorenu vezu (konekciju) s bazom podataka. Connection objekt
ne dohvaća niti izmjenjuje podatke, ne izvršava komande i ne sadržava rezultate njihovih upita.
Connection objekt je naprosto poveznica koju koriste komande i upiti za slanje svojih SQL naredbi
i primanje rezultata. Iako Connection objekti tipično mogu biti shvaćeni kao mjesto gdje
postavljamo svoje konekcijske stringove, oni također posjeduju dodatne metode, kao što su
metode za otvaranje i zatvaranje konekcija ili metode za rad s transakcijama i konekcijskim
pričuvama (engl. connection pools). Drugim riječima, Connection objekti omogućuju cjevovode za
slanje komandi u bazu i dohvaćanje podataka i informacija u aplikaciju.
Komande
i upiti
Connection
objekt
Baza podataka
Informacije iz
baze podataka i
vraćeni podaci
Slika 3.1: Connection objekti su komunikacijski cjevovodi između aplikacije i baze podataka
3.1.1.1 Svojstva, metode i događaji Connection klase
Svojstva, metode i događaji Connection objekata variraju ovisno o vrsti baze i podatkovnom
dobavljaču, ali svaki Connection objekt sadržava iste članove naslijeđene iz bazne klase
System.Data.Common.DbConnection. Zajednički članovi Connection objekata prikazani su u
sljedećim tablicama:
tel: 01 2222 182, e-mail: info@racunarstvo.hr
§www.racunarstvo.hr§
Str.19§
§3. POGLAVLJE: RAD U POVEZANOM OKRUŽENJU
Naziv
Opis
ConnectionString
Dohvaća ili postavlja konekcijski string za otvaranje konekcije.
ConnectionTimeout Samo za čitanje (engl. read-only). Dohvaća vrijeme čekanja na uspostavu
veze. U slučaju isteka generira se greška.
Database Samo za čitanje. Dohvaća ime tekuće baze nakon što je konekcija
otvorena ili ime specificirano u konekcijskom stringu prije otvaranja
konekcije.
DataSource Samo za čitanje. Dohvaća ime servera na koji je Connection objekt
povezan.
ServerVersion Samo za čitanje. Dohvaća string koji predstavlja verziju servera na koji je
Connection objekt povezan.
State Samo za čitanje. Dohvaća string koji opisuje stanje konekcije.
Tablica 3.1: Zajednička svojstva Connection objekata
Naziv
Opis
BeginTransaction
Pokreće transakciju u bazi podataka.
ChangeDatabase Mijenja trenutačnu bazu podataka otvorene konekcije.
Close Zatvara konekciju s bazom. Ovo je preferirana metoda za zatvaranje
otvorene konekcije.
CreateCommand Kreira i vraća System.Data.Common.DbCommand objekt povezan s
pozivajućim Connection objektom.
GetSchema Vraća definicijsku (informacijsku) shemu (engl. schema information) izvora
podataka pozivajućeg Connection objekta.
New Inicijalizira novu instancu Connection klase.
OnStateChange Podiže System.Data.Common.DbConnection.StateChange događaj.
Open Otvara konekciju s bazom prema postavkama specificiranim preko
ConnectionString svojstva.
Tablica 3.2: Zajedničke metode Connection objekata
Naziv
Opis
StateChange
Događa se pri promjeni stanja konekcije.
InfoMessage Događa se kad server vrati upozoravajuću ili informativnu poruku.
Tablica 3.3: Zajednički događaji Connection objekata
Zagreb – Ilica 242
§Visoka
škola za primijenjeno računarstvo
§
Str.20§
3.1.2
§PRISTUP PODACIMA IZ PROGRAMSKOG KODA
Povezivanje na SQL Server bazu podataka
Kad je riječ o serverskoj bazi podataka, kao što je SQL Server, potrebno se najprije povezati sa
serverom, a nakon toga specificirati bazu s kojom želimo raditi. Pri povezivanju sa SQL Serverom
koristimo klase iz imenskih prostora System.Data i System.Data.SqlClient.
Pogledajmo primjer konzolne aplikacije koja se povezuje na instancu SQL Servera pod imenom
sqlexpress, koja se nalazi na lokalnom računalu:
using System; using System.Data; using System.Data.SqlClient; namespace PovezivanjeNaSQLServer { class Program { static void Main(string[] args) { Console.WriteLine("Pritisnite neku tipku za povezivanje na SQL Server."); Console.ReadKey(); SqlConnection cn = new SqlConnection(); cn.ConnectionString = @"Server=.\sqlexpress;integrated security=true"; try { cn.Open(); if (cn.State == ConnectionState.Open) { Console.WriteLine("Uspješno ste se povezali."); Console.WriteLine("Pritisnite neku tipku za prekid veze..."); Console.ReadKey(); cn.Close(); if (cn.State == ConnectionState.Closed) { Console.WriteLine("Veza prekinuta."); } } else { Console.WriteLine("Povezivanje na SQL Server nije uspjelo."); } } catch (SqlException sqlEx) { Console.WriteLine("Dogodila se SQL greška: " + sqlEx.Message); } catch (Exception ex) { Console.WriteLine("Dogodila se greška: " + ex.Message); } finally { cn.Dispose(); } tel: 01 2222 182, e-mail: info@racunarstvo.hr
§www.racunarstvo.hr§
Str.21§
} } §3. POGLAVLJE: RAD U POVEZANOM OKRUŽENJU
} Console.WriteLine("Pritisnite neku tipku za kraj programa..."); Console.ReadKey(); Na početku programa kreirali smo objekt cn klase SqlConnection koji implementira metode i
svojstva potrebna za uspostavljanje veze sa SQL Server bazom podataka.
Napomena: SqlConnection klasa dio je imenskog prostora System.Data.SqlClient kojeg smo
uveli (importirali) na početku programa.
3.1.2.1 Svojstvo ConnectionString
Najvažnije svojstvo SqlConnection objekta je svojstvo ConnectionString jer se u njemu moraju
postaviti svi ključni parametri za povezivanje na SQL Server. U tom smo svojstvu postavljanjem
atributa server=.\sqlexpress odredili ime SQL Servera na koji se želimo povezati.
Napomena: Znak . (točka) je zamjenski znak za ime lokalnog računala. Dakle, izraz
.\sqlexpress označava da je SQL Server instaliran na lokalnom računalu i da je
riječ o njegovoj imenovanoj instanci sqlexpress. Ako ime instance nije postavljeno,
tj. ako je na lokalnom računalu instalirana samo predodređena instanca SQL
Servera, tada će njezino ime biti upravo ime računala (tj. ako je riječ o lokalnom
računalu, samo .).
Drugi atribut integrated security=true određuje način autentifikacije korisnika koji se povezuje
na SQL Server i, u našem primjeru, određuje da se za autentifikaciju koristi Windows korisnički
račun (engl. Windows authentication mode).
Znak točka-zarez (;) unutar konekcijskog stringa koristi se za razdvajanje atributa.
3.1.2.2 Metoda Open
Nakon ispravnog postavljanja konekcijskog stringa, veza sa SQL Serverom može se uspostaviti
pozivom metode Open. Budući da SQL Server nije integralni dio našeg programa, poziv metode
Open spada u kritične operacije. Naime, može se dogoditi da je iz nekog razloga SQL Server
nedostupan (ili nije pokrenut ili se, ako nije na lokalnom računalu, mogu pojaviti problemi s
mrežom...) što će rezultirati izbacivanjem iznimke u našem programu. Stoga je dio kôda u kojem
se aplikacija treba povezati i komunicirati s otvorenom vezom prema SQL Serveru potrebno staviti
unutar try‐catch bloka.
3.1.2.3 SqlException klasa
Ako pri uspostavi veze s SQL Serverom dođe do izbacivanja iznimke (ili do izbacivanja iznimke
dođe zbog bilo kakve druge greške koja se dogodila izvršavanjem neke naredbe na SQL Serveru),
ta će iznimka biti tipa SqlException i moguće ju je presresti i obraditi prije nego se obavi obrada
neke općenite iznimke tipa Exception. Stavimo li poseban catch block u kojem specificiramo
hvatanje iznimke specijalno tipa SqlException, kao u primjeru, tada će taj catch blok uhvatiti sve
iznimke koje su se dogodile u radu sa SQL Serverom i moći ćemo ih obraditi na odgovarajući
način. Izbaci li se iznimka nekog drugog tipa, nju će svakako uhvatiti drugi catch blok iz primjera,
u kojem je tu grešku moguće razriješiti na neki drugi način.
Zagreb – Ilica 242
§Visoka
škola za primijenjeno računarstvo
§
Str.22§
§PRISTUP PODACIMA IZ PROGRAMSKOG KODA
Sljedeća slika prikazuje rezultat pokretanja programa dok je SQL Server bio stopiran. Primijetimo
da se na konzoli ispisao tekst: „Dogodila se SQL greška...“, što svjedoči da je uhvaćena iznimka
SqlException tipa koju je obradio prvi catch blok.
Slika 3.2: Greška pri povezivanju na SQL Server
3.1.2.4 State svojstvo
Pomoću State svojstva SqlConnection objekta moguće je ispitati u kojem se stanju trenutačno
nalazi konekcija sa SQL Serverom. Moguće vrijednosti ovog svojstva učahurene su u enumeraciji
ConnectionState koja je dio imenskog prostora System.Data. U primjeru nakon poziva metode
Open provjeravamo je li veza otvorena i ako jest, ispisujemo to na konzolu, a zatim zatvaramo vezu
pozivom metode Close i rezultat opet ispisujemo na konzolu. Nakon pokretanja programa i
uspješnog povezivanja sa SQL Serverom, dobit ćemo rezultat kao na slici:
Slika 3.3: Povezivanje sa SQL Serverom
3.1.2.5 Dispose i Close metode
SqlConnection objekt troši dosta računalnih resursa i stoga trebamo biti pažljivi s njegovim
korištenjem. Čim nam veza s bazom više nije potrebna, potrebno ju je otpustiti pozivom metode
Dispose, što će na ispravan način otpustiti sve korištene resurse. No u slučaju izbacivanja iznimke
može se dogoditi da veza sa SQL Serverom ostane otvorena i njezini resursi zadržani. Zato smo
metodu Dispose pozvali u finally bloku našeg primjera pa će se, bez obzira na ishod pokušaja
povezivanja sa SQL Serverom (i u slučaju greške i u slučaju uspješnog povezivanja), konekcija
otpustiti.
Metoda Close koju smo koristili u primjeru zatvara konekciju s bazom, ali ne otpušta određene
resurse operacijskog sustava (engl. unmanaged resources) potrebne za ponovno otvaranje
konekcije. Zbog toga metodu Close trebamo koristiti ako ćemo istu konekciju ponovno otvarati.
Ukratko, metoda Close zatvara konekciju, ali zadržava druge resurse u pripremi za ponovno
otvaranje konekcije. Metoda Dispose prvo interno zove metodu Close, a zatim otpušta sve
resurse.
tel: 01 2222 182, e-mail: info@racunarstvo.hr
§www.racunarstvo.hr§
Str.23§
§3. POGLAVLJE: RAD U POVEZANOM OKRUŽENJU
3.1.2.6 Povezivanje s bazom
U prethodnom smo primjeru kreirali konekciju koja se uspješno povezivala sa SQL Serverom, ali
nismo specificirali na koju se bazu želimo povezati. To možemo učiniti postavljanjem atributa
Database. Na primjer, za povezivanje na bazu pod nazivom ADONET, koja se nalazi na instanci
SQL Servera pod nazivom sqlexpress na lokalnom računalu, pomoću Windows autentifikacije,
konekcijski string bi mogao izgledati ovako:
cn.ConnectionString = @"server=.\sqlexpress;database=ADONET;integrated security=true"; 3.1.2.7 SQL Server autentifikacija
Predodređeni način autentifikacije na SQL Serveru jest Windows autentifikacija. Dakle, korisnik koji
se prijavi na Windows operativni sustav, koristi isti korisnički račun i na SQL Serveru. SQL Server
brine o tome ima li određeni Windows korisnički račun ovlasti povezivanja na server, kao i na
svaku pojedinu bazu.
Osim Windows autentifikacije, postoji mogućnost da se dodatno omogući i SQL Server
autentifikacija. Tada se unutar SQL Servera mogu definirati korisnici koji se na server posebno
prijavljuju pomoću korisničkog imena i lozinke. Na primjer, ako se na lokalnu instancu sqlexpress
i bazu ADONET želimo povezati pomoću SQL Server autentifikacije, s korisničkim imenom pero i
lozinkom racunarstvo, tada bi konekcijski string mogao izgledati ovako:
cn.ConnectionString = @"server=.\sqlexpress;database=ADONET;uid=pero;pwd=racunarstvo"; 3.1.3
Povezivanje na druge baze podataka
Za povezivanje s drugim bazama podataka koristimo druge podatkovne dobavljače. Na primjer, za
povezivanje na Access bazu podataka možemo koristiti podatkovni dobavljač .NET Framework
Data Provider for OLE DB, čije se klase nalaze unutar imenskog prostora System.Data.OleDb,
dok se za povezivanje na Oracle bazu koristi podatkovni dobavljač .NET Framework Data Provider
for Oracle i klase imenskog prostora System.Data.OracleClient.
Bitno je, međutim, naglasiti da u komuniciranju s bilo kojom bazom temeljno načelo rada ostaje
isto.
3.1.3.1 Povezivanje na Access
Da bismo se povezali na Accessovu bazu podataka pod nazivom Baza.mdb (Access 2003), gotovo
u potpunosti možemo iskoristiti programski kôd za povezivanje sa SQL serverom iz prethodnog
primjera. Jedine tri linije kôda koje trebamo izmijeniti su:
1. Importirati imenski prostor System.Data.OleDb:
using System.Data.OleDb; 2. Kreirati OleDbConnection objekt:
OleDbConnection cn = new OleDbConnection(); 3. Specificirati konekcijski string:
cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Baza.mdb; Persist Security Info=True"; Zagreb – Ilica 242
§Visoka
škola za primijenjeno računarstvo
§
Str.24§
§PRISTUP PODACIMA IZ PROGRAMSKOG KODA
3.1.3.2 Povezivanje na Oracle
Za povezivanje na Oracle bazu moramo napraviti sljedeće korake:
1. Importirati imenski prostor System.Data.OracleClient:
using System.Data.OracleClient; 2. Kreirati OracleConnection objekt:
OracleConnection cn = new OracleConnection(); 3. Specificirati konekcijski string:
cn.ConnectionString = @"Data Source=(DESCRIPTION= (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORASRVR)(PORT=1521))) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL))); User Id=korisnickoIme;Password=lozinka;"; Na sličan se način možemo povezati s bilo kojim izvorom podataka koji podržava neki od .NET
podatkovnih dobavljača.
Napomena: Budući da je specificiranje konekcijskog stringa zapravo jedini konkretni postupak
kojeg treba učiniti, dobro je znati da se na internetskoj stranici
www.connectionstrings.com nalaze primjeri konekcijskih stringova za sve poznatije
baze podataka.
3.1.4
ConnectionStringBuilder klasa
Svi parametri potrebni za povezivanje na bilo koju bazu podataka navode se kao parovi oblika
ključ=vrijednost, međusobno odvojeni točka-zarezima u ConnectionString svojstvu Connection
objekta. Nazivi i broj parametara ovise o podatkovnom dobavljaču i vrsti baze podataka na koju se
povezujemo.
Za SQL Server bazu podataka podržani parametri konekcijskog stringa dani su u sljedećoj tablici:
Parametar
Opis
Application Name
Ime klijentske aplikacije ili .Net SqlClient Data Provider ako
ime aplikacije nije navedeno.
Async
Postavljeno na true, ovo svojstvo omogućuje asinkrone operacije.
Nije podržano u ADO.NET 1.x.
ili Puno ime .mdf datoteke koja se može koristiti kao priložena
datoteka baze podataka.
AttachDBFileName
Initial File Name
Connection Timeout
Maksimalan broj sekundi koliko Connection objekt čeka odgovor
baze o uspješnom povezivanju. Predodređena vrijednost je 15
sekundi.
Current Language
Jezik koji koristi SQL Server.
DataBase
Catalog
Encrypt
ili
Initial Ime baze na koju se povezujemo.
Upućuje na to treba li koristiti SSL (engl. Secure Socets Layer)
tel: 01 2222 182, e-mail: info@racunarstvo.hr
§www.racunarstvo.hr§
Str.25§
§3. POGLAVLJE: RAD U POVEZANOM OKRUŽENJU
enkripciju za razmjenu podataka između klijenta i servera. Na
serveru treba biti instaliran certifikat. Predodređena vrijednost je
false.
Failover Partner
Integrated Security
Trusted_Connection
Ime servera partnera kojem će se pristupati u slučaju neuspješnog
povezivanja s primarnim serverom. Nije podržano u ADO.NET 1.x.
ili Upućuje na to koristi li se za autentikaciju trenutačni Windows
korisnički račun. Kad je ovo svojstvo postavljeno na vrijednost
false, tada moraju biti navedeni user ID i password. Specijalna
vrijednost sspi znači isto što i true. Predodređena vrijednost je
false.
MultipleActiveResultSets Kad je podešeno na vrijednost true, aplikacija može držati više
aktivnih skupova podataka iz baze. Ova značajka postoji od verzije
SQL Server 2005. Nije podržana u ADO.NET 1.x.
Network Library ili Net
Određuje mrežnu biblioteku koja se koristi za uspostavu veze s
SQL Serverom. Predodređen je dbmssocn, koji se temelji na
TCP/IP.
Packet Size
Veličina paketa (u bajtovima) koji se koriste za razmjenu podataka
između klijenta i SQL servera. Predodređeno je 8192.
Password ili pwd
Lozinka kojom se prijavljujemo na SQL Server.
Persist Security Info
Upućuje na to treba li se uključiti informacija o lozinki u stringu
vraćenom kao ConnectionString svojstvo. Predodređena
vrijednost je false.
Server ili Data Source
Naziv ili mrežna adresa SQL Servera na koji se spajamo.
User ID ili uid
Korisničko ime kojim se prijavljujemo na SQL Server.
Workstation ID
Ime računala koje se prijavljuje na SQL Server.
Tablica 3.4: Neki od podržanih parametara konekcijskog stringa za vezu s SQL serverom
Iz prethodne tablice možemo zaključiti da poveći broj ključnih riječi potrebnih za povezivanje s
bazom podataka može predstavljati problem, osobito ako uzmemo u obzir da su one specifične za
bazu na koju se spajamo. Stoga je u ADO.NET-u za svaki podatkovni dobavljač implementirana
klasa ConnectionStringBuilder koja preko svojih svojstava olakšava generiranje konekcijskih
stringova.
Kako za povezivanje na SQL server koristimo imenski prostor System.Data.SqlClient, ime
odgovarajuće klase za taj podatkovni dobavljač je SqlConnectionStringBuilder. Pomoću
SqlConnectionStringBuilder objekta generiranje konekcijskog stringa za spajanje na SQL
Server bazu izgleda ovako:
SqlConnectionStringBuilder csBuilder = new SqlConnectionStringBuilder(); csBuilder.DataSource = <ime servera>; csBuilder.InitialCatalog = <ime baze>; csBuilder.IntegratedSecurity = true; csBuilder.UserID = <korisničko ime>; csBuilder.Password = <lozinka>; ... string connString = csBuilder.ConnectionString; Zagreb – Ilica 242
§Visoka
škola za primijenjeno računarstvo
§
Str.26§
§PRISTUP PODACIMA IZ PROGRAMSKOG KODA
Dakle, nakon instanciranja objekta klase SqlConnectionStringBuilder, kroz postavljanje
njegovih pojedinačnih svojstava najprije se određuju potrebni parametri konekcijskog stringa.
Sastavljeni konekcijski string zatim dobivamo pozivom svojstva ConnectionString te ga možemo
dodijeliti ConnectionString svojstvu SqlConnection objekta.
Koristimo li neku drugu bazu podataka, možemo upotrijebiti ConnectionStringBuilder klasu njoj
odgovarajućeg podatkovnog dobavljača. Na primjer, za imenski prostor System.Data.OleDb
pripadajuća klasa će se zvati OleDbConnectionStringBuilder, dok će za System.Data.Odbc to
biti OdbcConnectionStringBuilder.
Napomena: Korištenje ConnectionStringBuilder objekta naročito je preporučljivo (umjesto
običnog spajanja stringova) ako konekcijske parametre upisuje korisnik aplikacije,
zbog smanjenja mogućnosti zlonamjernih upada u bazu.
3.1.5
Spremanje konekcijskih stringova u konfiguracijsku datoteku
Ako konekcijske stringove spremimo kao dio programskog kôda, to znači da se pri svakoj migraciji
ili promjeni aplikacijske baze podataka aplikacija mora iznova prevoditi. Stoga je u .NET-u
omogućeno spremanje konekcijskih stringova unutar konfiguracijske datoteke (datoteka app.config
ako je riječ o desktop-aplikaciji ili Web.Config datoteka ako je riječ o web-aplikaciji), u sekciju
<connectionStrings>, na sljedeći način:
<connectionStrings> <add name="imeKonekcijskogStringa" connectionString="SERVER=...;DATABASE=...;UID=...;PWD=..." providerName="System.Data.SqlClient" /> </connectionStrings> Svaki konekcijski string predstavljen je jednim <add> elementom koji ima tri atributa:
1. name – sadržava ime konekcijskog stringa,
2. connectionString – sadržava konekcijski string,
3. providerName – sadržava ime podatkovnog dobavljača kojeg koristimo.
3.1.5.1 Dohvaćanje konekcijskih stringova iz konfiguracijske datoteke
Kad je konekcijski string spremljen u konfiguracijsku datoteku unutar <connectionStrings>
sekcije, možemo ga dohvatiti pomoću klase ConfigurationManager koja se nalazi unutar
imenskog prostora System.Configuration, kako prikazuje sljedeći kôdni isječak:
cn.ConnectionString = ConfigurationManager .ConnectionStrings["imeKonekcijskogStringa"].ConnectionString; Napomena: Da bismo mogli koristiti klasu ConfigurationManager, u projekt treba biti dodana
referenca do datoteke System.Configuration.dll, a u klasi u kojoj je pozivamo
importiran imenski prostor System.Configuration.
tel: 01 2222 182, e-mail: info@racunarstvo.hr
§www.racunarstvo.hr§