Využij akce až 30% zdarma při nákupu e-learningu. Zároveň pouze tento týden sleva až 80 % na e-learning týkající se Javy
Hledáme fulltime koordinátora/ku kurzů. 100% homeoffice,100% časově flexibilní. Mám zájem!
discount week 30

Lekce 4 - Připojená databázová aplikace v C# .NET

V minulé lekci, Přístupy pro práci s relačními databázemi v .NET, jsme si popsali různé přístupy pro práci s databází v objektových jazycích a také technologie, které jsou v .NET frameworku pro tyto účely obsaženy.

Dnes si v C# .NET tutoriálu ukážeme základy práce s databází pomocí připojeného přístupu.

Všude v dalším textu, kde se před názvem třídy objeví *, ji můžete nahradit příslušným poskytovatelem dat.

Získání ConnectionStringu

Abychom se mohli k DB připojit, potřebujeme tzv. ConnectionString. To je řetězec, který obsahuje údaje potřebné k připojení k databázi. Typicky je zde název databáze a případně heslo.

ConnectionString lze ve Visual Studiu získat více způsoby. Univerzální způsob, který funguje jak v .NET Framework, tak i v .NET Core, je otevřít si okno "Server Explorer" nebo "SQL Server Object Explorer", kliknout pravým tlačítkem na databázi a zvolit "Properties". V okně "Properties" pak nalezneme ConnectionString, který si někam můžeme zkopírovat:

Data Source=(localdb)\MSSQLLocalDB; AttachDbFilename= D:\ITnetwork\SQL\SlovickaSQL\SlovickaSQL\SlovickaDB.mdf;Initial Catalog=SlovickaDB;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

V případě, že jste databázi připojili přes "Data Sources" a zaškrtli možnost uložení ConnectionStringu do nastavení projektu, tak k němu můžete jednoduše přistupovat rovnou v kódu přes třídu Settings. Vypišme si jej do konzole:

string connectionString = Properties.Settings.Default.SlovickaDBConnectionString;
Console.WriteLine(connectionString);

ConnectionString:

Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\SlovickaDB.mdf;Integrated Security=True

AttachDbFilename a InitialCatalog

Vlastnost InitialCatalog předává název databáze, ke které se chceme připojit. Používá se pro jakoukoliv databázi (nejen lokální). Vlastnost AttachDbFilename se využívá pro připojení k lokální databázi s příponou .mdf. Této vlastnosti se předává cesta k souboru lokální databáze. ConnectionString může obsahovat obě vlastnosti najednou nebo jen jednu z nich. V .NET Framework aplikaci musí být vždy u lokální databáze použita vlastnost AttachDbFilename.

Příprava .NET Core projektu

Třídy pro práci s SQL databázemi obsahuje jmenný prostor System.Data.SqlClient. V .NET Framework je tento jmenný prostor už v základu a nemusíme nic řešit. .NET Core jej však neobsahuje a musí se doinstalovat prostřednictvím NuGet balíčku.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Jestliže používáme .NET Core, tak klikneme pravým tlačítkem myši do Solution Exploreru a poté na správu balíčků NuGet (Manage NuGet packages for Solution...). Zde v záložce Browse vybereme System.Data.SqlClient a nainstalujeme:

SQLConnectionStringBuilder

Každý poskytovatel dat z ADO.NET potřebuje trochu jiné údaje a proto se někdy připojovací řetězec generuje pomocí třídy *ConnectionStringBuilder. Stačí vytvořit instanci této třídy a naplnit její vlastnosti požadovanými hodnotami. Výsledný řetězec bude dostupný právě ve vlastnosti ConnectionString. Pokud nechcete řešit kompatibilitu s dalšími poskytovateli, můžete tento krok přeskočit a vrátit se k němu třeba později. V kurzu si řekneme od všeho trochu, účelem není, aby vás to odradilo a vyvolalo dojem, jak jsou databáze složité, ale abyste měli přehled.

Příklad 1

S využitím třídy SQLConnectionStrigBuilder sestavte připojovací řetězec k naší cvičné databázi SlovnicekDB.

Řešení
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
csb.DataSource = @"(LocalDB)\MSSQLLocalDB";
csb.InitialCatalog = "SlovnicekDB";
csb.IntegratedSecurity = true;
string pripojovaciRetezec = csb.ConnectionString;

Pozn.: Nezapomeňte deklarovat příslušný jmenný prostor (přidat using System.Data.SqlClient;).

Připojení

Jakmile máme ConnectionString, můžeme se k databázi připojit. To uděláme vytvořením instance třídy *Connection, které ConnectionString předáme v konstruktoru. Připojení pak otevřeme zavoláním metody Open(). Je dobrým zvykem všechny databázové objekty tvořit v bloku using, aby došlo k rychlému zavření nepotřebných spojení. Druhým přístupem je nechávat spojení otevřené, což se dělá jen u desktopových aplikací a vyžaduje to nějaký databázový wrapper, typicky realizovaný statickou třídou.

Příklad 2

Otestujte spojení s databází s pomocí připojovacího řetězce z příkladu 1. Vypište do konzole, zda se spojení podařilo otevřít nebo ne.

Řešení

string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=SlovickaDB;Integrated Security=True";
using (SqlConnection pripojeni = new SqlConnection(connectionString))
{
    pripojeni.Open();
    Console.WriteLine("Aplikace se úspěšně připojila k databázi.");
}
Console.ReadKey();

Výsledek:

Konzolová aplikace
Aplikace se úspěšně připojila k databázi.

Další kód budeme psát pod pripojeni.Open();.

Databázové příkazy

Databázové příkazy jsou zastoupeny třídou *Command. Umožňují spustit nad připojenou databází jakýkoliv SQL dotaz. Pro jejich vytvoření tedy musíte znát syntaxi jazyka SQL (budu se je snažit trochu popsat i zde, nicméně SQL je na ITnetwork podrobně věnováno hned několik kurzů).

U nové instance třídy *Command musíme naplnit 2 základní vlastnosti - Connection (viz příklad 2) a CommandText. Ten bude právě obsahovat SQL dotaz. Poté můžeme příkaz spustit.

Ke spuštění slouží metody:

  • ExecuteReader() - Tuto první využijeme tehdy, pokud SQL dotaz vrací množinu dat (většina příkazů SELECT, např. dotaz na jedno nebo více slovíček).
  • ExecuteScalar() - Druhá metoda nalezne své uplatnění, pokud SQL dotaz vrací jedinou hodnotu (typicky SELECT s agregační funkcí, např. počet všech slovíček).
  • ExecuteNonQuery() - Poslední metoda se používá ke spouštění dotazů, které nevracejí žádnou hodnotu (příkazy INSERT, UPDATE, DELETE, např. vložení slovíčka). Její návratová hodnota nese informaci o počtu "ovlivněných" řádků.

Příklad 3

Vytvořte příkaz, který z připojené databáze z příkladu 2 získá počet záznamů v tabulce Word a vypíše jej na obrazovku.

Řešení

SqlCommand prikaz = new SqlCommand();
prikaz.Connection = pripojeni;
prikaz.CommandText = "SELECT COUNT(*) FROM Word";
int pocetSlovicek = (int)prikaz.ExecuteScalar();  // metoda vrací typ object - je potřeba převést na int
pripojeni.Close();
Console.WriteLine("Počet slovíček v DB je {0}", pocetSlovicek);

Výsledek:

Konzolová aplikace
Počet slovíček v DB je 6

Dotaz začíná slovem SELECT (tedy vyber). SQL klauzule se většinou píší velkými písmeny. Dále následuje COUNT(*), tím říkáme, že nás zajímá počet. Hvězdička označuje, že chceme počítat s ohledem na všechny sloupce. FROM Word označuje, že data vybíráme z tabulky Word. Jednoduché, že? Mimochodem, SQL se dříve jmenovalo SEQUEL, kde ono EQUEL označovalo anglický dotazovací jazyk. Každý dotaz vypadá proto jako jednoduchá anglická věta.

Někteří začátečníci zjišťují počet záznamů v tabulce tak, že si načtou úplně všechny řádky i s daty a ty potom spočítají (řádky se naučíme načítat příště). Vrácený výsledek je sice stejný jako výsledek při použití COUNT, jenže jsme databázi zbytečně zatížili načtením hodnot, které vůbec nevyužijeme. Mezi "načíst jedno číslo" nebo "načíst milion slovíček jen proto, abychom zjistili, že jich je milion" je velký výkonový rozdíl :)

V příští lekci, SqlDataReader a připojená databáze v C# .NET, si z databáze tedy načteme nějaká slovíčka.


 

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

 

Předchozí článek
Přístupy pro práci s relačními databázemi v .NET
Všechny články v sekci
Databáze v C# - ADO.NET
Článek pro vás napsal JOF
Avatar
Jak se ti líbí článek?
11 hlasů
Aktivity (12)

 

 

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

Avatar
Petr Vocel
Redaktor
Avatar
Petr Vocel:21.5.2016 11:54

Musím upozornit na nesoulad mezi SQLConnection­StringBuilder a SqlConnection. První při vytváření obloží cestu k dat.file úvozovkami, což druhý nepředpokládá a zhavaruje. Alespoň ve verzi studia 2015. Jako důkaz přikládám program a výslednou obrazovku.

namespace SlovickaSQL
{
    class Program
    {

          static void Main(string[] args)
        {
            string pripojovaciRetezec2 = @"Data Source= (LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Uceni_SQL_MS-SQL\Database\SlovnicekDB.mdf; Integrated Security = True; Connect Timeout = 30";
            Console.WriteLine("Připojovací řetezec z vlastností\n {0}<<", pripojovaciRetezec2);
            using (SqlConnection pripojeni = new SqlConnection(pripojovaciRetezec2))
            {
                Console.WriteLine("Zkusím se připojit s tímto textem:\n={0}<<", pripojovaciRetezec2);
                pripojeni.Open();
                Console.WriteLine("Aplikace se úspěšně připojila k databázi.");
                pripojeni.Close();
                Console.WriteLine("Aplikace se úspěšně odpojila od databáze.");
            }
            // získání connect stringu <
            SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder();
            csb.DataSource = @"(LocalDB)\MSSQLLocalDB";
            csb.AttachDBFilename = @"C:\Uceni_SQL_MS - SQL\Database\SlovnicekDB.mdf";
            csb.IntegratedSecurity = true;
            string pripojovaciRetezec1 = csb.ConnectionString;
            Console.WriteLine("Připojovací řetezec sestavený \n {0}<<", pripojovaciRetezec1);
            using (SqlConnection pripojeni = new SqlConnection(pripojovaciRetezec1))
            {
                Console.WriteLine("Zkusím se připojit s tímto textem:\n={0}<<",pripojovaciRetezec1);
                pripojeni.Open();
                Console.WriteLine("Aplikace se úspěšně připojila k databázi.");
                pripojeni.Close();
                Console.WriteLine("Aplikace se úspěšně odpojila od databáze.");
            }
            Console.ReadKey();

        }
    }
}

Výsledná obrazovka
Připojovací řetezec z vlastností
Data Source= (LocalDB)\MSSQLLo­calDB;AttachDbFi­lename=C:\Uce­ni_SQL_MS-SQL\Database\Slov­nicekDB.mdf; Integrated Security = True; Connect Timeout = 30<<
Zkusím se připojit s tímto textem:
=Data Source= (LocalDB)\MSSQLLo­calDB;AttachDbFi­lename=C:\Uce­ni_SQL_MS-SQL\Database\Slov­nicekDB.mdf; Integrated Security = True; Connect Timeout = 30<<
Aplikace se úspěšně připojila k databázi.
Aplikace se úspěšně odpojila od databáze.
Připojovací řetezec sestavený
Data Source=(Local­DB)\MSSQLLocal­DB;AttachDbFi­lename="C:\Uce­ni_SQL_MS - SQL\Database\Slov­nicekDB.mdf";In­tegrated Security=True<<
Zkusím se připojit s tímto textem:
=Data Source=(Local­DB)\MSSQLLocal­DB;AttachDbFi­lename="C:\Uce­ni_SQL_MS - SQL\Database\Slov­nicekDB.mdf";In­tegrated Security=True<<

Hláška
An unhandled exception of type 'System.Data.SqlCli­ent.SqlExcepti­on' occurred in System.Data.dll

Additional information: An attempt to attach an auto-named database for file C:\Uceni_SQL_MS - SQL\Database\Slov­nicekDB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

 
Odpovědět
21.5.2016 11:54
Avatar
JOF
Lektor
Avatar
Odpovídá na Petr Vocel
JOF:22.5.2016 7:50

Ahoj,

v druhém případě máš v cestě k souboru nějaké mezery navíc - "...Uceni_SQL_MS - SQL...".
Nebude to tím?

 
Odpovědět
22.5.2016 7:50
Avatar
Petr Vocel
Redaktor
Avatar
Odpovídá na JOF
Petr Vocel:22.5.2016 8:42

Ahoj,
máte pravdu. Nevím jak se mi tam dostaly, text jsem určitě odněkud kopíroval, ale po odstranění ve volacích parametrech pro bilder, je výsledek již bez úvozovek a vše prochází, tak jak má. Dík.
Petr

:-)
 
Odpovědět
22.5.2016 8:42
Avatar
Poggy
Člen
Avatar
Poggy:16.4.2017 14:30

Ahoj,

potřebuji poradi jak připojit SQL databázi v Server Expres ve VS 2015. Postupuji dle zdejšího návodu. Data Connection => Add Connection... Pak vyběhne tabulka kam bych měl zadat adresu databáze. Zkoušel jsem localhost\NOTEBOOK-DEL\SQLEXPRES, pak bez localhost, s localhost na konci a nic. Jak se k té dabazázi vytvořené v management studiu dostanu? Díky

 
Odpovědět
16.4.2017 14:30
Avatar
jozef_i
Člen
Avatar
jozef_i:16.4.2017 14:55

Tam treba zadať meno .mdf súboru databázy SlovnicekBD.mdf . Alebo použiť SQL server pripojenie na \Notebook-Del\SQLEXPRESS .

 
Odpovědět
16.4.2017 14:55
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Poggy
Člen
Avatar
Odpovídá na jozef_i
Poggy:16.4.2017 15:14

To jsem zkoušel také, zadal jsem: localhost\NOTEBOOK-DEL\SQLEXPRES­S\SlovnicekDB­.mdf a také nefunguje. Viz. screen. Funguje to jen když vytvořím SQL databázi zcela mimo mannagent studio v server explorer.

 
Odpovědět
16.4.2017 15:14
Avatar
nicknack
Člen
Avatar
nicknack:4.8.2017 10:30

2Poggy:
ahoj,
to první jsi měl dobře, jen jsi zapoměl na konci 2 SS -> aspon podle toho obrazku co jsi sem dal

 
Odpovědět
4.8.2017 10:30
Avatar
Jiří Velich:15.1.2020 6:18

Ahoj
nevím kde jsem udělal chybu. SqlConnection­StringBuilder se nepovedlo najít.

 
Odpovědět
15.1.2020 6:18
Avatar
Odpovídá na Jiří Velich
Michal Štěpánek:16.1.2020 8:38

Co ti nabídne, když na to najedeš myší? Máš správnou verzi .NET frameworku?

Odpovědět
16.1.2020 8:38
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Josef Rajmon
Brigádník
Avatar
Josef Rajmon:20. ledna 9:35

Ahoj, delam jsi takovou... "hru" v okenich aplikacich... chci si udelat vyzkum pomoci databaze, ale pri pokusu o pripojeni to blbne. Nevi nekdo co by to mohlo zpusobit?

Odpovědět
20. ledna 9:35
Existuje lepší moznost, najdi ji!
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 43. Zobrazit vše