WINDOWS FORM APLIKACIJA U C#(SHARP) KOJA KORISTI MYSQL BAZU PODATAKA-PRIMER SALON AUTOMOBILA
U prethodnoj lekciji korišćena je SQLite baza podataka, dok će u ovom primeru biti pokazano kako da se ostvari veza aplikacije sa mysql bazom podataka. Ovde će biti prikazana Windows Form aplikacija "Salon Automobila" koja omogućava unos podataka o automobilima u bazu: Marka, model, godina i cena, kao i prikaz podataka iz baze u DataGridView kontroli.
MySql server radi u XAMPP okruženju.
MySql server radi u XAMPP okruženju.
Kreiranje MySQL baze podataka i tabele:
Prvo treba kreirati MySQL bazu podataka i tabelu za vozila. Može se koristiti sledeći SQL upit u phpMyAdmin ili workbanch alatu:
CREATE DATABASE AutoSalon;
USE AutoSalon;
CREATE TABLE Cars(
USE AutoSalon;
CREATE TABLE Cars(
Id INT AUTO_INCREMENT PRIMARY KEY,
CarBrand VARCHAR(50),
Model VARCHAR(50),
Year INT,
Price DECIMAL(10, 2)
);CarBrand VARCHAR(50),
Model VARCHAR(50),
Year INT,
Price DECIMAL(10, 2)
Drugi način je da se baza i tabela u bazi kreiraju dinamički, u kodu, što će biti pokazano u nastavku. Kreirajmo sad nov projekat pod nazivom AutoSalonApp!
Kreiranje nove WindowsForm aplikacije
Pokrenimo Visual Studio i kreirajmo nov projekat pod nazivom AutoSalonApp, vidi sliku 1:
Kad je kreiran nov projekat, njegova struktura se može videti u Solution Exploreru, kao što je pokazano na slici 3:
Prvo treba kreirati Formu, koristeći dizajner, da izgleda kao na slici 2:
Na formi treba da budu 4 Label kontrole sa nazivima atributa, 4 TextBox kontrole za unos podataka, jedno dugme za unos i DataGridView kontrola za prikaz podataka o automobilima.
Pre nego što se kreira konekcija sa bazom potrebno je instalirati dodatni paket MySql.Data, pomoću NuGet Package Manager-a.
Instalacija MySql.Data paketa
- Otvoriti NuGet Package Manager u Visual Studio.
- Potražiti i instalirati MySql.Data paket u projekat.
Posle instaliranja dodatnog paketa, otvorićemo fajl Form1.cs i dodati potrebne funkcije za kreiranje baze i tabele, kao i za izvlačenje podataka iz baze. Ove metode se pozivaju u konstruktoru, kao što se može videti na sledećoj slici(slika 5).
Da bi mogli da koristimo klase potrebne za rad sa MySql bazom podataka potrebno je na početku dodati prostor imena MySql.Data.MySqlClient:
using MySql.Data.MySqlClient;
Unutar klase potrebno je kreirati objekat klase MySqlConnection(_connection).
U konstruktoru, posle metode InitializeComponent() koja je automatski generisana, treba pozvati dve metode. Prva CreateDatabaseAndTable() koja treba da kreira bazu i tabelu, ako ne postoje i druga, LoadCars(), koja treba da ažurira podatke u dataGridview kontroli sa trenutnim podacima iz baze. Naravno, ove metode prvo treba kreirati. Na sledećoj slici(slika 6) je prikazana metoda CreateDatabaseAndTable():
U konstruktoru, posle metode InitializeComponent() koja je automatski generisana, treba pozvati dve metode. Prva CreateDatabaseAndTable() koja treba da kreira bazu i tabelu, ako ne postoje i druga, LoadCars(), koja treba da ažurira podatke u dataGridview kontroli sa trenutnim podacima iz baze. Naravno, ove metode prvo treba kreirati. Na sledećoj slici(slika 6) je prikazana metoda CreateDatabaseAndTable():
Prvo se kreira konekcioni string koji se zatim koristi da bi se kreirala konekcija. Upotrebom klauzule "using" obezbeđuje se oslobađanje resursa nakon završetka bloka naredbi koje su obuhvaćene klauzulom using.
U konekcionom stringu nije navedena baza, jer ona u tom trenutku još ne postoji.
Prvo se uspostavlja konekcija na MySQL server bez navođenja baze podataka (connectionStringWithoutDatabase). Ova konekcija se koristi samo za kreiranje baze podataka.
Kreiranje baze podataka:
Baza podataka CarShowroom se kreira pomoću SQL naredbe CREATE DATABASE IF NOT EXISTS.
Nakon kreiranja baze, novi connection string koji uključuje bazu podataka se koristi za kreiranje tabele i druge operacije.
Otvaranje nove konekcije:Na kraju, nova konekcija sa bazom CarShowroom se otvara i dodeljuje članu klase _connection, koji će se koristiti za daljnje radnje.
Ovde se može primetiti da je za kreiranje konekcionog stringa korišćen specijalni karakter '@'.
U C#, znak @ ispred stringa označava verbatim string literal. Verbatim string literal omogućava da se string napiše tačno onako kako je unet, bez potrebe za specijalnim karakterima poput \ za navođenje novih redova, tabova ili drugih escape sekvenci.
U ovom primeru, @ omogućava da SQL upit bude napisan na način koji je čitljiv i pregledan, razdeljen po linijama, što olakšava njegovu interpretaciju i održavanje.
Metoda LoadCars() prikazana je na slici 7:
U konekcionom stringu nije navedena baza, jer ona u tom trenutku još ne postoji.
Prvo se uspostavlja konekcija na MySQL server bez navođenja baze podataka (connectionStringWithoutDatabase). Ova konekcija se koristi samo za kreiranje baze podataka.
Kreiranje baze podataka:
Baza podataka CarShowroom se kreira pomoću SQL naredbe CREATE DATABASE IF NOT EXISTS.
Nakon kreiranja baze, novi connection string koji uključuje bazu podataka se koristi za kreiranje tabele i druge operacije.
Otvaranje nove konekcije:Na kraju, nova konekcija sa bazom CarShowroom se otvara i dodeljuje članu klase _connection, koji će se koristiti za daljnje radnje.
Ovde se može primetiti da je za kreiranje konekcionog stringa korišćen specijalni karakter '@'.
U C#, znak @ ispred stringa označava verbatim string literal. Verbatim string literal omogućava da se string napiše tačno onako kako je unet, bez potrebe za specijalnim karakterima poput \ za navođenje novih redova, tabova ili drugih escape sekvenci.
U ovom primeru, @ omogućava da SQL upit bude napisan na način koji je čitljiv i pregledan, razdeljen po linijama, što olakšava njegovu interpretaciju i održavanje.
Metoda LoadCars() prikazana je na slici 7:
Ova metoda LoadCars je dizajnirana da učita podatke o automobilima iz tabele Cars u MySQL bazi podataka i prikaže ih u DataGridView kontroli na Windows Formi.
Prvo se kreira mysql upit:
Prvo se kreira mysql upit:
string query = "SELECT * FROM Cars";
Ovaj upit selektuje sve kolone i redove iz tabele Cars.
U nastavku se vrši provera stanja konekcije:
U nastavku se vrši provera stanja konekcije:
if (_connection.State != ConnectionState.Open)
{
{
_connection.Open();
}Proverava se da li je konekcija sa bazom podataka (_connection) otvorena. Ako nije, otvara se. Ovo osigurava da se veza sa bazom podataka uspostavi pre nego što se izvrši SQL upit.
Zatim se kreira MySqlCommand objekat koji sadrži SQL upit (query) i koristi otvorenu konekciju (_connection) za izvršavanje tog upita.
Posle toga se kreira objekat MySqlDataAdapter klase za popunjavanje DataTable.
MySqlDataAdapter koristi command da izvrši upit i popuni DataTable sa rezultatima upita. Zatim se DataTable postavlja kao izvor podataka za DataGridView kontrolu (dataGridView1), što omogućava prikaz podataka na formi.
Ovaj kod je smesten u try-catch block koji hvata izuzetak u slučaju greške. Ako dođe do bilo kakve greške tokom procesa (npr. problem sa konekcijom ili izvršenjem upita), greška će biti uhvaćena i prikazana korisniku kroz MessageBox.
Zatim se kreira MySqlCommand objekat koji sadrži SQL upit (query) i koristi otvorenu konekciju (_connection) za izvršavanje tog upita.
Posle toga se kreira objekat MySqlDataAdapter klase za popunjavanje DataTable.
MySqlDataAdapter koristi command da izvrši upit i popuni DataTable sa rezultatima upita. Zatim se DataTable postavlja kao izvor podataka za DataGridView kontrolu (dataGridView1), što omogućava prikaz podataka na formi.
Ovaj kod je smesten u try-catch block koji hvata izuzetak u slučaju greške. Ako dođe do bilo kakve greške tokom procesa (npr. problem sa konekcijom ili izvršenjem upita), greška će biti uhvaćena i prikazana korisniku kroz MessageBox.
Događaj klika dugmeta
Ukoliko se klikne na dugme add, biće pozvana metoda btnAddCar_Click(object sender, EventArgs e);
Metoda je prikazana na slici 8:
Metoda je prikazana na slici 8:
Ova metoda btnAddCar_Click se izvršava kada korisnik klikne na dugme za dodavanje novog automobila u bazu podataka. U prvom delu:
string brand = txtCarBrand.Text;
string model = txtModel.Text;
int year = int.Parse(txtYear.Text);
decimal price = decimal.Parse(txtPrice.Text);
string model = txtModel.Text;
int year = int.Parse(txtYear.Text);
decimal price = decimal.Parse(txtPrice.Text);
Ove linije koda prikupljaju vrednosti koje je korisnik uneo u tekstualna polja (txtCarBrand, txtModel, txtYear, txtPrice) na formi i smeštaju ih u odgovarajuće promenljive.
Year se konvertuje iz teksta u broj tipa int, dok se price konvertuje u decimalni broj.
U nastavku se kreira upit:
Year se konvertuje iz teksta u broj tipa int, dok se price konvertuje u decimalni broj.
U nastavku se kreira upit:
string insertQuery = "INSERT INTO Cars (CarBrand, Model, Year, Price) VALUES (@CarBrand, @Model, @Year, @Price)";
Ova linija kreira SQL upit za umetanje novog reda u tabelu Cars. Upit koristi parametre (@CarBrand, @Model, @Year, @Price) umesto direktnog umetanja vrednosti, što pomaže u izbegavanju SQL injekcija i omogućava bolju kontrolu nad vrednostima.
Kreiranje i podešavanje MySqlCommand:
Ovaj blok koda kreira MySqlCommand objekat koji sadrži SQL upit (insertQuery) i koristi otvorenu konekciju (_connection) za izvršenje tog upita.
Zatim se dodaju parametri upita i njihove vrednosti (@CarBrand, @Model, @Year, @Price), gde svaka vrednost odgovara onoj koja je prikupljena iz tekstualnih polja na formi.
Izvršavanje upita i hvatanje grešaka:
ExecuteNonQuery se koristi za izvršavanje upita koji ne vraća rezultate (kao što je INSERT). Ako je upit uspešno izvršen, korisniku se prikazuje poruka "Vozilo dodato uspešno!".
Nakon umetanja, metoda LoadCars se poziva kako bi se osvežio prikaz podataka u DataGridView, dodajući novi automobil u tabelu.
Ako dođe do greške tokom umetanja, uhvatiće se izuzetak i prikazati poruka korisniku sa opisom greške.
Ovaj blok koda kreira MySqlCommand objekat koji sadrži SQL upit (insertQuery) i koristi otvorenu konekciju (_connection) za izvršenje tog upita.
Zatim se dodaju parametri upita i njihove vrednosti (@CarBrand, @Model, @Year, @Price), gde svaka vrednost odgovara onoj koja je prikupljena iz tekstualnih polja na formi.
Izvršavanje upita i hvatanje grešaka:
ExecuteNonQuery se koristi za izvršavanje upita koji ne vraća rezultate (kao što je INSERT). Ako je upit uspešno izvršen, korisniku se prikazuje poruka "Vozilo dodato uspešno!".
Nakon umetanja, metoda LoadCars se poziva kako bi se osvežio prikaz podataka u DataGridView, dodajući novi automobil u tabelu.
Ako dođe do greške tokom umetanja, uhvatiće se izuzetak i prikazati poruka korisniku sa opisom greške.
Pokretanje aplikacije
Posle pokretanja aplikacije i unosa nekoliko podataka u bazu, biće prikazana sledeća forma:
Prethodno
|< Konekcija sa bazom u C#-primer |