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