( drugim rečima, korišćenjem sloja sa raskinutom vezom )

Korišćenje Connection, Command i DataReader objekata podrazumeva da je veza ka izvoru informacija (bazi podataka) otvorena za sve vreme trajanja obrade podataka. Prednosti i mane ovakvog načina pristupanja podacima opisane su u prethodnim poglavljima. ADO.NET pored ovakvog načina pristupa podacima poseduje i drugačiji mehanizam, tzv. beskonekcioni pristup podacima ( korišćenjem sloja sa raskinutom vezom. )

Korišćenje beskonekcionog načina pristupa podacima zasnovano je na kreiranju lokalne kopije podataka koji se čuvaju u operativnoj memoriji klijentskog računara. Korišćenjem tipova objekata iz System.Data ADO.NET prostora imena moguće je kreirati lokalni model podataka koji će pored sirovih podataka posedovati veze između tabela, ograničenja primenjena na kolone, primarne ključeve, poglede i sve druge karakteristike modela podataka korišćenog za kreiranje baze podataka. Lokalni model podataka dozvoljava korisnicima kreiranje i izvršavanje upita nad lokalnim podacima, njihovo filtriranje, sortiranje i snimanje u bazu podataka.

U većini slučajeva neophodno je kreirati objekte koji predstavljaju konekciju i komandu. Za pribavljanje i ažuriranje podataka se u slučaju korišćenja sloja sa raskinutom vezom za pristup podacima koristi tzv. data adapter objekat, koji predstavlja instancu DataAdapter klase. Za razliku od direktnog pristupa podacima, podaci pribavljeni korišćenjem data adapter objekta se ne pribavljaju korišćenjem DataReader objekata. Data adapter objekti koriste DataSet objekte za prenos podataka od i ka bazi podataka. Svaki DataSet objekat može biti sastavljen od većeg broja DataTable (tabela podataka) objekata koji poseduju kolekcije DataRow (red tabele) i DataColumn (kolona tabele) objekata.

Data adapter objekat koji se koristi upravlja konekcijom ka bazi podataka automatski. Kako bi se poboljšala funkcionalnost, data adapter objekat će konekciju ka bazi držati otvorenom minimalni period vremena. Kada se na klijentskoj strani kreira DataSet objekat, data adapter će prekinuti konekciju sa bazom podataka ostavljajući potpuno samostalnu kopiju podataka na klijentskom računaru. Klijentska aplikacija može nakon toga nesmetano vršiti izmene nad pribavljenom kopijom podataka. Ovaj proces prikazan je na slici.

slika: Client App (DataSet)  <-> Data Adapter <-> Database

Da bi kreirali lokalnu kopiju podataka korišćenjem data adapter-a i DataSet objekata, neophodno je najpre kreirati konekciju ka bazi podataka i komandu na osnovu koje će biti kreirana lokalna kopija podataka. U nastavku je prikazan primer programskog koda koji vrši učitavanje svih radnika iz tabele radnik korišćenjem MySql data adapter-a.

***

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);
MySqlDataAdapter adapter = new MySqlDataAdapter(comm);
DataSet ds = new DataSet();
try
{
  conn.Open();
  adapter.Fill(ds, "Radnici");
}
catch (Exception exc)
{
  //obrada izuzetka
}
finally
{
  conn.Close();
}

***

Nakon kreiranja lokalne kopije podataka tj DataSet objekta, moguće je ažurirati pribavljene podatke. U nastavku je prikazan primer programskog koda koji vrši ažuriranje podataka o svim radnicima čije je ime Milos postavljajući im platu na vrednost 30000.

foreach (DataRow dr in ds.Tables["Radnici"].Rows)
{
  if (dr["Ime"].ToString() == "Milos")
  {
    dr["Plata"] = 30000;
  }
}

***

Moguće je takođe i obrisati neki od redova u lokalnoj kopiji podataka ili dodati novi red.

foreach(DataRow dr in ds.Tables["Radnici"].Rows)
{
  if(dr["Ime"].ToString() == "Milos")
  {
    dr["Prezime"] = "Bogdanović";
    dr["SSlovo"] = "M";
    dr["DatRodj"] = "1/1/2011";
    dr["Adresa"] = "Bulevar Nemanjića 5/11";
    dr["Plata"] = 20000;

    DataRow row = ds.Tables["Radnici"].NewRow();

    row["MatBr"] = 223456789;
    row["Ime"] = "Milos";
    row["Prezime"] = "Obilic";
    row["SSlovo"] = "M";
    row["DatRodj"] = "1/1/2011";
    row["Adresa"] = "Bulevar Nemanjića 8/11";
    row["Plata"] = 30000;
    ds.Tables["Radnici"].Rows.Add(row);
  }
}

***

Sve izmene učinjene na lokalnoj kopiji podataka mogu se snimiti u bazu podataka korišćenjem Update() metode DataAdapter objekta.

Snimanje podataka

MySqlCommandBuilder myMySqlCommandBuilder = new MySqlCommandBuilder(adapter);
adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
int izmenjeniRedovi = adapter.Update(ds,"Radnici");

***

ADO.Net održava informacije o originalnim i trenutnim vrednostima svih podataka koji se nalaze u DataSet objektu. Prilikom ažuriranja podataka, ADO.NET traži redove koji u potpunosti odgovaraju originalnim vrednostima podataka u redovima DataSet objekta i po pronalaženju ih zamenjuje novim redovima tj podacima iz redova lokalne kopije. U ovom trenutku lako je uočiti da će problem nastati ukoliko neki drugi korisnik izmeni podatke pre nego što naša aplikacija snimi izmenjene podatke. Naime, drugi korisnici mogu izmeniti podatke u bazi pa prilikom upoređivanja originalnih vrednosti lokalnih kopija podataka i podataka u bazi neće doći do poklapanja. U ovakvim situacijama desiće se izuzetak. Ovakve situacije moguće je preduprediti korišćenjem DataAdapter.RowUpdated događaja. Ovaj događaj dešava se prilikom izvršenja svake insert, update ili delete operacije ali pre nego štio se desi izuzetak pa nam daje mogućnost da sprečimo dešavanje izuzetka. DataAdapter.RowUpdated događaj dešava se u trenucima dok aplikacija radi sa DataSet objektom i otvara novu konekciju ka bazi podataka pa je preporučljivo da programski kod koji se izvršava u ovim situacijama bude što manji.


***

VEŽBA: Povezivanje aplikacije i baze (po video uputstvu)

Jednostavan primer kako povezate aplikaciju u Visual Studiu sa MySQL bazom ( koristimo DataAdapter )

(? ako ne razumete o čemu se radi, pročitajte prethodne dve lekcije ?)

***

Last modified: Sunday, 2 November 2025, 3:31 PM