22.10. Kreiranje konekcije ka bazi podataka iz programskog koda korišćenjem ADO.NET tehnologije
Uvod: ADO.NET i načini rada u njemu
ADO.NET je skup klasa za rad sa podacima.
Snabdevači podataka su klase koje obezbeđuju mogućnost konektovanja na izvor podataka.
Za različite baze se koriste različiti snabdevači podataka. Na primer snabdevači podataka koji su ugrađeni u Visual Studio su npr za SQL Server (using System.Data.SqlClient;), OLE DB (using System.Data.OleDb;.) - za MS Access na primer. Ako se koristi povezivanje na bazu za koju nije direktno ugrađen snabdevač podacima u sam alat (Visual Studio u našem slučaju), tada se treba dodati snabdevač podataka za tu bazu. Na primer: ako koristimo MySQL, onda se dodatno postavlja MySql Connector (using MySql.Data.MySqlClient;),
Postoje dva osnovna načina rada: konektovani i diskonektovani.
Kod konektovanog scenarija resursi se uzimaju sa servera sve dok se konekcija ne zatvori. Korisnik je konstantno povezan na izvor podataka.
U diskonektovanom scenariju, podskup podataka iz baze podataka se kopira na lokalni računar, gde se radi dalja obrada tih podataka. Dok se korisnik nalazi u diskonektovanom radu, ostali korisnici mogu da koriste konekciju.
Iz ovoga se vidi da može da se desi da u diskonektovanom režimu rada podaci ne budu stalno ažurni (neko ih je izmenio dok smo mi radili na našoj kopiji). Za razliku od toga, kod konektovanog režima podaci su stalno ažurni. Nedostatak konektovanog rada je da mora da postoji konstantna mrežna konekcija.
Konektovani scenario
U ADO.NET-u postoje dva osnovna načina rada: konektovani i diskonektovani. Kod konektovanog scenarija resursi se uzimaju sa servera sve dok se konekcija ne zatvori. Korisnik je konstantno povezan na izvor podataka. Prednost konektovanog scenarija je da su podaci uvek ažurni, konkuretni pristup resursima servera se lakše kontroliše. Nedostatak konektovanog rada je da mora da postoji konstantna mrežna konekcija.
Korišćenje ADO.NET klasa u konektovanom scenariju
Redosled izvršavanja operacija pri radu u konektovanom scenariju je : otvaranje konekcije, izvršavanje komande, obrada zapisa u reader-u, zatvaranje reader-a i zatvaranje konekcije.
Diskonektovani scenario
U diskonektovanom scenariju podskup podataka iz baze podataka se kopira na lokalnom računaru. Dok se korisnik nalazi u diskonektovanom radu ostali korisnici mogu da koriste konekciju. Podaci koji predstavljaju lokalnu kopiju dela baze podataka nisu uvek ažurni. Kada se podacima iz lokalne kopije podataka ažurira baza može doći do konflikta.
Korišćenje ADO.NET klasa u diskonektovanom scenariju
Redosled izvršavanja operacija pri radu u diskonektovanom scenariju je: otvaranje konekcije, punjenje DataSet objekta podacima iz baze, zatvaranje konekcije, obrada podataka u DataSet-u, ponovo otvaranje konekcije, ažuriranje baze podataka podacima iz DataSet-a, zatvaranje konekcije.
Data Provider
Veza sa bazom podataka realizuje se i održava pomoću ADO.NET komponente Data Provider. Data Provider je u stvari skup komponenti koje zajedničkom funkcionalnošću obezbeđuju efikasnu komunikaciju između baze podataka i aplikacije. Microsoft.NET Framework trenutno isporučuje neke vrste provajdera (snabdevača, isporučilaca) podataka počev od: SQL Server .NET Data Provider koji je dizajniran za rad sa Microsoft SQL Serverom i OleDb .NET Data Provider koji povezuje aplikaciju sa drugim vrstama baza podataka.
(Ako ćete koristiti MySQL, treba da instalirate MySql Data Provider)
Svaki Data Provider sastoji se od (međusobno sličnih) sledećih komponentnih klasa.
-
Connection objekat omogućava konekciju sa bazom podataka
-
Command objekat sadrži informaciju o SQL SELECT upitu ili INSERT, UPDATE, DELETE naredbi koja se sprovodi nad bazom podataka.
-
The DataReader objekat (recordset) koji učitava podatke u direktnoj konekciji sa bazom podataka.
-
The DataAdapter objekat popunjava diskonektovani DatSet ili DataTable sa odgovarajućim podacima i ažurira podatke u DB.
Scenario pristupa podacima korišćenjem ADO.NET komponenti odvija se na sledeći način:
Objekat Connection uspostavlja vezu između baze podataka i aplikacije. Ta konekcija se koristi za pristup bazi direktno pomoću Command objekta ili pomoću objekta DataAdapter. Command objekt obezbeđuje realizaciju odgovarajućeg SQL upita u direktnoj komunikaciji sa bazom držeći sve vreme pristupa konekciju otvorenom. U slučaju da vraća više od jedne vrednosti Command objekt vraća aplikaciji DataReader objekt kao snabdevača aplikacije podacima. Podaci dobijeni na ovaj način mogu biti direktno procesuirani od strane logike aplikacije. Drugi način snabdevanja aplikacije podataka realizuje se indirektno pomoću DataAdapter objekta koji popunjava objekat DataSet. Ažuriranje podataka u bazi od strane aplikacije može se izvesti korišćenjem ili objekta Command ili pomoću objekta DataAdapter.
* Connection objekat sadrži sve podatke neophodne za realizaciju konekcije aplikacije sa bazom podataka.
Sve informacije neophodne za uspostavljanje komunikacionog kanala između aplikacije i baze podataka sadržani su u osobini ConnectionString objekta Connection.
*Command objekat koristimo za izvršavanje različitih SQL naredbi nad bazom podataka pomoću odgovarajuće konekcije. Command objekti sadrže tri metode koje se koriste za izvršavanje različitih naredbi nad bazom podataka:
- ExecuteNonQuery - Izvršava naredbe koje ne vraćaju informacije aplikaciji već su usmerena ka bazi (INSERT, UPDATE, ili DELETE).
- ExecuteScalar - Vraća aplikaciji pojediničnu vrednost pomoću SQL upita (na primer GROUP BY… HAVING struktura) .
- ExecuteReader - Vraća rezultate pomoću DataReader objekta.
*DataReader objekt vrši direktan brzi pristup bazi. Ovaj objekt drži konekciju aplikacije sa bazom otvorenom sve vreme i ima mogućnost učitavanja podataka iz baze u samo jednom prolazu bez iteracija (forward-only, read-only). Za razliku od ostalih ADO.NET komponenti nemoguće je napraviti direktnu instancu ovog objekta već se on vraća aplikaciji pomoću ExecuteReader metode objekta Command. Koristi se u slučajevima kada nije neophodno čuvati redove tabela u lokalnoj memoriji računara već ih logika aplikacije odmah koristi. Ovaj objekt dakle vraća jedan po jedan red tabele aplikaciji u direktnoj vezi aplikacije i baze i omogućava najbrži mogući transfer podataka. Nedostatak je što zahteva ekskluzivan pristup Connection objektu za vreme trajanja izvršavanja DataReader objekta.
*DataAdapter je klasa koja omogućava realizaciju diskonektovane ADO.NET arhitekture pristupa podacima. Ovaj objekat realizuje sve elemente komunikacije između baze podataka i objekta DataSet. DataAdapter popunjava objekte DataTable ili DataSet sa podacima iz baze pozivom svoje Fill metode. Nakon manipulacije navedenim podacima smeštenim u lokalnoj memoriji DataAdapter pozivanjem svoje Update metode omogućava ažuriranje baze modifikovanim podacima.
DataAdapter nudi četiri svoje osobine koje reprezentuju odgovarajuće SQL naredbe:
- SelectCommand. Sadrži tekst SQL naredbe (objekt) koji selektuje podatke iz baze podataka. SQL naredba se izvršava pozivom Fill metode popunjavajući objekte DataTable ili DataSet.
- InsertCommand. Sadrži tekst SQL naredbe (objekt) koji insertuje jedan red u tabelu.
- DeleteCommand. Sadrži tekst SQL naredbe (objekt) koji briše jedan red iz tabele.
- UpdateCommand. Sadrži tekst SQL naredbe (objekt) koji ažurira podatke u bazi podataka.
******************
Kreiranje konekcije ka bazi podataka iz programskog koda
Pre pribavljanja ili izmene podataka neophodno je kreirati konekciju ka izvoru podataka. Broj raspoloživih konekcija je ograničen pa je potrebno držati konekciju otvorenom što je kraće moguće. Konekcija ka izvoru podataka u ADO.NET-u enkapsulirana je klasom Connection. Prilikom kreiranja instance klase Connection neophodno je definisati ConnectionString atribut ove klase. ConnectionString atribut predstavlja formatirani niz karaktera sastavljen od niza ime/vrednost parova odvojenih međusobno karakterom ‘;’. Ovaj atribut najčešće sadrži informacije o imenu mašine kojoj pristupamo, načinu autentifikacije korisnika, imenu baze kojoj pristupamo i sl.
Kreiranje Connection objekta može se izvršiti pozivom podrazumevanog konstruktura. Zatim se preko svojstva ConnectionString definišu parametri konekcije koji se pišu u obliku stringa. Drugi način kreiranja Connection objekta je da se konstruktoru ove klase prosledi string koji opisuje konekciju na bazu podataka.
U nastavku je dat primer kreiranja konekcije korišćenjem MySQL data provider-a. Kreiranje konekcijeMySqlConnection conn = new MySqlConnection();
conn.ConnectionString = "server=localhost;user id="Pera";password="test1";database=testDB";
Pre korišćenja konekcije neophodno je eksplicitno otvoriti konekciju:
Otvaranje konekcije
conn.Open();
Nakon eksplicitnog poziva funkcije za otvaranje konekcije, otvorena je i aktivna konekcija ka bazi podataka. Nakon završetka obrade podataka neophodno je zatvoriti konekciju pozivom funkcije za zatvaranje konekcije:
Zatvaranje konekcije
conn.Close();
Objekti klase Connection poseduju skup atributa kojima je moguće upravljati tokom izvršenja transakcija nad bazom podataka i pribaviti informacije vezane za izvor podataka kome se pristupa.
*******************
Kreiranje SQL komande
Nakon kreiranja konekcija ka bazi podataka, neophodno je izvršiti SQL naredbe za manipulaciju nad podacima.
Command objekat dozvoljava direktan pristup podacima u bazi u konektovanom okruženju. Ovaj objekat sadrži referencu na SQL komandu ili uskladištenu proceduru koje se mogu izvršavati direktno. Koristeći odgovarajući Comand objekat moguće je izvršavati Select, Insert, Update i Delete naredbe nad elementima baze podataka.
Ukoliko koristimo MySQL data provider, SQL naredbe se izvršavaju korišćenjem instanci klase MySqlCommand tj. korišćenjem MySqlCommand objekta.
Prilikom kreiranja komande moguće je navesti SQL upit kao argument konstruktora objekta ili korišćenjem CommandText atributa MySqlCommand objekta. Prilikom kreiranja komande neophodno je navesti konekciju koja će se koristiti za izvršenje komande. Konekciju je moguće navesti kao argument konstruktora objekta ili korišćenjem Connection atributa MySqlCommand objekta.
Kreiranje komande (jedan od načina)
MySqlConnection conn = new MySqlbConnection(); conn.ConnectionString = "server=localhost;user id="Sima";password="xxx";database=test2"; String strSQL = "Select * from RADNIK"; MySqlCommand newComm = new MySqlCommand( ); newComm.Connection = conn; newComm.CommandText = strSQL;
Prosto kreiranje MySqlCommand objekta, ili bilo koje druge komande ako se koristi neki drugi data provider umesto MySQL data provider-a, ne znači da je SQL upit sadržan u komandi automatski prosleđen na izvršenje. Objekat koji predstavlja komandu je nakon kreiranja samo pripremljen za dalju upotrebu. Najbitnije metode članice MySqlCommand objekta prikazane su u tabeli:
|
Metoda |
Značenje |
|
Cancel() |
Poništava izvršenje komande |
|
ExecuteReader() |
Povratna vrednost funkcije je DataReader objekat izabranog data provider-a |
|
ExecuteNonQuery() |
Izvršava komandu od koje se ne očekuje da kao povratne vrednosti daje podatke |
|
ExecuteScalar() |
Varijanta ExecuteNonQuery() koja kao povratnu vrednost vraća jedan podatak |
U nastavku su video snimci sa Youtube-a koji vam mogu pomoći u savladavanju pojedinih delova lekcije, a nakon video snimaka su linkovi ka nekim gotovim primerima
U nastavku obratite pažnju na prezentaciju koja ide na videu, a TON ISKLJUČITE, pošto je na jeziku koji ne razumemo - ono što nama treba je prezentacija koja je na engleskom jeziku: