6. díl - Databáze v C# .NET - INSERT, UPDATE, DELETE a COUNT

C# .NET Databáze Databáze v C# .NET - INSERT, UPDATE, DELETE a COUNT

V minulém dílu našeho seriálu tutoriálů o databázích 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 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 DataAdapter.

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))
{
        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.

Vložení řádku do databáze v C# ADO .NET

ExecuteNonQuery() vrátila hodnotu 1. Můžeme spustit původní kód naší aplikace, který vypisoval všechna slovíčka nebo nahlédnout do Microsoft SQL Management Studia. Vidíme, že klávesnice je nově mezi slovíčky:

Microsoft SQL management Studio Express

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 Anglicky=@anglicky";
using (SqlCommand sqlDotaz = new SqlCommand(dotaz, spojeni))
{
        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:

Vymazání záznamu z databáze v C# ADO .NET

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.

Vymazání záznamu z databáze v C# ADO .NET

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))
{
        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 kaluzuli WHERE, jinak se updatují všechny řádky v tabulce.

Aplikaci opět vyzkoušejme:

Update databáze v C# ADO.NET

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 setá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. Příště si uvedeme odpojený přístup k databázi.


 

Stáhnout

Staženo 334x (35.38 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (2 hlasů) :
4444 4


 



 

 

Komentáře
Zobrazit starší komentáře (34)

Avatar
Luboš
Člen
Avatar
Luboš:

Nemáte někdo funkční kód s databází ve VS?

 
Odpovědět 23.12.2015 21:34
Avatar
Odpovídá na Luboš
Štefan Pružinský:

Skús mi poslať projekt, pozriem sa na to. :)

Odpovědět 23.12.2015 21:36
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Luboš
Člen
Avatar
Luboš:

Tak jsem to vyřešil. Byl problém s připojením. Díky za nabídku pomoci.

Editováno 23.12.2015 22:21
 
Odpovědět 23.12.2015 22:20
Avatar
1.pavel.franta:

Hned na ukázce INSERT se vkládájí slovíčka do sloupců English a Czech, ale není vyřešeno přidělení Id řádku, který používáme zároveň jako primary key a proto nemůže zůstat null.

vyřešeno takhle:

string dotaz = "INSERT INTO Slovnik (Id, English, Czech) VALUES (@Id, @anglicky, @cesky)";
SqlCommand pocetRadku = new SqlCommand("SELECT COUNT (*) FROM Slovnik", napojeniDatabaze);
    int radky = (int)pocetRadku.ExecuteScalar();
using (SqlCommand sqlDotaz = new SqlCommand(dotaz, napojeniDatabaze))
            {
                sqlDotaz.Parameters.AddWithValue("@Id", radky + 1);
                sqlDotaz.Parameters.AddWithValue("@anglicky", anglicky);
                sqlDotaz.Parameters.AddWithValue("@cesky", cesky);
                int radku = sqlDotaz.ExecuteNonQuery();
                Console.WriteLine(radku);
            }
Editováno 10. ledna 22:57
 
Odpovědět 10. ledna 22:55
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na 1.pavel.franta
Jan Vargovský:

A teď si smaž ten předposlední a zkus znova insert ;)

 
Odpovědět 10. ledna 23:12
Avatar
Odpovídá na Jan Vargovský
1.pavel.franta:

:) ... pravděpodobně bych chtěl vkládat řádek s klíčem který již existuje, což by nešlo... děkuji

... v SSMS bych si nastavil klíč o jehož unikátnost se nebudu starat, ale v tomto tutorialu se o tom nebavíme, nic nenastavujeme a i přes to je tu ukázáno, že si vkládáme nové řádky, ale sloupec co nesmí zůstat prázdný tak neřešíme. Co mi uniká ?

 
Odpovědět 10. ledna 23:29
Avatar
Odpovídá na 1.pavel.franta
1.pavel.franta:

... a nebo ze by sloupec Id nemusel být vyplněný, protože možná není ani primary klíčem, jak je tu vidět z náhledu jedné tabulky ? :D Někde jsem si něco nepřečetl a nebo tu funguje to "automatické přidělování klíče." :X

 
Odpovědět 10. ledna 23:32
Avatar
Odpovídá na 1.pavel.franta
Michal Štěpánek:

Sloupec ID se nevyplňuje, bo je v DB nastaven jako "auto_increment" a doplňuje se sám automaticky... V DB si můžeš nastavit nějakou "defaultní" hodnotu i pro jiné sloupce, např. na sloupec s datumem lze nastavit getdate() a pokaždé při vložení záznamu se ti nastaví na ten záznam aktuální datum...

Odpovědět  +1 11. ledna 8:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
1.pavel.franta:

Vycházíme li z toho, že se ve VS napojujeme na databázi vytvořenou v SSMS, tak k mému překvapení vůbec nevím jak to napojit :X. Server explorer>Data connection>Add connection a tam musím vybrat jméno databázového souboru popřípadě založit novou databázi. (pořád tu operuji s localhost\JME­NOSERVERU, ale to nemám kam napsat... :D buď dej soubor a nebo si založ novou. První nemám, druhý nechci.

Mám vytvořenou databázi v SSMS podle návodu, ale vytvořený soubor který bych použil ve VS nemám žádný... sice problematice nerozumím, tak abych si mohl něco myslet, ale mnohem méně by mě překvapilo kdyby se prostě navázalo nějaké realtime spojení, než aby se otevřel nějaký soubor (leda že by obsahoval instrukce k připojení) ...

... prosím pomozte :)

 
Odpovědět 11. ledna 12:04
Avatar
Odpovídá na 1.pavel.franta
1.pavel.franta:

Sorry, jsem normálně hloupej... všechno jsem to celou dobu nezadával do SQL databse server... ale do SQL database server file name...

Už podle těch názvů se to přece vůbec nedalo poznat kde je chyba :D

 
Odpovědět 11. ledna 12:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 44. Zobrazit vše