16.10 Rad u konektovanom okruženju
(blok 1 - prva 3 časa)
U ADO.NET-u postoje dva osnovna načina rada: konektovani i diskonektovani.
U slučaju konektovanog rada, resursi se uzimaju sa servera sve dok se konekcija ne zatvori. Korisnik je konstantno povezan na izvor podataka.
Prednost konektovanog rada je da su podaci uvek ažurni.
Nedostatak konektovanog rada je da se sa bazom mora biti konstantno povezan preko mreže, što znači da je ovaj način zgodniji samo za manje projekte i manje izmene, tj rad sa manjom količinom podataka.

Ovde je prikazan blok dijagram pristupa bazi podataka primenom ADO.NET -a, u konektovanom režimu rada.
Redosled izvršavanja operacija pri radu u konektovanom okruženju je:
-
otvaranje konekcije,
-
izvršavanje komande,
-
obrada zapisa u Reader-u,
-
zatvaranje Reader-a
-
i zatvaranje konekcije.
(U vašem praktičnom radu, u zavisnosti od snabdevača podataka, na početak dodajete odgovarajući nastavak, npr za MySQL je MySqlCommand, …)
Objekat klase Command
U konektovanom režimu rada, objekat klase Command omogućava direktan pristup podacima u bazi. Ovaj objekat sadrži referencu na SQL komandu ili uskladištenu proceduru koje se mogu izvršavati direktno. Ako se kao snabdevač podataka izabere MySQL Server .NET snabdevač, odgovarajući komandni objekat se dobija instanciranjem klase MySqlCommand. Ako se kao snabdevač podataka odabere OLE DB.NET snabdevač podataka, komandni objekat se dobija instanciranjem klase OleDbCommand. Koristeći odgovarajući Command objekat moguće je izvršavati SELECT, INSERT, UPDATE i DELETE naredbe nad elementima baze podataka.
Koja su nam Svojstva od značaja (zasad):
CommandText – tekst SQL komande ili naziv uskladištene procedure koje treba izvršiti.
CommandType – tip komande (podrazumevano je Text ali možete postaviti npr StoredProcedure).
Connection – ukazaje na Connection objekat koji se koristi za komuniciranje sa bazom podataka.
* Konekcija mora biti otvorena pre izvršavanja komande! *
Parameters – Kolekcija objekata koja sadrži ulazne, izlazne i dvosmerne (ulazno/izlazne) parametre. Koristi se za parametarske upite i pozive uskladištenih procedura. Svaki komandni objekat može imati nula ili više parametara što se specificira svojstvom Parameters.
Metode objekta Command
ExecuteScalar metoda se koristi za izvršavanje upita koji vraća samo jednu vrednost.
ExecuteNonQuery metoda se koristi za izvršavanje INSERT, UPDATE i DELETE komande
ExecuteReader se koristi za izvršavanje SELECT komandi koje vraćaju skup zapisa.

1. (MySql) Primer: Kako se izvršava upit koji vraća skalarnu vrednost ? (klik da vidite/sakrijete)
Primer izvršavanja upita koji vraća jednu vrednost je dat u nastavku. ( U ovom primeru koristimo verziju MySQL )
Korišćenjem objekta Command izvršava se upit SELECT COUNT(*) FROM City koji daje broj zapisa u tabeli City. Prvi parametar MySqlCommand konstruktora predstavlja tekst SQL komande ili naziv procedure sa kojom se radi. Drugi parametar je odgovarajući MySqlConnection objekat pomoću koga se vrši konekcija na bazu podataka.
void izvrsiSkalar()
{
String konekcioniString = @"server=localhost;user id=root;password=;database=world";
MySqlConnection mojaKonekcija = new MySqlConnection(konekcioniString);
String skalarniUpit = "SELECT COUNT(*) FROM city";
MySqlCommand mojaSkalarKomanda = new MySqlCommand(skalarniUpit, mojaKonekcija);
try
{
mojaKonekcija.Open();
int brojZapisa = Convert.ToInt32(mojaSkalarKomanda.ExecuteScalar());
poruka.Text = "U tabeli se nalazi : " + brojZapisa.ToString() + " zapisa";
}
catch (MySqlException xcp)
{
poruka.Text = xcp.Message;
}
finally
{
if(mojaKonekcija != null)
mojaKonekcija.Close();
}
}
Vežba 1 - Kreirati aplikaciju u kojoj se prilikom pokretanja prikazuje koliko ima redova u jednoj tabeli.
Način rada: upotrebite metodu koja se nalazi iza prethodnog dugmeta i pozovite je iz Form1_Load-a.
Na Formi treba da imate samo jednu labelu kojoj ćete promeniti naziv u poruka
2. (MySql) Primer: Izvršavanje INSERT (UPDATE i DELETE komande)
Sledeći kod je primer izvršavanja INSERT upita nad tabelom Country koja se nalazi u bazi podataka world.
void IzvrsiUnos()
{
string konekcioniString = @"server=localhost;user id=root;password=;database=world";
MySqlConnection mojaKonekcija = new MySqlConnection(konekcioniString);
String InsertUpitCountry = "INSERT INTO Country (Code, Name, Capital) Values ";
/* ('MNE','Crna Gora','Podgorica')"; - moze i ovako */
InsertUpitCountry += "(' " + tbKodDrzave.Text + "' , '" + tbDrzava.Text + " ',' " + tbGlavniGrad.Text + " ');";
MySqlCommand mojaInsertKomanda = new MySqlCommand(InsertUpitCountry, mojaKonekcija);
try
{
mojaKonekcija.Open();
mojaInsertKomanda.ExecuteNonQuery();
poruka2.Text = "Ubacen red u bazu";
}
catch(MySqlException xcp)
{
poruka2.Text = "Greška: " + xcp.Message;
}
finally
{
if(mojaKonekcija != null) mojaKonekcija.Close();
}
}
Vežba 2: Na formu dodati deo gde će da se unese nova država u tabelu Country.
Način rada: treba vam 3 labele za oznaku 3 textBox-a (tbDrzava, tbKodDrzave, tbGlavniGrad) i još jedna labela za ispis poruke (poruka2). Upotrebite metodu koja se nalazi iza prethodnog dugmeta i pozovite je iz događaja klika na dugme.
Dodatni zadatak (u zavisnosti od grupe):
- Dodati deo kojim se u dodatni tekstBox upisuju slova na koja tražene države treba da počnu , pa da se ispišu nazivi država koje počinju na ta slova
DataReader
DataReader je brz (Read-only, Forward-only) kursor koji se pomera kroz skup zapisa. Svaki DataReader objekat implementira IDataReader interfejs. Pristup podacima korišćenjem objekta DataReader sastoji se od sledećih koraka:
-
kreira se Command objekat sa odgovarajućim SELECT upitom,
-
kreira se objekat Connection i otvara se,
-
izvršava se ExecuteReader() metoda objekta Command koja vraća objekat DataReader-u,
-
koristeći Read() metodu objekta DataReader prolazi se kroz sve vrste
-
kada Read() metoda vrati false, zatvara se objekat DataReader i objekat Connection.
Svojstva i metode DataReader objekta
Read metoda čita zapis iz DataReader-a i vraća true ako ima još zapisa, false ukoliko se stiglo do poslednjeg zapisa. Podrazumevana pozicija DataReader-a je ispred prvog zapisa. Kada se korišćenjem Read metode pozicioniramo na određeni red u objektu, DataReader tada pojedinim ćelijama u redu pristupa na osnovu njihovog imena ili pozicije. Izraz dataReader[“ImeKolone”] je tipa object i mora se konvertovati u željeni tip podataka. Ukoliko želimo da pročitamo sadržaj druge ćelije, u kojoj znamo da se nalazi celobrojna vrednost, to se može uraditi korišćenjem izraza dataReader.GetInt32(1).
3. (MySql) Primer:
Čitanje skupa zapisa iz baze podataka upotrebom DataReader objekta
iz tabele Country koja se nalazi u bazi podataka world. (klik da vidite/sakrijete)
Vežba 3: Na formu dodati deo gde će da se ispiše određen broj država iz tabele Country.
Način rada: treba vam jedna labela i jedan textBox u koji treba da korisnik unese koliko država da se prikaže.
Za promenu, ovaj put se imena država prikazuju u MessageBox-u - po jedna država po poruci (ako unesete prevelik broj, možda ćete da zaustavljate proces pomoću task manager-a)
public void Citaj()
{
MySqlDataReader myReader = null;
string konekcioniString = @"server=localhost;user id=root;password=;database=world";
MySqlConnection mojaKonekcija = new MySqlConnection(konekcioniString);
String mojSelectUpit = "SELECT Name, Code FROM country WHERE 1 LIMIT ";
mojSelectUpit += tbBrojDrzava.Text;
MySqlCommand mojaSelectKomanda = new MySqlCommand(mojSelectUpit, mojaKonekcija);
try
{
mojaKonekcija.Open();
myReader = mojaSelectKomanda.ExecuteReader();
while(myReader.Read())
{
MessageBox.Show(myReader["Name"].ToString() +"\t"+ myReader["Code"].ToString());
}
}
catch(Exception ec)
{
MessageBox.Show(ec.ToString());
}
finally
{
if(myReader != null) myReader.Close();
if(mojaKonekcija.State == ConnectionState.Open) mojaKonekcija.Close();
}
}
Dodatni zadaci (u zavisnosti od grupe):
- Ispisati u poruci (poruka3) koliko ima država čiji naziv počinje na slovo A
- Dodati deo kojim se u dodatni tekstBox upisuju slova na koja tražene države treba da počnu , pa da se ispiše koliko ima država koje počinju na ta slova
Za bolje učenike (opcija koja bi nekome mogla doći u okvuru zadatka za ocenu):
- Ispod svega dodati 2 labele i 2 comboBox-a:
- Država: comboBox1 ima gradove combobox2
- Prvo promeniti nazive za comboBox komponente (cbDrzava, cbGrad).
- Šta je potrebno postići: Prilikom učitavanja forme treba da se prvi comboBox popuni sa svim državama koje postoje u bazi World. Izborom neke od država treba da se nazivi svih gradova iz odabrane države nalaze u drugom combBox-u.