Rad sa bazama podataka uvek zahteva od programera da odluči da li će raditi u konektovanom ili diskonektovanom režimu. 

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 ranijim lekcijama. 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. 

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

*** Napomena: *** Ako se treba raditi samo sa jednom tabelom tada nije neophodno koristiti dataset, već je dovoljno koristiti samo jedan objekat klase DataTable ****

Ovaj put je fokus na diskonektovanom radu sa bazom, koristeći klasu DataAdapter za komunikaciju i manipulaciju podacima. Za razliku od DataReader klase, koja zahteva stalnu otvorenu konekciju sa bazom dok se čitaju podaci, DataAdapter omogućava da jednom preuzmemo podatke i kasnije ih lokalno obrađujemo, bez potrebe za neprekidnom vezom sa bazom.

Primer 1 - u konzolnoj aplikaciji

Zamislimo situaciju gde naša aplikacija treba da prikaže podatke iz tabele „Albumi“ koja se nalazi u bazi podataka „CDKatalog“. Korišćenjem DataAdapter objekta, možemo te podatke da učitamo u objekat tipa DataTable, što je jednostavniji pristup od korišćenja DataSet-a ako radimo sa samo jednom tabelom.

U nastavku je primer koda koji demonstrira kako da se učitaju podaci iz baze i prikažu u konzolnoj aplikaciji koristeći DataTable:

using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string konekcioniString = "Data Source=localhost;Initial Catalog=CDKatalog;Integrated Security=True";
        SqlConnection konekcija = new SqlConnection(konekcioniString);

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Albumi", konekcija);
        DataTable tabela = new DataTable();

        adapter.Fill(tabela);

        foreach (DataRow red in tabela.Rows)
        {
            Console.WriteLine(red["NazivAlbuma"]);
        }
    }
}

Za vežbu, kod kuće, učenici mogu:

  •  
  • Učitati podatke iz neke druge tabele.

  •  
  • Prikazati ih u DataGridView komponenti - u Windows Forms aplikaciji.

  •  

Prednost ovakvog pristupa je što se konekcija sa bazom koristi samo dok se podaci učitavaju, a zatim se zatvara. To znači da korisnik može da vidi i eventualno menja podatke lokalno, a da baza ostaje neaktivna dok ne odlučimo da pošaljemo izmene.

Vežba 1:

Kreirati vizuelnu aplikaciju u kojoj će da se prikažu svi igrači iz baze Golf

Slike table sa časa :




***


Za one koji žele da znaju više:

  • DataAdapter – most između baze i DataSet-a. Koristi se za popunjavanje i ažuriranje DataSet-a.

  • DataSet – u memoriji čuva više tabela koje se mogu menjati i prikazivati.

using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string konekcioniString = "Data Source=localhost;Initial Catalog=CDKatalog;Integrated Security=True";
        SqlConnection konekcija = new SqlConnection(konekcioniString);

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Albumi", konekcija);
        DataSet ds = new DataSet();

        adapter.Fill(ds, "Albumi");

        foreach (DataRow red in ds.Tables["Albumi"].Rows)
        {
            Console.WriteLine(red["NazivAlbuma"]);
        }
    }
}

Objašnjenje:

  • Kreiramo konekciju.

  • Kreiramo SqlDataAdapter koji koristi SQL komandu.

  • Puni se DataSet sa podacima iz tabele Albumi.

  • Ispisuju se podaci iz učitanih redova.

U Windows Forms aplikaciji:

  • Na formu staviti DataGridView.

  • Dodati kod u Form_Load događaj:

      SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Albumi", konekcija);
      DataSet ds = new DataSet();
      adapter.Fill(ds, "Albumi");
      dataGridView1.DataSource = ds.Tables["Albumi"];

 

      SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);
      ds.Tables["Albumi"].Rows[0]["NazivAlbuma"] = "Novi naziv";
      adapter.Update(ds, "Albumi");

Objašnjenje:

  • Menjamo podatke u DataSet-u.

  • SqlCommandBuilder automatski generiše SQL komande.

  • adapter.Update šalje izmene nazad u bazu.

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.

Last modified: Thursday, 11 December 2025, 2:48 AM