2. díl - MS-SQL krok za krokem: Vytvoření databáze a tabulky

MS-SQL krok za krokem MS-SQL krok za krokem: Vytvoření databáze a tabulky

V minulém dílu seriálu tutoriálů o MS-SQL databázi jsme si řekli něco o relačních databázích a připravili jsme si prostředí. Dnes si vytvoříme databázi a do ní nějakou tabulku.

Vytvořme si databázi, obvykle nám pro jeden projekt (web) postačí jedna databáze.

Ve Visual Studiu si vytvořte libovolnou aplikaci v C# nebo VB.NET, nejlepší bude, když si asi vytvoříte konzolovou aplikaci. Vybraný jazyk nás vlastně nebude zajímat, protože se budeme věnovat pouze databázi. V okně Solution Explorer klikněte pravým tlačítkem na projekt a vyberte Add > New Item. V otevřeném dialogovém okně Add New Item vyberte kategorii Data a položku Service-based Database. Databázi pojmenujte třeba databazeProWeb. V MS-SQL databázích je zvykem používat CamelCase při pojmenovávání, diakritice se jako vždy vyhneme. Dialog potvrdíme.

Vytvoření MS-SQL databáze

Máme vše připraveno k tomu, abychom se mohli začít učit jazyk T-SQL.

Jazyk T-SQL

T-SQL označuje Transact Structured Query Language, tedy strukturovaný dotazovací jazyk. T-SQL je tzv. jazyk deklarativní. Zatímco u imperativních jazyků počítači vlastně říkáme krok po kroku co má udělat, u jazyků deklarativních pouze říkáme co má být výsledkem a již nás nezajímá, jak tohoto výsledku počítač dosáhne. Díky tomu jsou databázové dotazy zjednodušeny na příkaz typu "Vrať mi 10 uživatelů s nejvyšším hodnocením". Databáze takový dotaz pochopí, rozloží si ho na nějaké své instrukce a tak jej zpracuje. Nám poté opravdu vrátí výsledek, aniž bychom tušili, jak k němu došla. Pokud vám příkaz přišel jako nadsázka, tak tomu tak není a příkazy opravdu takto vypadají. Jen jsou anglicky.

T-SQL se používá na platformě MS-SQL a dokud se nedostanete do jeho hlubin, tak je totožný s SQL. Každý výrobce databáze si SQL trochu upraví, ale základ je vždy stejný.

SQL se původně jmenovalo SEQUEL (Structured English Query Language) a vzniklo v laboratořích společnosti IBM s cílem vytvořit jazyk, kterým by se dalo komunikovat s databází jednoduchou angličtinou. SQL (relační) databáze se poté rozšiřovaly a ujaly. Dnes se prakticky nic jiného nepoužívá a i když má T-SQL v objektovém programování značné nevýhody, firmám se nechce přecházet na nic jiného (i když existují alternativní řešení). Ale to jsme odbočili.

V T-SQL (a SQL obecně) se většinou píší příkazy velkými písmeny, to proto, že je to lépe odliší od zbytku dotazu nebo od kódu naší aplikace (např. v ASP.NET). Názvy tabulek, sloupců a další identifikátory se v T-SQL píší CamelCase notací (první písmeno slova velké, další malá, bez mezer). Je dobrým zvykem je vkládat do hranatých závorek (na QWERTY klávesnici AltGt + F a AltGt + G).

Vytvoření tabulky

Databázi si v okně Serve Explorer otevřete. Pokud ho nevidíte, zajděte do menu View > Server Explorer. Databázi si rozklikněte, uvidíte 7 složek, nás zatím bude zajímat složka Tables. Rozklikněte si ji. Nic v ní nebude, protože jsme si zatím žádnou tabulku nepřidali. Klikněte pravým tlačítkem na tuto složku vyberte Add New Table.

Přidat tabulku

Visual Studio otevře designer tabulky. Tento designer má okno rozdělené na tři části. V horní polovině máme sloupce naší tabulky s jejich datovými typy a dalšími důležitými vlastnostmi a dole výsledný T-SQL kód, který se spustí až budeme chtít databázi vytvořit.

Vytvoření tabulky ve Visual Studiu

Vpravo nahoře si přidáme do tabulky sloupce. Přidejte si do tabulky sloupce Jmeno, Prijmeni, DatumNarozeni a PocetClanku. Výchozí sloupec Id, ponecháme.

Přesuňme se k 2. sloupci, kde jsou datové typy jednotlivých sloupců tabulku. Přednastavený máme nchar(10), což jsou textové řetězce o 10 znacích. Typů je opravdu mnoho, ale my si dlouho (asi až do konce seriálu) vystačíme jen s několika. Id ponecháme na int, Jmeno a Prijmeni nastavíme na nvarchar(60), to je krátký text o maximálně 60 znacích. Datum narození na date. Poslední, PocetClanku, bude typu int. U všech sloupců zrušte zatržení ve sloupci Allow Nulls. Časem si popíšeme i další datové typy a NULL (který jsme zakázali), ale teď vám s nimi nebudu motat hlavu :) U datových typů pro text, pokud to umožňují (s tím vám poradí našeptávač, kterého jste si již určitě všimli) se do závorek uvádí maximální délka.

Všimněte si, že předdefinovaný sloupec Id má u sebe ikonku klíče. Jedná se o tzv. primární klíč. Klíče (někdy indexy) nám umožňují identifikovat položku v tabulce. Takový primární klíč by měla mít každá tabulka (i když teoreticky nemusí). Když budeme chtít uživatele např. vymazat, vymažeme ho podle tohoto klíče (tedy podle Id). Kdybychom ho mazali podle jména, smazali bychom několik položek, protože třeba Janů Nováků tam může být více. Podle Id vymažeme vždy jen toho jednoho. Aby se uživatelé číslovali automaticky, tak sloupci Id nastavíme Identity specification. Označte sloupec Id a v okně properties (pokud ho nevidíte zmáčkněte F4) si rozbalte nabídku Identity Specification a u vlastnosti "Is Identity" vyberte true. Vlastnost Identity Increment říká, že budeme číslo zvětšovat o 1.

Okno properties – nastavení Identity
Vytvoření tabulky v Visual Studio

Než tabulku odešlete v kódu změňte její název (v hranatých závorkách nahoře za definici) na "Uzivatele". Navrženou tabulku musíme do databáze "odeslat". Do databáze se pošle SQL dotaz vygenerovaný Visual Studiem, který vidíme v dolní polovině návrháře. Odeslání provede tlačítkem Update vlevo nahoře. Teď se staly dvě události. Tou první je, že nám Visual Studio otevřelo dialog, který (až se načte) bude shrnovat co v databázi měníme a jaký by to mohlo mít dopad. V našem případě se ni zvláštního neděje a proto zpráva bude stručná a krátká. Ale kdybychom třeba přidávali sloupce, Visual Studio nás informuje o skutečnosti, jakou hodnotu budou mít nově přidané sloupce u již stávajících položek. Až se dialog načte, potvrďte ho tlačítkem Update Database.

Dialog se sohrnem změn v databázi

Dále nám Visual Studio otevřelo okno Data Tools Operation. Zde se objevila jedna položka, která se změnila v zelenou fajfku (pokud vše proběhlo jak má). Když si ji rozkliknete, uvidíte, že operace, kterou jsem provedli, Visual Studio doplnilo tím, že se serveru zeptalo právě na možné důsledky a ty nám zobrazilo. Poté vygenerovalo script, ten spustilo a ten proběhl úspěšně.

Data tools operations

Když si okno Server Explorer aktualizujete (první tlačítko v nástrojové liště tohoto okna), tak se tam databáze objeví.

Nyní si projdeme T-SQL kód který Visual Studio vytvořilo.

CREATE TABLE [dbo].[Uzivatele]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Jmeno] NVARCHAR(60) NOT NULL,
    [Prijmeni] NVARCHAR(60) NOT NULL,
    [DatumNarozeni] DATE NOT NULL,
    [PocetClanku] INT NOT NULL
)

První řádek je jasný, na dalších řádcích se definují jednotlivé sloupce tabulky a jejich datový typ. NOT NULL je to, proč jsme rušili zatržítka. O NULL se dozvíte v některém z dalších dílů. U nvarchar k typu uvedeme i počet znaků. Id je označeno jako primární klíč tabulky a IDENTITY označuje, aby databáze každému novému uživateli přiřadila o 1 větší ID, než měl poslední.

Odstranění tabulky je stejné, jako odstranění databáze. Tabulku však neoznačujete v Solution Exploreru, ale Server Exploreru.

Spouštění scriptu T-SQL

T-SQL scripty tvoříme přes pravé tlačítko na databázi v Server Exploreru a vyberete new Query. Otevře se nám nový soubor SQL a tam píšete T-SQL kód, když ho chcete zpracovat kliknete na zelenou šipku Execute, která je vlevo nahoře jako bylo tlačítko Update u tabulek.

Odstraňování tabulek lze provést pomocí SQL kódu

DROP TABLE [Uzivatele];

Zkuste si tabulku dropnout a poté znovu vložit pomocí SQL dotazu. Příště si ji již naplníme nějakými daty :)


 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.

Jak se ti líbí článek?
Celkem (12 hlasů) :
4.666674.666674.666674.666674.66667


 



 

 

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

Avatar
Michal Štěpánek:

Zkus ten soubor "Slovicka.mdf" dát někam jinam (třeba do C:\DB\Slovicka­.mdf") a do Connectionstringu zadej pevnou cestu, jestli to pomůže

<connectionStrings>
    <add name="Palappras.Properties.Settings.SlovickaConnectionString"
      connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\DB\Slovicka.mdf;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

A v tom kódu souboru by mělo stačit uvést pouze jméno toho ConnectionStringu z App.config

Editováno 16.8.2014 18:09
Odpovědět 16.8.2014 18:07
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
skala_honza
Člen
Avatar
skala_honza:

Dal jsem ten kód to try catch a nechal jsem si chybu vypsat.
viz obrázek
Když přesunu na svém počítači aplikaci do jiné složky a spustím bez VS tak funguje - ověřil jsem zda to načítá opravdu z té lokální databáze a ne z nějaké jiné.
Ale na jiných počítačích to hází tuto chybu viz obrázek
Není to třeba tím že se musí nainstalovat sql server expres nebo není chyba někde v zabezpečení - já jsem použil windows authorization

Editováno 27.8.2014 18:59
Odpovědět 27.8.2014 18:58
Když nevím co s tím tak je chyba v compileru.
Avatar
Odpovídá na skala_honza
Michal Žůrek (misaz):

jaký používáš connection string? Pošli kód, kterým se k databázi připojjuješ. Kopíruješ na počítače i tu databázi?

Odpovědět  -1 27.8.2014 19:23
Nesnáším {}, proto se jim vyhýbám.
Avatar
skala_honza
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
skala_honza:

Ano tu databázi tam kopíruju
ten kód už jsem psal výše ale tady je:

//try
//{

    string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Data\Slovicka.mdf;Integrated Security=True";
    using (SqlConnection pripojeni = new SqlConnection(connectionString))
    {
        pripojeni.Open();
        SqlCommand prikaz = new SqlCommand("SELECT * FROM Preklad WHERE Spanelsky LIKE @slovo ORDER BY Spanelsky", pripojeni);
        prikaz.Parameters.AddWithValue("@slovo", "%" + slovo + "%");
        SqlDataReader dataReader = prikaz.ExecuteReader();
        while (dataReader.Read()) // dokud neprojdeme vsechny zaznamy
        {
            ListBoxItem itm = new ListBoxItem();
            Vysledek vysl = new Vysledek();
            string rod = "";
            string pravidelnost = "";

            if (!dataReader["Rod"].ToString().Contains(' ') || !dataReader["Rod"].ToString().Contains(' '))
                rod = "; rod: " + dataReader["Rod"].ToString();

            if (dataReader["Nepravidelné"].ToString().Contains('r'))
                pravidelnost = "; Pravidelnost: " + dataReader["Nepravidelné"].ToString();
            //Učebnice: {3}; Lekce: {4}; Kategorie: {5};  ,dataReader["Ucebnice"].ToString(),dataReader["Lekce"].ToString(),dataReader["Kategorie"].ToString()
            string horni = string.Format("{0}{1}{2}", dataReader["Spanelsky"].ToString(), rod, pravidelnost);

            string[] cesky = new string[4];
            cesky[0] = dataReader["Cesky1"].ToString();
            cesky[1] = dataReader["Cesky2"].ToString();
            cesky[2] = dataReader["Cesky3"].ToString();
            cesky[3] = dataReader["Cesky4"].ToString();
            string dolni = cesky[0];
            for (int i = 1; i <= 3; i++)
                if (cesky[i].Length > 0)
                    dolni += "; " + cesky[i];
            vysl.slovickoTB.Text = horni;
            vysl.prekladTB.Text = dolni;
            itm.Content = vysl;
            try
            {
                vysledky.Items.Add(itm);
            }
            catch { }
        }
    }
//}
//catch { }
Odpovědět 27.8.2014 20:09
Když nevím co s tím tak je chyba v compileru.
Avatar
Odpovídá na skala_honza
Michal Žůrek (misaz):

a kopíruješ ji do DataDirectory? Zkus tu cestu poskládat v C#, tak aby byla absolutní.

Odpovědět  -1 27.8.2014 20:18
Nesnáším {}, proto se jim vyhýbám.
Avatar
skala_honza
Člen
Avatar
skala_honza:

Já na ty počítače kopíruju úplně celej projekt.
A myslel jsem že DataDirectory je složka ze které se spouští aplikace

Odpovědět 27.8.2014 20:21
Když nevím co s tím tak je chyba v compileru.
Avatar
Odpovídá na skala_honza
Michal Žůrek (misaz):

no tím si právě nejsem jistý, vyzkoušej tu absolutní cestu.

Odpovědět  -1 27.8.2014 20:22
Nesnáším {}, proto se jim vyhýbám.
Avatar
skala_honza
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
skala_honza:

no tak jsem to zkusil a hází to stále stejnou chybu
zde je změněný connectionstring

string connectionString = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Data\Slovicka.mdf;Integrated Security=True";

napadá mě nemůže být třeba chyba tady jak to začíná tím:
@"Data Source=(Local­DB)\v11.0; ?

P.S. na mém PC to stále funguje
P.P.S je divný že to hází zrovna tuhle chybu a ne třeba chybu že soubor nemůže být otevřen nebo soubor nemůže být nalezen

Editováno 27.8.2014 20:39
Odpovědět 27.8.2014 20:37
Když nevím co s tím tak je chyba v compileru.
Avatar
skala_honza
Člen
Avatar
skala_honza:

Udělal jsem jeden test a zjistil jsem toto.
Kamarád má na počítači SQL Server a moje appka mu v pohodě jede.
Ale na těch 2 počítačích na kterých sql server není to nefunguje.

Musím přijít na to jak to vyřešit. Díky všem co se mi snažili pomoct a promiňte že jsem vás stále bombardoval otázkami. Bohužel neumím tolik programovat a nedokázal jsem si pomoct sám.

Editováno 31.8.2014 16:18
Odpovědět 31.8.2014 16:15
Když nevím co s tím tak je chyba v compileru.
Avatar
xgreplt
Člen
Avatar
xgreplt:

Jen pro zajimavost co je CamelCase : http://cs.wikipedia.org/wiki/CamelCase

 
Odpovědět 17.2.2015 20:10
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 34. Zobrazit vše