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:

  1. otvaranje konekcije,

  2. izvršavanje komande,

  3. obrada zapisa u Reader-u,

  4. zatvaranje Reader-a

  5. 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.



(MySql) Primer: Kako se izvršava upit koji vraća skalarnu vrednost ?

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();
}

(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();
}
}

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:

  1. kreira se Command objekat sa odgovarajućim SELECT upitom,

  2. kreira se objekat Connection i otvara se,

  3. izvršava se ExecuteReader() metoda objekta Command koja vraća objekat DataReader-u,

  4. koristeći Read() metodu objekta DataReader prolazi se kroz sve vrste

  5. 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).

(MySql) Primer: Čitanje skupa zapisa iz baze podataka upotrebom DataReader objekta
iz tabele City koja se nalazi u bazi podataka world. (klik da vidite)
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, CountryCode FROM city WHERE 1 LIMIT ";

mojSelectUpit += Convert.ToInt32(tbBrojDrzava.Text);

MySqlCommand mojaSelectKomanda = new MySqlCommand(mojSelectUpit, mojaKonekcija);

try
{
mojaKonekcija.Open();
myReader = mojaSelectKomanda.ExecuteReader();

while(myReader.Read())
{
MessageBox.Show(myReader["Name"].ToString() +"\t"+ myReader["CountryCode"].ToString());
}
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
finally
{
if(myReader != null) myReader.Close();
if(mojaKonekcija.State == ConnectionState.Open) mojaKonekcija.Close();
}
}


Video lekcija u kojoj je demonstriran pristup različitim bazama podataka, sa različitim Data Providerima je u nastavku:

Pristup bazi podataka korišćenjem DataReader-a from V. P. Filko on Vimeo.

Fajlovi koje možete da iskoristite prilikom vežbanja na osnovu postavljenog video snimka:

opciono: ACCESS baza B1 (.accdb)

MySQL: Upiti kojima se kreira sve u bazi (XAMPP - ali prvo kreirajte bazu pod nazivom B1_izlozbePasa)



Korišćenje DataReader objekta

Nakon uspostavljanja konekcije ka bazi podataka i kreiranja SQL upita, neophodno je izvršiti kreirani upit kako bi se pribavili podaci. Jedan način za pribavljanje podataka je korišćenje DataReader objekata.

DataReader objekti mogu samo da čitaju podatke i to red po red unapred. Imajući ovo u vidu, jasno je da je upotreba DataReader objekata korisna samo u situacijama kada je kreirani upit SELECT SQL naredba. DataReader objekti posebno se koriste kada je potrebno brzo proći kroz veliku količinu podataka pri čemu nije potrebno posedovati lokalne kopije jednom očitanih podataka.

DataReader objekti kreiraju se pozivom ExecuteReader() metode kreirane komande. Nakon kreiranja DataReader objekta, jedan red rezultujuće tabele podataka pribavlja se korišćenjem Read() metode.

Ukoliko pretpostavimo da je kreirana konekcija ka bazi, da bi se očitali podaci iz baze podataka neophodno je napisati SQL upit koji selektuje potrebne informacije, kreirati komandu koja će izvršiti upit i kreirati DataReader objekat koji će pribaviti podatke. U nastavku će biti prikazan deo programskog koda koji izvršava selektovanje svih redova iz tabele RADNIK u bazi podataka PROBA.

MySqlConnection conn = new MySqlConnection();
  conn.ConnectionString = "server=localhost;user id=ucenik;password=test;database=proba";
  String strSQL = "Select * from RADNIK";
  MySqlCommand comm = new MySqlCommand(strSQL, conn);
  MySqlDataReader reader;
  conn.Open();
  reader = comm.ExecuteReader();
  while (reader.Read())
   {
    //programski kod koji vrši obradu pribavljenih podataka
   }
  conn.Close();

Pored izvršenja SQL upita koji vrše selektovanje podataka, moguće je izvršiti SQL upite koji vrše dodavanje, izmenu ili brisanje podataka iz baze podataka. U nastavku će biti prikazan deo programskog koda koji vrši dodavanje novog radnika, izmenu podataka o radniku i briše podatke o radniku u tabeli RADNIK baze podataka PROBA.

MySqlConnection conn = new MySqlConnection();
  conn.ConnectionString = "server=localhost;user id=ucenik;password=test;database=proba";
  try
  {
   conn.Open();
   //dodavanje novog radnika
    String strSQL1 = "Insert into RADNIK values (123456781,'Marko', 'J', 'Petrovic', '2/9/1965', 'Obilićev Venac', 'M', '30000',333445555, 5)";
    MySqlCommand comm1 = new MySqlCommand(strSQL1, conn);
    comm1.ExecuteNonQuery();
    //izmena podataka o radniku
     String strSQL2 = "Update RADNIK set Plata=50000 where MatBr=123456781";
    MySqlCommand comm2 = new MySqlCommand(strSQL2, conn);
    comm2.ExecuteNonQuery();
   //brisanje podataka o radnikuString strSQL3 = "Delete from RADNIK where MatBr=123456781";
   MySqlCommand comm3 = new MySqlCommand(strSQL3, conn);
   comm3.ExecuteNonQuery();
  }
  catch (Exception exc)
  {
   //obrada izuzetka
  }
  finally
  {
   conn.Close();

  }

PREPORUKA: dobra je praksa koristiti try – catch – finally blok. Ako dođe do izuzetka (nešto ne valja – ne radi) da se izuzetak obradi, i u svakom slučaju, da se na kraju zatvori konekcija

Često je neophodno parametrizovati upite koji se prosleđuju bazi podataka na osnovu podataka koje su korisnici uneli u aplikaciju. Kako bi prosleđivanje podataka koje su korisnici uneli bilo što sigurnije, ADO.NET poseduje mogućnost kreiranja parametrizovanih komandi. Svaka ADO.NET komanda poseduje kolekciju individualnih parametara. Svaki od parametara predstavlja nezavisni objekat koji je moguće kreirati i dodati u kolekciju ADO.NET Command objekta. Parametri zauzimaju određeno mesto u SQL upitu koji komanda izvršava. Kako bi se ukazala pozicija u SQL upitu na kojoj će se naći određeni parametar, koristi se prefix @ praćen imenom odgovarajućeg parametra. U nastavku će biti prikazan primer kreiranja i izvršenja parametrizovane komande pri čemu se koristi MySql data provider. U slučaju korišćenja MySql data provider-a, parametri su instance klase MySqlParameter.

MySqlConnection conn = new MySqlConnection();
  conn.ConnectionString = "server=localhost;user id=ucenik;password=test;database=proba";
  //kreiranje parametra
  MySqlParameter param = new MySqlParameter();
  param.ParameterName = "@parameter";
  param.MySqlDbType = MySqlDbType.VarChar;
  param.Value = "Marko";
  //kreiranje parametrizovanog upita:
  String strSQL = "Select * from RADNIK where Ime=@parameter";
  MySqlCommand comm = new MySqlCommand(strSQL, conn);
  //dodavanje parametra u kolekciju parametara komande
  comm.Parameters.Add(param);
  try{
    conn.Open();
    MySqlDataReader dr = comm.ExecuteReader();
    while (dr.Read())
    {
     //obrada podataka
    }
  }
  catch (Exception exc)
    { }
  finally
  {
    conn.Close();
  }
Last modified: Thursday, 2 October 2025, 11:21 AM