03.04. Korišćenje DataReader objekta i rad u konektovanom okruženju
Teorija - (i proučiti kod kuće)
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.
Podsetite se:
Konekcioni string – osnovne komponente
- Server – može biti
localhost,.ili IP adresa. - Database – naziv baze.
- Authentication:
- Korisnička:
User Id=sa;Password=lozinka; - Windows:
Integrated Security=True;
- Korisnička:
Primeri konekcionog stringa
string connectionString1 = "Server=localhost;Database=Skola;User Id=sa;Password=lozinka;";
string connectionString2 = "Server=.;Database=Skola;Integrated Security=True;";
Osnovne SQL komande
- SELECT – čitanje podataka
- INSERT – dodavanje podataka
- UPDATE – ažuriranje podataka
- DELETE – brisanje podataka
System.Data.SqlClient1. Šta je DataReader?
DataReader je objekat u ADO.NET koji omogućava brzo i efikasno čitanje podataka iz baze, ali samo u forward-only i read-only režimu, što znači:
-
Može se kretati samo napred kroz rezultate.
-
Ne može menjati podatke.
-
Koristi manje memorije u poređenju sa DataSet-om.
-
Radi u konektovanom režimu, tj. konekcija sa bazom ostaje otvorena dok se podaci čitaju.
Kada koristiti DataReader?
Koristimo ga kada želimo da brzo čitamo podatke bez potrebe za izmenama ili kretanjem unazad.
Zapamtite:
- Potrebno je otvoriti konekciju sa bazom pre korišćenja (ili koristiti using blok)
- DataReader ne može da se kreira samostalno sa new, već ga isključivo kreira komandni objekat!
- Koristimo ga kada želimo samo da čitamo podatke.
- Potrebno je ručno zatvoriti DataReader nakon korišćenja.
- Potrebno je zatvoriti konekciju sa bazom nakon korišćenja (ako se ne koristi using).
Učitavanje podataka iz baze (konektovani režim rada)
Osnovni primer korišćenja DataReader-a (učitavanje podataka iz baze)
using System; using System.Data.SqlClient; class Program { static void Main() { string connectionString = "Server=localhost;Database=Skola;User Id=sa;Password=lozinka;"; using (SqlConnection konekcija = new SqlConnection(connectionString)) { try { konekcija.Open(); string upit = "SELECT Ime, Prezime FROM Ucenici"; SqlCommand komanda = new SqlCommand(upit, konekcija); SqlDataReader reader = komanda.ExecuteReader(); while (reader.Read()) { Console.WriteLine("Ime: " + reader["Ime"] + ", Prezime: " + reader["Prezime"]); } reader.Close(); } catch (Exception ex) { Console.WriteLine("Greška: " + ex.Message); } } } }
3. Vežba:
- Kreirati aplikaciju koja prikazuje spisak učenika iz baze koristeći DataReader.
- Modifikovati upit da prikazuje samo učenike čije ime počinje na slovo "P".
- Dodati proveru da li tabela sadrži podatke pre nego što ih prikaže.
- za bolje učenike: Omogućiti korisniku unos SQL upita koji se izvršava i prikazuje rezultate u konzoli.
******* Čitanje podataka uz proveru postojanja podataka ******
if (reader.HasRows) {
while (reader.Read()) {
Console.WriteLine("Ime: {0}, Prezime: {1}", reader["Ime"], reader["Prezime"]);
}
} else {
Console.WriteLine("Nema podataka.");
}
Za bolje učenike koji su sve uradili (da im ne bude dosadno na času) ili kao domaći zadatak:
-
Proširiti aplikaciju tako da korisnik može da unese ID učenika i da mu se prikažu podaci samo za tog učenika.