Lekce 6 - Databáze v C# .NET - INSERT, UPDATE, DELETE a COUNT
V minulé lekci, SqlDataReader a připojená databáze v C# .NET, jsme se naučili číst data z databáze pomocí SqlDataReaderu. Také jsme se naučili používat parametrizované dotazy, které znemožňují útok SQL injection.
Dnes si v C# .NET tutoriálu zkusíme obsah databáze měnit.
Vkládání, mazání a editace hodnot
Základní databázové operace se často označují zkratkou CRUD. Jedná se o operace:
- Create (vytvořit),
- Read (číst),
- Update (aktualizovat),
- Delete (odstranit).
Minule jsme si ukázali operaci Read. Již víme, že data z databáze čteme
příkazem SELECT
a potřebujeme k tomu
*DataReader
.
INSERT
Vyzvěme uživatele k zadání slovíčka anglicky a česky. Nové slovíčko vložíme do databáze:
Console.WriteLine("Zadej nové slovíčko anglicky"); string anglicky = Console.ReadLine(); Console.WriteLine("Zadej nové slovíčko česky"); string cesky = Console.ReadLine(); string dotaz = "INSERT INTO Word (English, Czech) VALUES (@anglicky, @cesky)"; using (SqlCommand sqlDotaz = new SqlCommand(dotaz, spojeni)) { spojeni.Open(); sqlDotaz.Parameters.AddWithValue("@anglicky", anglicky); sqlDotaz.Parameters.AddWithValue("@cesky", cesky); int radku = sqlDotaz.ExecuteNonQuery(); Console.WriteLine(radku); }
SQL dotaz pro vložení nového řádku do tabulky začíná příkazem
INSERT INTO
, následuje název tabulky. V závorkách vypíšeme
názvy sloupců, do kterých vkládáme hodnoty. Za klauzuli VALUES
vypíšeme opět do závorky hodnoty. Nemělo by vás překvapit, že použijeme
opět parametry.
Dotaz vložíme do instance třídy SqlCommand
. Dodáme mu
potřebné parametry a spustíme ho metodou ExecuteNonQuery()
.
Metoda vrací počet ovlivněných řádků. Pro ověření, že vložení
proběhlo, si je vypišme do konzole:
Konzolová aplikace
Zadej nové slovíčko anglicky
keyboard
Zadej nové slovíčko česky
klávesnice
1
Metoda ExecuteNonQuery()
vrátila hodnotu 1
.
Můžeme spustit původní kód naší aplikace, který vypisoval všechna
slovíčka nebo nahlédnout do samotné databáze v designeru. Vidíme, že
klávesnice je nově mezi slovíčky:

DELETE
Přejděme k mazání záznamů. Oproti vkládání není v podstatě žádný rozdíl, jen jsem chtěl, abychom si pro úplnost ukázali všechny dotazy z CRUD:
Console.WriteLine("Zadej anglické slovíčko, které chceš vymazat"); string anglicky = Console.ReadLine(); string dotaz = "DELETE FROM Word WHERE English=@anglicky"; using (SqlCommand sqlDotaz = new SqlCommand(dotaz, spojeni)) { spojeni.Open(); sqlDotaz.Parameters.AddWithValue("@anglicky", anglicky); int radku = sqlDotaz.ExecuteNonQuery(); Console.WriteLine(radku); }
C# kód se vůbec nezměnil. SQL dotaz začíná DELETE FROM
a
pokračuje názvem tabulky. Následuje podmínka WHERE
, kterou již
dobře známe.
Nikdy na podmínku v příkazu DELETE
nezapomeňte, jinak dojte k vymazání všech záznamů v tabulce!
Aplikaci opět vyzkoušejme:
Konzolová aplikace
Zadej anglické slovíčko, které chceš vymazat
keyboard
1
Zkontrolujte si, že klávesnice mezi slovíčky již opravdu není. Můžeme
zkusit i zadat neexistující slovíčko k vymazání, počet ovlivněných
řádků bude 0
:
Konzolová aplikace
Zadej anglické slovíčko, které chceš vymazat
binary tree
0
UPDATE
Naši čtveřici dotazů zakončeme příkazem UPDATE
, který
vyvolá změnu. Naučme aplikaci měnit český překlad nějakého anglického
slova:
Console.WriteLine("Zadej anglické slovíčko, u kterého chceš upravit překlad"); string anglicky = Console.ReadLine(); Console.WriteLine("Zadej nový překlad"); string cesky = Console.ReadLine(); string dotaz = "UPDATE Word SET Czech=@cesky WHERE English=@anglicky"; using (SqlCommand sqlDotaz = new SqlCommand(dotaz, spojeni)) { spojeni.Open(); sqlDotaz.Parameters.AddWithValue("@anglicky", anglicky); sqlDotaz.Parameters.AddWithValue("@cesky", cesky); int radku = sqlDotaz.ExecuteNonQuery(); Console.WriteLine(radku); }
C# kód je opět nezměněný (pouze jsme přidali parametr). SQL dotaz
začíná UPDATE
, následuje název tabulky a dále klauzule
SET
. Po ní název sloupce, rovnítko a nová hodnota. Pokud bychom
potřebovali updatovat více sloupců, zapíšeme to např. takto:
UPDATE Word SET Czech=@cesky, English=@anglicky WHERE Id=@id
Stejně jako u DELETE
nikdy nesmíme
zapomenout na klauzuli WHERE
, jinak se updatují všechny
řádky v tabulce.
Aplikaci opět vyzkoušejme:
Konzolová aplikace
Zadej anglické slovíčko, u kterého chceš upravit překlad
dog
Zadej nový překlad
stopovat
1
Zkontrolujte si, že se překlad změnil.
Hranaté závorky
Ještě jsme nezmínili použití hranatých závorek v dotazech. Pokud
název nějakého sloupce koliduje s klíčovým slovem z SQL (např. se sloupec
jmenuje Where
), dáme ho do hranatých závorek. Často se setkáte
s konvencí, kde se takto označují všechny názvy:
UPDATE [Word] SET [Czech]=@cesky, [English]=@anglicky WHERE [Id]=@id
Závěr
Výhodou připojeného přístupu k databázi je aktuálnost zpracovávaných
dat i ve víceuživatelských aplikacích. Nevýhodou naopak může být časté
připojování ke vzdálené databázi, větší objem přenesených dat i
sekvenční čtení komponenty *DataReader
, tedy například bez
možnosti přechodu na předcházející záznam.
To je pro tento článek vše, v dalším se seznámíte s vkládáním, editováním a odstraňováním dat v připojených databázových aplikacích. Dnešní projekt je se zdrojovými kódy jako vždy v příloze.
V následujícím cvičení, Řešené úlohy k 1.-6. lekci Databáze v C# - ADO.NET, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 608x (1.02 MB)
Aplikace je včetně zdrojových kódů v jazyce C#