Předvánoční slevová akce PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

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

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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))
{
    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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 [email protected]";
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 [email protected] WHERE [email protected]";
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 [email protected], [email protected] WHERE [email protected]

Stejně jako u DELETE nikdy nesmíme zapomenout na klauzuli 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][email protected], [English][email protected] WHERE [Id][email protected]

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 příští lekci, Databáze v C# .NET - DataSet a SqlDataAdapter, si uvedeme odpojený přístup k databázi.


 

Stáhnout

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

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
7 hlasů
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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
SqlDataReader a připojená databáze v C# .NET
Všechny články v sekci
Databáze v C# - ADO.NET
Miniatura
Následující článek
Databáze v C# .NET - DataSet a SqlDataAdapter
Aktivity (4)

 

 

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

Avatar
1.pavel.franta:10.1.2016 23:29

:) ... 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.1.2016 23:29
Avatar
Odpovídá na 1.pavel.franta
1.pavel.franta:10.1.2016 23:32

... 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.1.2016 23:32
Avatar
Odpovídá na 1.pavel.franta
Michal Štěpánek:11.1.2016 8:41

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
11.1.2016 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:11.1.2016 12:04

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.1.2016 12:04
Avatar
Odpovídá na 1.pavel.franta
1.pavel.franta:11.1.2016 12:12

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.1.2016 12:12
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Sciranka
Redaktor
Avatar
Peter Sciranka:17.2.2017 11:13

Ahojte, v prvom rade ďakujem za výborny seriál.
V odstavci DELETE je napísaný kód:

string dotaz = "DELETE FROM Word WHERE [email protected]";

Myslím, že by tam malo byť:

string dotaz = "DELETE FROM Word WHERE [email protected]";

Ešte raz, veľká vďaka.

Odpovědět
17.2.2017 11:13
Act as if it was Impossible to Fail
Avatar
Jan Osuský
Člen
Avatar
Jan Osuský:29.11.2018 17:45

Ahoj, asi budu za idiota, ale není náhodou chyba v druhém odstavci?

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.

Nemělo by být místo DateAdapter DateReader?

 
Odpovědět
29.11.2018 17:45
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Osuský
David Čápka:29.11.2018 19:05

Vypadá to tak, opravil jsem to, díky :)

Odpovědět
29.11.2018 19:05
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Wolf
Člen
Avatar
Wolf:27. ledna 22:26

Vedel by mi niekto pomocť kde mám chybu ? Code by mal po vlozeni dat cez texbox ulozit data do databazi ale neurobi nic pripadne to spadne na tomto riadku int riadok = sqlQuerry.Exe­cuteNonQuery();

string Connectionstring = @"Data Source=DELL-LATITUDE\SQLMYSERVER;Initial Catalog=LoginDB;Integrated Security=True";
          using (SqlConnection sqlcon = new SqlConnection(Connectionstring))
          {
              if (sqlcon.State == System.Data.ConnectionState.Closed)
                  sqlcon.Open();
              string querry = "INSERT INTO accounts (webpage, Name, Password, email) VALUES (@webpage, @name, @password, @email)";
              using (SqlCommand sqlQuerry = new SqlCommand(querry, sqlcon))
              {
                  sqlQuerry.Parameters.AddWithValue("@webpage", webpage.Text);
                  sqlQuerry.Parameters.AddWithValue("@Name", name.Text);
                  sqlQuerry.Parameters.AddWithValue("@Password", password.Text);
                  sqlQuerry.Parameters.AddWithValue("@email", email.Text);
                  int riadok = sqlQuerry.ExecuteNonQuery();
              }
                  sqlcon.Close();
          }
Odpovědět
27. ledna 22:26
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
Odpovídá na Wolf
Michal Štěpánek:28. ledna 7:29

Nevím, jaké máš v tabulce sloupce a jestli tam nemáš nějaký "povinný", ale minimálně máš jinak pojmenované parametry v dotazu a jinak ve samotném dosazování parametrů
v dotazu máš "@name, @password" a pak v parametrech máš velká počáteční písmena "@Name a @Password"
Nenapsal jsi, jakou chybu ti to hází, ale tipnul bych si, že to bude právě o tom, že nenalezl zadané parametry v dotazu...

Editováno 28. ledna 7:30
Odpovědět
28. ledna 7:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
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 48. Zobrazit vše