Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Nauč se s námi víc. Využij 50% zdarma na e-learningové kurzy.
discount week 50

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

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:

MS-SQL databáze ve Visual Studio

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:

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 [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:

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][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.


 

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 505x (1.02 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

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
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
9 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity

 

 

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

Avatar
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
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
madewman
Člen
Avatar
madewman:27.1.2019 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.1.2019 22:26
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na madewman
Michal Štěpánek:28.1.2019 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.1.2019 7:30
Odpovědět
28.1.2019 7:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Miroslav Holubek
Super redaktor
Avatar
Miroslav Holubek:12.7.2020 20:38

Ahojte, ak by ste niekto mali problém ako ja, že pri každom spustení sa všetky predchádzajúce zmeny zmažú, respektíve keďže ID začína znova od 1 sa ani neuložia,
musíte zmeniť vlastnosť "Copy to Output Directory" na .mdf súbore z "Copy Always" na "Copy if newer"

 
Odpovědět
12.7.2020 20:38
Avatar
Petr Valenta
Člen
Avatar
Odpovídá na Miroslav Holubek
Petr Valenta:5.10.2020 17:29

Přesně tohle jsem potřeboval! Veľká vďaka! (y)

 
Odpovědět
5.10.2020 17:29
Avatar
Jiří Láska:25. ledna 20:33

Nefunguje mi INSERT. Dokonce i když jsem si stáhl projekt pod tímto článkem, tak ani v něm to nefunguje. Zadám jako uživatel přes konzoli nové slovíčko, ale při následném zobrazení obsahu tabulky ve Visual studiu je vidět, že se nic nepřidalo. Mluvím o vzorovém příkladu, který jsem stáhl pod tímto článkem. Refresh nepomáhá. Zavřít a znova otevřít nepomáhá.
V čem může být chyba? Co můžu dělat špatně?
Předpokládám, že databáze se přenáší s projektem, a že by k němu měla zůstat připojená.

Tady je kód, je to z toho vzorového projektu pod článkem:

static void Main(string[] args)
        {
            string connectionString = Properties.Settings.Default.SlovickaDBConnectionString;

            using (SqlConnection spojeni = new SqlConnection(connectionString))
            {
                spojeni.Open();

                 //INSERT

                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);
                }

            }
            Console.ReadKey();
        }
 
Odpovědět
25. ledna 20:33
Avatar
Lukáš Lakota:3. května 15:52

Našel jsem malou chybku v ukázce příkazu DELETE:

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

"Anglicky" se sloupec nejmenuje, mělo by tam být "English", začátečníka, jako mě, to zmátlo, proč ten kód nefunguje :-)

 
Odpovědět
3. května 15:52
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 52. Zobrazit vše