KONEKCIJA SA BAZOM PODATAKA U C#(SHARP)-PRIMER
U ovom članku je pokazano kako da se kreira jednostavna aplikacija, koja se povezuje sa SQLite bazom podataka, a koja se sastoji od windows forme, pomoću koje se unose ime i prezime korisnika, dodaje u bazu i na formi se takođe mogu prikazati podaci koji su u nju uneti.
Kreirajmo sada nov projekat pod nazivom UserManagementApp.
Pokrenimo Visual Studio 2022 Comunity i kliknimo na dugme za kreiranje novog projekta. Posle kreiranja novog projekta, fajlove možemo videti u Solution Explorer-u, prikazanom na slici 1, sa desne strane. Otvorimo dizajner za kreiranje forme, klikom na fajl Form1.Designer.cs, a zatim dodajmo paletu Toolbox, za dodavanje kontrola(vidi sliku 1).
Kreirajmo sada nov projekat pod nazivom UserManagementApp.
Pokrenimo Visual Studio 2022 Comunity i kliknimo na dugme za kreiranje novog projekta. Posle kreiranja novog projekta, fajlove možemo videti u Solution Explorer-u, prikazanom na slici 1, sa desne strane. Otvorimo dizajner za kreiranje forme, klikom na fajl Form1.Designer.cs, a zatim dodajmo paletu Toolbox, za dodavanje kontrola(vidi sliku 1).
Dodavanje kontrola na formu:
Kada je Toolbox otvoren, videće se lista različitih kontrola kao što su Button, Label, TextBox, DataGridView, i druge.
- Korak 1: Kliknite na kontrolu koju želite da dodate (npr. Button).
- Korak 2: Prevucite je na svoju formu (prozor za dizajn) i otpustite dugme miša da je postaviš na željeno mesto.
- Korak 3: Možete kliknuti na kontrolu da je izaberete i prilagodite svojstva u Properties panelu (obično smešten desno).
Dodaćemo sledeće kontrole na formu:
- 2 TextBox kontrole za unos imena i prezimena.
- 2 Label kontrole za označavanje TextBox-ova (Ime i Prezime).
- 1 Button kontrolu za dodavanje korisnika.
- 1 Button kontrolu za prikazivanje korisnika.
- 1 DataGridView kontrolu za prikazivanje podataka iz baze.
Zatim je potrebno postaviti svojstva kontrola:
- TextBox za unos imena: Name = txtFirstName
- TextBox za unos prezimena: Name = txtLastName
- Button za dodavanje korisnika: Name = btnAddUser, Text = "Add User"
- Button za prikazivanje korisnika: Name = btnShowUsers, Text = "Show Users"
- DataGridView: Name = dataGridView1
Forma bi trebalo da izgleda kao na slici 2:
Da bi forma dobila funkcionalnost potrebno je generisati dve metode koje će se pozivati klikom na jedno ili drugo dugme, kao i SQLite bazu podataka. metode se lako kreiraju, dvostrukim klikom na dugmad u dizajneru, dok je za kreiranje konekcije sa bazom potrebno instalirati dodatni paket System.Data.SQLite ili Microsoft.Data.Sqlite.Core.
Potražimo paket tako što se u Solution Explorer-u klikne desnim klikom na projekat i izabere Manage NuGet Packages. U pretrazi zatim treba otkucati naziv tog paketa, a zatim ga instalirati(vidi sliku 3).
- Microsoft.Data.Sqlite.Core je deo Microsoft-ovog ekosistema i često se koristi sa .NET Core ili .NET 5/6 projektima. Ima moderniju API strukturu i bolje se integriše sa najnovijim verzijama .NET-a.
- System.Data.SQLite je stariji paket, dobro je testiran i često se koristi sa .NET Framework aplikacijama. Ako se koristi starija verzija .NET-a (npr. .NET Framework), ovo može biti bolji izbor.
Potražimo paket tako što se u Solution Explorer-u klikne desnim klikom na projekat i izabere Manage NuGet Packages. U pretrazi zatim treba otkucati naziv tog paketa, a zatim ga instalirati(vidi sliku 3).
Kreiranje konekcije sa SQLite bazom podataka
Otvorimo fajl Form1.cs i u klasi Form1 dodajmo objekat _connection klase SqliteConnection iz prostora imena Microsoft.Data.Sqlite.
Bazu ćemo inicijalizovati u posebnoj metodi InitializeDatabase(), koju treba pozvati iz konstruktora klase Form1, što se može videti na slici 4. Treba obratiti pažnju da pomenuti prostor imena mora biti uključen pomoću klauzule using.
U metodi InitializeDatabase() je kreiran objekat klase SqliteConnection, čijem konstruktoru kao parametar treba proslediti konekcioni string koji je prethodno kreiran na sledeći način:
Bazu ćemo inicijalizovati u posebnoj metodi InitializeDatabase(), koju treba pozvati iz konstruktora klase Form1, što se može videti na slici 4. Treba obratiti pažnju da pomenuti prostor imena mora biti uključen pomoću klauzule using.
U metodi InitializeDatabase() je kreiran objekat klase SqliteConnection, čijem konstruktoru kao parametar treba proslediti konekcioni string koji je prethodno kreiran na sledeći način:
string connectionString="DataSource=user.db"
Zatim se otvara konekcija pozivom metode Open() od objekta _connection. Unutar metode za inicijalizaciju baze, kreira se u nastavku upit pomoću koga će se kreirati tabela Users u bazi, ako prethodno nije napravljena:
string createTableQuerry="CREATE TABLE IF NOT EXISTS Users(Id INTEGER PRIMARY KEY AUTOINCREMENT, FirstName TEXT, LastName TEXT)";
Id će biti primarni ključ, autoinkrementiran, kao i polja za ime i prezime.
Koristeći ovaj upit, kao i objekat konekcije kao parametar, kreira se SqliteCommand objekat:
Koristeći ovaj upit, kao i objekat konekcije kao parametar, kreira se SqliteCommand objekat:
SqliteCommand command = new SqliteCommand(createTableQuerry,_connection);
ExecuteNonQuery je metoda koja se poziva za kreirani objekat command i koja se koristi u C# za izvršavanje SQL komandi koje ne vraćaju rezultate u obliku SELECT upita. Ova metoda se najčešće koristi za SQL operacije kao što su INSERT, UPDATE, DELETE, i CREATE TABLE.
ExecuteNonQuery izvršava SQL komandu koja se prosleđuje, ali ne vraća nikakve rezultate u obliku podataka (tj. ne vraća redove ili vrednosti iz baze).
Ova metoda vraća int vrednost koja označava broj redova u bazi podataka koji su pogođeni (izmenjeni, dodati ili obrisani) datom SQL komandom. Na primer, ako se izvrši UPDATE komanda koja menja 5 redova u bazi, ExecuteNonQuery će vratiti 5.
ExecuteNonQuery izvršava SQL komandu koja se prosleđuje, ali ne vraća nikakve rezultate u obliku podataka (tj. ne vraća redove ili vrednosti iz baze).
Ova metoda vraća int vrednost koja označava broj redova u bazi podataka koji su pogođeni (izmenjeni, dodati ili obrisani) datom SQL komandom. Na primer, ako se izvrši UPDATE komanda koja menja 5 redova u bazi, ExecuteNonQuery će vratiti 5.
Dodavanje događaja dugmeta
Hendler za prvo dugme je metoda btnAddUser_Click koja se poziva kada se klikne na dugme addUser_Click koje služi za trigerovanje unosa podataka sa forme u bazu. Potrebno je prvo pročitati vrednosti sa Text polja na formi i smestiti u string promenljive, kao što je prikazano na sledećoj slici(slika 5).
Posle određivanja string promenljivih za ime i prezime firstName i lastName, priprema se upit za ubacivanje podataka u tabelu Users(Greška je na slici):
string insertQuerry = "INSERT INTO Users(FirstName,LastName) VALUES(@FirstName,@LastName)";
@FirstName i @LastName su parametri koji se koriste u SQL komandi za rad sa podacima u bazi. Ovi parametri omogućavaju sigurno i fleksibilno ubacivanje vrednosti u SQL upite. Evo kako funkcionišu:
Šta su @FirstName i @LastName?
Šta su @FirstName i @LastName?
- Parametri u SQL upitima: @FirstName i @LastName su oznake za parametre koje se koristie u SQL upitu. Umesto direktnog umetanja vrednosti u SQL string (što može biti rizično zbog SQL injekcija), koriste se parametri da bi se obezbedilo da se vrednosti pravilno interpretiraju i da bi se poboljšala sigurnost aplikacije.
- Ovde @FirstName i @LastName su mesta za koje će se kasnije postaviti konkretne vrednosti.
U nastavku je pomoću pripremljenog upita kreirana komanda za ubacivanje podataka u bazu insertCommand klase SqliteCommand.
Zatim se dodaju parametri i izvršava upit.
Zatim se dodaju parametri i izvršava upit.
Prikaz podataka na dataGridView1 kontroli
Prikaz podataka na dataGridView1 kontroli se ostvaruje u hendleru za drugo dugme, tj. u metodi btnShowUsers_Click(object sender, EventArgs e), vidi sliku 6.
Prvo se pripremi SQL upit za uzimanje podataka iz baze, tj. iz tabele Users:
string selectQuerry = "SELECT * FROM Users";
Zatim se kreiraju redom objekti klasa SqliteCommand i SqliteDataReader, tj. objekti command i reader. Objekat reader se koristi kao izvor podataka za objekat dataTable klase DataTable.
Upotreba klauzule using
using klauzula u C# služi za upravljanje resursima i obezbeđuje da se objekti koji implementiraju IDisposable interfejs pravilno oslobode kada se više ne koriste. Ovo je posebno važno za resurse poput konekcija sa bazom podataka, datoteka i drugih objekata koji zahtevaju eksplicitno oslobađanje resursa.
Ona omogućava automatsko oslobađanje resursa kada se objekat više ne koristi. Kada se izađe iz using bloka, Dispose metoda objekta se automatski poziva, čime se oslobađaju svi resursi koje objekat koristi.
Ova klauzula je vrlo preporučljiva kada se radi sa objektima kao što su SqliteConnection, SqliteCommand, i SqliteDataReader. Ovi objekti koriste sistemske resurse koji treba da se oslobode kada se završi sa njihovim korišćenjem. Ako se ne koristi using, moralo bi da se ručno pozove Dispose metoda, što može biti zaboravljeno i može dovesti do curenja resursa.
Ona omogućava automatsko oslobađanje resursa kada se objekat više ne koristi. Kada se izađe iz using bloka, Dispose metoda objekta se automatski poziva, čime se oslobađaju svi resursi koje objekat koristi.
Ova klauzula je vrlo preporučljiva kada se radi sa objektima kao što su SqliteConnection, SqliteCommand, i SqliteDataReader. Ovi objekti koriste sistemske resurse koji treba da se oslobode kada se završi sa njihovim korišćenjem. Ako se ne koristi using, moralo bi da se ručno pozove Dispose metoda, što može biti zaboravljeno i može dovesti do curenja resursa.
Pokretanje programa
Posle pokretanja i testiranja aplikacije videćemo:
Prethodno
|< Napredni C#(Sharp) primer |