30.10 - Rad u konektovanom režimu - nastavak (+video) (copy)
Zadatak:
Kreirati aplikaciju koja će imati izbor (meni) za čitanje podataka iz različitih vrsta baza podataka: MySql, Access (i .mdb i .accdb), MS SQL Server. Za svaki od njih treba da postoji posebna forma u kojoj će da se pomoću odgovarajućeg Reader objekta pristupi bazi podataka.
Koristićemo staru verziju baze podataka B1 - izlozbePasa
Fajlovi koje možete da iskoristite prilikom vežbanja na osnovu postavljenog video snimka:
MySQL: Upiti kojima se kreira sve u bazi (XAMPP - ali prvo kreirajte bazu pod nazivom B1_izlozbePasa)
VEŽBE (blok 2): (klik da vidite/sakrijete VIDEO
- kako je planiran rad na času)
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.
Za početak:
- Kreirati projekat - WinFormsAPP pod nazivom RadSaBazom2
- Na vrh prve forme postaviti Menu Strip:
- Izbor -> MySQL, Access (.mdb), Access (.accdb), MS SQL Server
- Kraj -> Izlaz
- Kreirati drugu formu za rad sa MySQL-om (klik da vidite/sakrijete detalje) gde se postavlja:
- Labela: "Psi u bazi" iza kojeg postaviti comboBox
- U gornjoj liniji forme upisati "Psi u formi"
- Prilikom učitavanja forme treba da se unesu svi psi iz baze:
- dvoklikom na formu se kreira Load događaj
- posebnu metodu za učitavanje pasa i pozvati je iz Load-a forme
- (pokrenuti MySQL iz XAMPP-a ako dosad niste)
- prvo dodati referencu na MySQL.Data, zatim using MySql.Data.MySqlClient
- prvo kreirati konekcioni string, pa konekciju, a u try-catch bloku radimo ostalo:
- otvaranje konekcije, kreiranje upita - šta nam treba iz tabele Pas (PasID, Ime), kreiranje komande
- pomoću komande kreirati MySqlDataReader (MySqlDataReader rd = komanda.ExecuteReader();)
- pomoću pozivanja Read() metode Reader-a se čita jedan red, a pošto ne znamo koliko redova ima to ćemo raditi u while petlji !
- Dodavanje u comboBox se vrši pomoću metode comBox.Items.Add( a u zagradu se stavlja string - kombinacija svega što nam treba u jednom redu. U našem slučaju je u jednom redu PasID i Ime jednog psa. Pošto to Reader vraća u jednom redu, pozivaju se sa nazivom Readera i kao index se koriste ili brojevi 0 i 1 ili nazivi "PasID" i "Ime" - isto je da li koristite numerički ili asocijativni niz! Ako želite da se između tih delova koristi neka vrsta separatora (crtica, razma, ...) dodajte to prilikom formiranja stringa koji se dodaje u jedan red comboBox-a.
- Ne zaboravite da zatvorite konekciju - najbolje u finally delu, kao i da obradite izuzetke (catch deo)
- Pozuovite vašu metodu prilikom Load-a ove forme!
- (Ne zaboravite da se ova forma treba otvoriti pozivom iz menija prve forme izborom opcije MySql )
- Za MySQL : u comboBox popuniti Id i nazive svih pasa prilikom učitavanja forme, a u lebeli ispod da se prikaže težina psa koji je izabran
- Kreirati treću formu za rad sa Access-ovom .mdb bazom
- Kreirati četvrtu formu za rad sa Access-ovom .accdb bazom
- Kreirati petu formu za rad sa MS SQL Server bazom
UKRATKO: 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();
}