6. diel - Databázy v C# .NET - INSERT, UPDATE, DELETE a COUNT
V minulej lekcii, SqlDataReader a pripojená databáza v C# .NET, sme sa naučili čítať dáta z databázy pomocou SqlDataReaderu. Tiež sme sa naučili používať parametrizované otázky, ktoré znemožňujú útok SQL injection.
Dnes si v C# .NET tutoriále skúsime obsah databázy meniť.
Vkladanie, mazanie a editácia hodnôt
Základné databázové operácie sa často označujú skratkou CRUD. Jedná sa o operácie:
- Create (vytvoriť),
- Read (čítať),
- Update (aktualizovať),
- Delete (odstrániť).
Minule sme si ukázali operáciu Read. Už vieme, že dáta z databázy
čítame príkazom SELECT
a potrebujeme na to
*DataReader
.
INSERT
Vyzvime užívateľa na zadanie slovíčka španielsky a anglicky. Nové slovíčko vložíme do databázy:
Console.WriteLine("Enter a new word in Spanish"); string spanish = Console.ReadLine(); Console.WriteLine("Enter a new word in English"); string english = Console.ReadLine(); string query = "INSERT INTO Word (Spanish, English) VALUES (@spanish, @english)"; using (SqlCommand sqlQuery = new SqlCommand(query, connection)) { connection.Open(); sqlQuery.Parameters.AddWithValue("@spanish", spanish); sqlQuery.Parameters.AddWithValue("@english", english); int row = sqlQuery.ExecuteNonQuery(); Console.WriteLine(row); }
SQL dotaz pre vloženie nového riadka do tabuľky začína príkazom
INSERT INTO
, nasleduje názov tabuľky. V zátvorkách vypíšeme
názvy stĺpcov, do ktorých vkladáme hodnoty. Za klauzulu VALUES
vypíšeme opäť do zátvorky hodnoty. Nemalo by vás prekvapiť, že
použijeme opäť parametre.
Otázku vložíme do inštancie triedy SqlCommand
. Dodáme mu
potrebné parametre a spustíme ho metódou ExecuteNonQuery()
.
Metóda vracia počet ovplyvnených riadkov. Pre overenie, že vloženie
prebehlo, si ich vypíšme do konzoly:
Konzolová aplikácia
Enter a new word in Spanish
teclado
Enter a new word in English
keyboard
1
Metóda ExecuteNonQuery()
vrátila hodnotu 1
.
Môžeme spustiť pôvodný kód našej aplikácie, ktorý vypisoval všetky
slovíčka alebo nahliadnuť do samotnej databázy v designeri. Vidíme, že
klávesnica je novo medzi slovíčkami:
DELETE
Prejdime na mazanie záznamov. Oproti vkladaniu nie je v podstate žiadny rozdiel, len som chcel, aby sme si pre úplnosť ukázali všetky otázky z CRUD:
Console.WriteLine("Enter the Spanish word you want to delete"); string spanish = Console.ReadLine(); string query = "DELETE FROM Word WHERE Spanish=@spanish"; using (SqlCommand sqlQuery = new SqlCommand(query, connection)) { connection.Open(); sqlQuery.Parameters.AddWithValue("@spanish", spanish); int row = sqlQuery.ExecuteNonQuery(); Console.WriteLine(row); }
C# kód sa vôbec nezmenil. SQL dotaz začína DELETE FROM
a
pokračuje názvom tabuľky. Nasleduje podmienka WHERE
, ktorú už
dobre poznáme.
Nikdy na podmienku v príkaze DELETE
nezabudnite, inak dôjde k vymazaniu všetkých záznamov v
tabuľke!
Aplikáciu opäť vyskúšajme:
Konzolová aplikácia
Enter the Spanish word you want to delete
teclado
1
Skontrolujte si, že klávesnica medzi slovíčkami už naozaj nie je.
Môžeme skúsiť aj zadať neexistujúce slovíčko na vymazanie, počet
ovplyvnených riadkov bude 0
:
Konzolová aplikácia
Enter the Spanish word you want to delete
árbol binario
0
UPDATE
Našu štvoricu otázok zakončíme príkazom UPDATE
, ktorý
vyvolá zmenu. Naučme aplikáciu meniť anglický preklad nejakého
španielskeho slova:
Console.WriteLine("Enter the Spanish word for which you want to edit the translation"); string spanish = Console.ReadLine(); Console.WriteLine("Enter a new translation"); string english = Console.ReadLine(); string query = "UPDATE Word SET English=@english WHERE Spanish=@spanish"; using (SqlCommand sqlQuery = new SqlCommand(query, connection)) { connection.Open(); sqlQuery.Parameters.AddWithValue("@spanish", spanish); sqlQuery.Parameters.AddWithValue("@english", english); int row = sqlQuery.ExecuteNonQuery(); Console.WriteLine(row); }
C# kód je opäť nezmenený (iba sme pridali parameter). SQL dotaz začína
UPDATE
, nasleduje názov tabuľky a ďalej klauzula
SET
. Po nej názov stĺpca, znamienko rovnosti a nová hodnota.
Pokiaľ by sme potrebovali updatovať viac stĺpcov, zapíšeme to napr.
takto:
UPDATE Word SET English=@english, Spanish=@spanish WHERE Id=@id
Rovnako ako u DELETE
nikdy nesmieme
zabudnúť na klauzulu WHERE
, inak sa updatujú všetky
riadky v tabuľke.
Aplikáciu opäť vyskúšajme:
Konzolová aplikácia
Enter the Spanish word for which you want to edit the translation
perro
Enter a new translation
trace
1
Skontrolujte si, že sa preklad zmenil.
Hranaté zátvorky
Ešte sme nespomenuli použitie hranatých zátvoriek v otázkach. Pokiaľ
názov nejakého stĺpca koliduje s kľúčovým slovom z SQL (napr. sa stĺpec
volá Where
), dáme ho do hranatých zátvoriek. Často sa
stretnete s konvenciou, kde sa takto označujú všetky názvy:
UPDATE [Word] SET [English]=@english, [Spanish]=@spanish WHERE [Id]=@id
Záver
Výhodou pripojeného prístupu k databáze je aktuálnosť spracovávaných
dát aj vo viacužívateľských aplikáciách. Nevýhodou naopak môže byť
časté pripájanie k vzdialenej databáze, väčší objem prenesených dát aj
sekvenčné čítanie komponentu *DataReader
, teda napríklad bez
možnosti prechodu na predchádzajúci záznam.
To je pre tento článok všetko, v ďalšom sa zoznámite s vkladaním, editovaním a odstraňovaním dát v pripojených databázových aplikáciách. Dnešný projekt je so zdrojovými kódmi ako vždy v prílohe.
V nasledujúcom cvičení, Riešené úlohy k 1.-6. lekciu Databáza v C# - ADO.NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 4x (1.68 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#