Prvo, potrebno je podsetiti se pojmova iz prethodne lekcije: ADO.NET Snabdevači podacima (Data Provider-i) i kreiranje konekcije ka bazi 

 


ADO.NET je tehnologija koja omogućava povezivanje .NET aplikacija sa različitim tipovima baza podataka i rad sa podacima. ADO.NET Data Provider je set klasa koje služe za pristup bazi podataka, izvršavanje SQL upita i rad sa rezultatima tih upita.

Svaki od data provider-a poseduje skup klasa koje omogućavaju izvršenje osnovnih funkcionalnosti (kreiranjem konkretnog objekta neke od tih klasa).

Osnovne klase ADO.NET Data Provider-a:

Klasa   Za šta koristimo objekte klase
Connection   Omogućava otvaranje i zatvaranje konekcije ka bazi podataka.
Command   Predstavlja SQL upit ili uskladištenu proceduru. Omogućava pristup DataReader objektu konkretnog data provider-a
DataReader   Omogućava čitanje podataka red po red
DataAdapter   Prenosi DataSet objekte između klijenta i izvora podataka. Poseduje konekciju i skup od četiri osnovne operacije za selektovanje, dodavanje, izmenu i brisanje podataka u izvoru podataka
Parameter   Predstavlja imenovani parametar u parametrizovanom upitu
DataSet i DataTable   Skladištenje podataka u memoriji
Transaction   Transakcije

Iako će se imena konkretnih objekata svakog od konkretnih Data Provider objekata razlikovati (npr. SqlConnection, OracleConnection, OdbcConnection ili MySqlConnection), svi su izvedeni iz iste klase i implementiraju iste interfejse pa je nakon savladavanja korišćenja jednog od data provider-a relativno jednostavno koristiti sve ostale.

NAPOMENA: Da biste radili da bazama, sem što morate imati using System.Data; u zavisnosti koji DBMS koristite, trebate dodati i using System.Data.( i /ili deo koji se odnosi na vaš DBMS) .


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


U nastavku su opisi pojedinih delova Data Provider-a:


Connection - konekcija ka bazi podataka

Ovaj objekat omogućava uspostavljanje konekcije 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.

Primer u C#: ili

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Rad sa bazom podataka
}
SqlConnection connection = new SqlConnection(connectionString);
try
{
    connection.Open();
     // rad sa bazom podataka
}
catch (SqlException ex)
{
    Console.WriteLine("Greška prilikom konektovanja na bazu podataka: " + ex.Message);
}
finally
{
    if (connection.State == System.Data.ConnectionState.Open)
    {
        connection.Close();  // Osigurava zatvaranje konekcije
        Console.WriteLine("Konekcija je zatvorena.");
    }
}

Klase: SqlConnection (za SQL Server), OleDbConnection (za Access), MySqlConnection (za MySQL), itd.

Microsoft Visual Studio ne dolazi sa ugrađenom podrškom za MySQL !
Prvo treba biti svestan da za MySQL treba instalirati MySqlConnector.
Iako od verzije Visual Studio 2015 pa nadalje, postoji i dodatak „MySQL for Visual Studio“ koji omogućava lakši rad ( pristup vizuelnim alatima ), u školi i dalje koristimo stariju verziju.
Tek kada na računaru postoji instaliran MySqlConnector, može da se kreira konekcija korišćenjem MySql Data provider-a:


Command - Izvršavanje SQL naredbi

Command objekat služi za izvršavanje SQL upita ili komandi nad bazom podataka (kao što su SELECT, INSERT, UPDATE, DELETE). 

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 podatke (INSERT, UPDATE, ili DELETE).

  • ExecuteScalar() - koristi se kada se kao rezultat upita dobija samo jedan podatak (jedna vrednost). 

  • ExecuteReader() - koristi se za komande koje vraćaju rezultate (SELECT). Vraća rezultate pomoću DataReader objekta.

Primer u C#:

SqlCommand command = new SqlCommand("SELECT * FROM Studenti", connection);
SqlDataReader reader = command.ExecuteReader();

Klase: SqlCommand, OleDbCommand, MySqlCommand, itd.


DataReader - čitanje podataka iz baze (napred-nazad)

DataReader omogućava efikasno čitanje podataka iz baze podataka, ali u napred-nazad režimu, što znači da može da čita podatke samo sekvencijalno i ne čuva ih u memoriji.

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.

Primer:

SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine(reader["Ime"].ToString());
}

Klase: SqlDataReader, OleDbDataReader, MySqlDataReader, itd.


DataAdapter - povezivanje baze podataka i DataSet-a

DataAdapter radi kao most između baze podataka i objekata kao što su DataSet ili DataTable. Koristi se za popunjavanje podataka u memoriji, kojima se onda može manipulisati van same baze, a kasnije da se sve to ažurira u samoj bazi.

DataAdapter je klasa koja omogućava realizaciju diskonektovane ADO.NET arhitekture pristupa podacima (disconnected data access). 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 ima dve metode:

  • Fill() – popunjava DataSet ili DataTable podacima iz baze.
  • Update() – ažurira bazu podataka sa promenama koje su napravljene u DataSet-u.

Primer:

SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Studenti", connection);
DataSet dataset = new DataSet();
adapter.Fill(dataset, "Studenti");

Klase: SqlDataAdapter, OleDbDataAdapter, MySqlDataAdapter, itd.


DataSet i DataTable - Skladištenje podataka u memoriji

  • DataSet je složeniji objekat koji može da čuva više tabela (DataTable) i odnose među njima (relacije).
  • DataTable je pojedinačna tabela podataka, slična tabelama u bazi podataka.

Primer:

DataSet dataset = new DataSet();
adapter.Fill(dataset, "Studenti");
DataTable table = dataset.Tables["Studenti"];
foreach (DataRow row in table.Rows)
{
    Console.WriteLine(row["Ime"]);
}

Klase: DataSet, DataTable


Transaction - transakcije

Transakcija je skup operacija koje se izvršavaju kao celina. Ako jedna operacija ne uspe, sve promene koje su napravljene do tog trenutka se poništavaju (rollback).
Primer:

SqlTransaction transaction = connection.BeginTransaction();
try
{
    SqlCommand command = new SqlCommand("INSERT INTO Studenti (Ime) VALUES ('Marko')", connection, transaction);
    command.ExecuteNonQuery();
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}

Klase: SqlTransaction, OleDbTransaction, MySqlTransaction, itd.


Obratite pažnju na redosled koraka u daljem radu


Pre pribavljanja ili izmene podataka neophodno je prvo kreirati konekciju ka izvoru podataka.

Prilikom kreiranja instance klase Connection neophodno je definisati ConnectionString, koji sadrži informacije o imenu mašine kojoj pristupamo, načinu autentifikacije korisnika, imenu baze kojoj pristupamo i sl.

Konekcioni string može prvo da se postavi u neku promenljivu i da se tako koristi, a može i da se unosi direktno, kao parametar prilikom kreiranja konekcije. (Ili može da se kreira pomoću samog Visual Studija - što će biti pokazano u vežbama):

MySqlConnection konekcija = new MySqlConnection("server=localhost;user id=ucenik;password=test;database=proba");
MySqlConnection konekcija = new MySqlConnection();
konekcija.ConnectionString = "server=localhost;user id=ucenik; password=test; database=proba";
string konekcioniString = "server=localhost;user id=ucenik;password=test;database=proba";
MySqlConnection konekcija = new MySqlConnection(konekcioniString);

Pre korišćenja konekcije neophodno je eksplicitno otvoriti konekciju:

Otvaranje konekcije

konekcija.Open();

Nakon eksplicitnog poziva funkcije za otvaranje konekcije, otvorena je i aktivna konekcija ka bazi podataka. Nakon završetka obrade podataka neophodno je zatvoriti konekciju pozivom funkcije za zatvaranje konekcije:

Zatvaranje konekcije

konekcija.Close();


Obrada izuzetaka (preporuka)

Preporučuje se da se operacije nad bazom podataka koje mogu da dovedu do greške u program pišu unutar try bloka. Unutar try bloka vrši se i otvaranje konekcije pozivom metode Open objekta klase Connection. Samo kreiranje konekcije trebalo bi da bude izvan try bloka jer bi u protivnom ograničili oblast važenja ovog objekta. Ukoliko dođe do izuzetaka oni su objekti klase Connection. Poželjno je i definisanje finally bloka u kojem će se vršiti zatvaranje konekcije bez obzira da li je pri izvršavanju sql komandi došlo do grešaka ili nije.

try
{
   konekcija.Open(); // + (Izvrsavanje ADO.NET komandi)
}
catch (MySqlException err)
{
   Console.WriteLine(err.ToString());
}
finally
{
   konekcija.Close();


Kreiranje komande - Nakon kreiranja konekcije ka bazi podataka, neophodno je izvršiti SQL naredbe za manipulaciju nad podacima.

Command objekat dozvoljava direktan pristup podacima u bazi u konektovanom okruženju. Ovaj objekat sadrži referencu na SQL komandu ili uskladištenu proceduru koje se mogu izvršavati direktno. Koristeći odgovarajući Command objekat moguće je izvršavati Select, Insert, Update i Delete naredbe nad elementima baze podataka.

Ukoliko koristimo:

- Microsoft SQL Server data provider, SQL naredbe se izvršavaju korišćenjem instanci klase SqlCommand, tj korišćenjem SqlCommand objekta.
- Oracle data provider, SQL naredbe se izvršavaju korišćenjem instanci klase OracleCommand, tj korišćanjam OracleCommand objekta.
- MySQL data provider, SQL naredbe se izvršavaju korišćenjem instanci klase MySqlCommand, tj korišćenjem MySqlCommand objekta,
- Access bazu (.mdb), koristi se OleDbCommand, …

Prilikom kreiranja komande moguće je navesti SQL upit kao argument konstruktora objekta ili korišćenjem CommandText atributa SqlCommand objekta.

Prilikom kreiranja komande neophodno je navesti konekciju koja će se koristiti za izvršenje komande. Konekciju je moguće navesti kao argument konstruktora objekta ili korišćenjem Connection atributa MySqlCommand objekta.

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=.;Initial Catalog=BazaKnjiga;Integrated Security=SSPI";
String strSQL = "Select * from Knjiga";
SqlCommand newComm = new SqlCommand();
newComm.Connection = conn;
newComm.CommandText = strSQL;

Prosto kreiranje SqlCommand objekta, ili bilo koje druge komande, ne znači da je SQL upit sadržan u komandi automatski prosleđen na izvršenje. Objekat koji predstavlja komandu je nakon kreiranja samo pripremljen za dalju upotrebu. Komanda se izvršava pozivom odgovarajuće metode:

Metoda Značenje
Cancel() Poništava izvršenje komande
ExecuteReader() Povratna vrednost funkcije je DataReader objekat izabranog data provider-a
ExecuteNonQuery() Izvršava komandu od koje se ne očekuje da kao povratne vrednosti daje podatke
ExecuteScalar() Varijanta koja kao povratnu vrednost vraća jedan podatak

Povratak na početak

Last modified: Friday, 5 December 2025, 6:08 PM