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.
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 (typickySELECTs 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říkazyINSERT,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 následujícím kvízu, Kvíz - Databáze, přístupy, připojená aplikace v C#- ADO.NET , si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
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 940x (1.03 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

