18.10 - Rad u konektovanom režimu - vežbe na primeru maturskog zadatka
Zadatak:
Na osnovu maturskog zadatka A16 - Izložba pasa, kreirati aplikaciju koja treba da izgleda kao prvi tab zadatka.
Novi materijali potrebni za rad spakovani u zip arhivu A16_materijal.zip (preuzmi)
Dodatne informacije iz različitih DBMS: Za uslov da se pas može prijaviti samo za izložbe koje su bar 48 sati u budućnosti potrebno je proučiti funkciju dateadd ..
za MS SQL Server: https://www.w3schools.com/sqL/func_sqlserver_dateadd.asp
na primer, za dodavanje 24 sata na trenutni datum i vreme, koristi se: dateadd(hour, 24, sysdatetime()
... za MySQL: https://www.w3schools.com/SQl/func_mysql_date_add.asp
na primer, za dodavanje 24 sata na trenutni datum i vreme, koristi se: DATE_ADD(NOW() , INTERVAL 100 HOUR)
... za Access: https://www.w3schools.com/Sql/func_msaccess_dateadd.asp
... na primer, za dodavanje 24 sata na trenutni datum i vreme, koristi se: DateAdd("h", 48, Now())
VEŽBE (stare, od ranije, koje služe samo kao inspiracija): (klik da vidite/sakrijete VIDEO)
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.
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();
}