14.09. Klase Data Providera za kreiranje konekcionog i komandnog objekta - teorija i vežbe
Na početku je teorijski deo - pojmovi koje pominjemo na času i objašnjenja
Na kraju su dve vežbe koje su prikazane u obliku video snimaka (klik na naziv vežbe za direktan prelazak na nju):
Data provider je najlakše posmatrati kao skup tipova objekata definisanih u određenom prostoru imena (eng. namespace) koji imaju mogućnost direktne komunikacije sa konkretnim DBMSom.
Svaki od data provider-a poseduje skup klasa koje omogućavaju izvršenje osnovnih funkcionalnosti. Sve klase konkretnih data provider-a imaju zajedničke roditeljske klase tj izvedene su iz istog skupa klasa i interfejsa, koji se nalaze u System.Data.Common prostoru imena odnosno u System.Data prostoru imena.
Osnovne klase ADO.NET Data Provider-a:
| Klasa | Za šta koristimo objekte klase | |
|---|---|---|
| Connection | Omogućava otvaranje i zatvaranje konekcije ka bazi podataka | |
| Command | Predstavlja SQL upit ili uskladištenu proceduru. Omogućava pristup DataReader objektu konkretnog data provider-a | |
| DataReader | Omogućava čitanje podataka red po red | |
| DataAdapter | Prenosi DataSet objekte između klijenta i izvora podataka. Poseduje konekciju i skup od četiri osnovne operacije za selektovanje, dodavanje, izmenu i brisanje podataka u izvoru podataka | |
| Parameter | Predstavlja imenovani parametar u parametrizovanom upitu |
Iako će se imena konkretnih objekata svakog od konkretnih Data Provider objekata razlikovati (npr. SqlConnection, OracleConnection, OdbcConnection ili MySqlConnection), svi su izvedeni iz iste klase i implementiraju iste interfejse pa je nakon savladavanja korišćenja jednog od data provider-a relativno jednostavno koristiti sve ostale.
Microsoft .NET platforma poseduje niz ugrađenih data provider-a za različite DBMS-ove.
Spisak ugrađenih data provider-a:
| Data Provider | Prostor imena (namespace) |
|---|---|
| OLE DB | System.Data.MySql |
| Microsoft SQL Server | System.Data.SqlClient |
| Microsoft SQL Server Mobile | System.Data.SqlServerCe |
| ODBC | System.Data.Odbc |
| Oracle | System.Data.OracleClient |
Pored data provider-a koji su ugrađeni u .NET platformu, moguće je koristiti data provider-e koje obezbeđuju pojedinačni proizvođači besplatnih ili komercijalnih DBMS-ova poput SQLite, DB2, MySQL, PostgreSQL ili Sybase.
Drugim rečima, da biste radili da bazama, sem što morate imati using System.Data; u zavisnosti koji DBMS koristite, trebate dodati i using System.Data.(deo koji se odnosi na vaš DBMS) - od kojih su neki navedeni u prethodnoj tabeli.
Direktan pristup podacima korišćenjem ADO.NET-a
Najlakši način izvršenja svih operacija nad bazom podataka je direktno izvršenje svih operacija pri čemu se ne vodi računa o lokalnim kopijama podataka.
Ovakav način izvršenja operacija nad bazom podataka je dobro rešenje kada je potrebno pročitati podatke ili izmeniti podake u jednom redu neke od tabela relacione baze podataka. Ovakav pristup nije efikasan ukoliko je potrebno modifikovati više različitih redova iz jedne ili više tabela.
Redosled operacija prilikom pribavljanja podataka korišćenjem ovakvog pristupa sastoji se iz sledećih koraka:
1. Kreirati Connection, Command i DataReader objekte
2. Otvoriti konekciju
3. Koristiti DataReader za čitanje podataka iz baze podataka
4. Zatvoriti konekciju
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
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.
Connection objekat takođe podržava izvršavanje transakcija nad bazom podataka.
Command
Možemo koristiti Command objekte za izvršavanje različitih SQL naredbi nad bazom podataka pomoću odgovarajuće konekcije. Pomoću ovog objekta možemo koristiti za egzekuciju uskladištenih procedura na strani servera, izvršiti SQL naredbe ili vratiti direktno aplikaciji kompletne tabele iz baze. 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
DataReader objekt vrši direktan brzi pristup bazi. Ovaj objekt (recordset komponenta) 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
DataAdapter je klasa koja omogućava realizaciju diskonektovane ADO.NET arhitekture pristupa podacima. disconnected data access. 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.
Potrebno je ponoviti deo lekcije od pre nedelju dana:
14.09 (b) Kreiranje konekcije ka bazi podataka
Pre pribavljanja ili izmene podataka neophodno je kreirati konekciju ka izvoru podataka.
Prilikom kreiranja instance klase Connection neophodno je definisati ConnectionString, koji sadrži informacije o imenu mašine kojoj pristupamo, načinu autentifikacije korisnika, imenu baze kojoj pristupamo i sl.
Primer kreiranja konekcije za MS SQL Server:
| Data Provider | Kako se kreira konekcija | |
|---|---|---|
| Microsoft SQL Server | SqlConnection conn = new
SqlConnection(); |
A kako da se povežemo na koristimo MySql?
Microsoft Visual Studio ne dolazi sa ugrađenom podrškom za MySQL !
Prvo treba biti svestan da za MySQL treba instalirati MySqlConnector.
Iako od verzije Visual Studio 2015 pa nadalje, postoji i dodatak „MySQL for Visual Studio“ koji omogućava lakši rad ( pristup vizuelnim alatima ), u školi i dalje koristimo stariju verziju.
Tek kada na računaru postoji instaliran MySqlConnector, može da se kreira konekcija korišćenjem MySql Data provider-a:
1.način:
MySqlConnection konekcija = new
MySqlConnection("server=localhost;user
id=ucenik;password=test;database=proba");
2.način:
MySqlConnection konekcija = new
MySqlConnection();
konekcija.ConnectionString = "server=localhost;user id=ucenik;
password=test; database=proba";
3.način:
string konekcioniString =
"server=localhost;user
id=ucenik;password=test;database=proba";
MySqlConnection konekcija = new
MySqlConnection(konekcioniString);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();
Obrada izuzetaka (preporuka)
Preporučuje se da se operacije nad bazom podataka koje mogu da dovedu do greške u program pišu unutar try bloka. Unutar try bloka vrši se i otvaranje konekcije pozivom metode Open objekta klase Connection. Samo kreiranje konekcije trebalo bi da bude izvan try bloka jer bi u protivnom ograničili oblast važenja ovog objekta. Ukoliko dođe do izuzetaka oni su objekti klase Connection. Poželjno je i definisanje finally bloka u kojem će se vršiti zatvaranje konekcije bez obzira da li je pri izvršavanju sql komandi došlo do grešaka ili nije.
try
{ con.Open(); // (Izvrsavanje ADO.NET komandi)
}catch (MySqlException err)
{
Console.WriteLine(err.ToString());
}
finally
{ con.Close();14.09. (c) Kreiranje komande
Nakon kreiranja konekcije 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 Command objekat moguće je izvršavati Select, Insert, Update i Delete naredbe nad elementima baze podataka.
Ukoliko koristimo Microsoft SQL Server data provider, SQL naredbe se izvršavaju korišćenjem instanci klase SqlCommand, tj korišćenjem SqlCommand objekta.
Ukoliko koristimo Oracle data provider, SQL naredbe se izvršavaju korišćenjem instanci klase OracleCommand, tj korišćanjam OracleCommand objekta.
Ukoliko koristimo MySQL data provider, SQL naredbe se izvršavaju korišćenjem instanci klase MySqlCommand, tj korišćenjem MySqlCommand objekta,
ako koristite Access bazu (.mdb), koristi se OleDbCommand, …
Prilikom kreiranja komande moguće je navesti SQL upit kao argument konstruktora objekta ili korišćenjem CommandText atributa SqlCommand 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.
SqlConnection conn = new
SqlConnection();
conn.ConnectionString = "Data Source=.;Initial
Catalog=BazaKnjiga;Integrated
Security=SSPI";
String strSQL = "Select * from Knjiga";
SqlCommand newComm = new SqlCommand();
newComm.Connection = conn;
newComm.CommandText = strSQL;Prosto kreiranje SqlCommand objekta, ili bilo koje druge komande, 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 SqlCommand 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 |
Prva vežba
Kako biste se mogli povezati sa bazom podataka iz aplikacije (u grafičkom režimu rada) ?
VIDEO prezentacija: Pristup bazi i upiti iz Visual Studija: