Rad u konektovanom okruženju
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. Objekat Command implementira IDbCommand interfejs. 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
(Properties)
interfejsa IDbCommand
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.
UpdatedRowSource – Način na koji komanda ažurira izvor podataka kada se koriste objekti DataSet ili IdbDataAdapter.
Koje su nam Metode interfejsa IDbCommand od interesa (zasad) :
ExecuteScalar() - izvršava komandu koja vraća jednu vrednost. Koristi se kada znamo da je rezultat samo jedna vrednost, kao na primer kod agregatnih funkcija (MAX, MIN, …).
ExecuteReader() - izvršava komandu koja vraća skup zapisa iz baze. Ono što se vraća je u formatu forward-only i u formu DataReader-a.
ExecuteNonQuery() - izvršava komandu koja ažurira bazu podataka ili menja strukturu baze podataka. Ovde se pod ažuriranjem podrazumeva i ubacivanje i brisanje podataka iz baze. Najčešće se koristi za UPDATE, DELETE, INSERT operacije nad podacima. Kao rezultat vraća broj promenjenih redova.
CreateParameter() - Kreira novi objekat Parameter koji može da se doda u kolekciju Command.Parameters.
Metode objekta Command
Objekat Command implementira interfejs IdbCommand.
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.
Kako se zvršava upit koji vraća skalarnu vrednost ?
Primer izvršavanja upita koji vraća jednu vrednost je dat u nastavku. ( 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();
}
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:
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).
Čitanje skupa zapisa iz baze
Sledeći kod je primer čitanja podataka upotrebom DataReader objekta iz tabele City koja se nalazi u bazi podataka world.
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 će biti postavljena naknadno, ....
( poruka postavljena 20.05 u 17:48 )