4. diel - Pripojená databázová aplikácia v C# .NET
V minulej lekcii, Prístupy pre prácu s relačnými databázami v .NET, sme si popísali rôzne prístupy pre prácu s databázou v objektových jazykoch a tiež technológie, ktoré sú v .NET frameworku na tieto účely obsiahnuté.
Dnes si v C# .NET tutoriále ukážeme základy práce s databázou pomocou pripojeného prístupu.
Všade v ďalšom texte, kde sa pred názvom triedy objaví
*
, ju môžete nahradiť príslušným poskytovateľom dát.
Získanie ConnectionStringu
Aby sme sa mohli k DB pripojiť, potrebujeme tzv. ConnectionString. To je reťazec, ktorý obsahuje údaje potrebné na pripojenie k databáze. Typicky je tu názov databázy a prípadne heslo.
ConnectionString je možné vo Visual Studiu získať viacerými spôsobmi. Univerzálny spôsob, ktorý funguje ako v .NET Framework, tak aj v .NET Core, je otvoriť si okno "Server Explorer" alebo "SQL Server Object Explorer", kliknúť pravým tlačidlom na databázu a zvoliť "Properties". V okne "Properties" potom nájdeme ConnectionString, ktorý si niekam môžeme skopírovať:
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\User\Documents\ICTdemy\SQL\DictionarySQL\DictionaryDB.mdf;Integrated Security=True
V prípade, že ste databázu pripojili cez "Data Sources" a zaškrtli
možnosť uloženia ConnectionStringu do nastavenia projektu, tak k nemu
môžete jednoducho pristupovať rovno v kóde cez triedu Settings
.
Vypíšme si ho do konzoly:
string connectionString = Properties.Settings.Default.DictionaryDBConnectionString;
Console.WriteLine(connectionString);
ConnectionString:
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DictionaryDB.mdf;Integrated Security=True
AttachDbFilename
a
InitialCatalog
Vlastnosť InitialCatalog
odovzdáva názov databázy, ku ktorej
sa chceme pripojiť. Používa sa pre akúkoľvek databázu (nielen lokálnu).
Vlastnosť AttachDbFilename
sa používa na pripojenie k lokálnej
databáze s príponou .mdf
. Tejto vlastnosti sa odovzdáva cesta k
súboru lokálnej databázy. ConnectionString môže obsahovať obe vlastnosti
naraz alebo len jednu z nich. V .NET Framework aplikácii musí byť vždy u
lokálnej databázy použitá vlastnosť AttachDbFilename
.
Príprava .NET Core projektu
Triedy pre prácu s SQL databázami obsahuje menný priestor
System.Data.SqlClient
. V .NET Framework je tento menný priestor
už v základe a nemusíme nič riešiť. .NET Core ho však neobsahuje a musí
sa doinštalovať prostredníctvom NuGet balíčka.
Ak používame .NET Core, tak klikneme pravým tlačidlom myši do Solution
Exploreru a potom na správu balíčkov NuGet hned pod "Add" (Manage
NuGet packages for Solution...). Tu v záložke Browse
vyberieme System.Data.SqlClient
a nainštalujeme:
SQLConnectionStringBuilder
Každý poskytovateľ dát z ADO.NET potrebuje trochu iné údaje a preto sa
niekedy pripojovací reťazec generuje pomocou triedy
*ConnectionStringBuilder
. Stačí vytvoriť inštanciu tejto triedy
a naplniť jej vlastnosti požadovanými hodnotami. Výsledný reťazec bude
dostupný práve vo vlastnosti ConnectionString
. Ak nechcete
riešiť kompatibilitu s ďalšími poskytovateľmi, môžete tento krok
preskočiť a vrátiť sa k nemu napríklad neskôr. V kurze si povieme od
všetkého trochu, účelom nie je, aby vás to odradilo a vyvolalo dojem, aké
sú databázy zložité, ale aby ste mali prehľad.
Príklad 1
S využitím triedy SQLConnectionStrigBuilder
zostavte
pripojovací reťazec k našej cvičnej databáze DictionaryDB
.
Riešenie
SqlConnectionStringBuilder csb = new SqlConnectionStringBuilder(); csb.DataSource = @"(LocalDB)\MSSQLLocalDB"; csb.InitialCatalog = "DictionaryDB"; csb.IntegratedSecurity = true; string connectionString = csb.ConnectionString;
Nezabudnite deklarovať príslušný menný priestor (pridať
using System.Data.SqlClient;
).
Pripojenie
Akonáhle máme ConnectionString, môžeme sa k databáze pripojiť. To
urobíme vytvorením inštancie triedy *Connection
, ktoré
ConnectionString odovzdáme v konštruktore. Pripojenie potom otvoríme
zavolaním metódy Open()
. Je dobrým zvykom všetky databázové
objekty tvoriť v bloku using
, aby došlo k rýchlemu zatvoreniu
nepotrebných spojení. Druhým prístupom je nechávať spojenie otvorené, čo
sa robí len pri desktopových aplikáciách a vyžaduje si to nejaký
databázový wrapper, typicky realizovaný statickou triedou.
Príklad 2
Otestujte spojenie s databázou s pomocou pripojovacieho reťazca z príkladu 1. Vypíšte do konzoly, či sa spojenie podarilo otvoriť alebo nie.
Riešenie
string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=DictionaryDB;Integrated Security=True"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); Console.WriteLine("Application has successfully connected to the database."); } Console.ReadKey();
Výsledok:
Konzolová aplikácia
Application has successfully connected to the database.
Ďalší kód budeme písať pod connection.Open();
.
Databázové príkazy
Databázové príkazy sú zastúpené triedou *Command
.
Umožňujú spustiť nad pripojenou databázou akýkoľvek SQL dotaz. Pre ich
vytvorenie teda musíte poznať syntax jazyka SQL (budem sa
ich snažiť trochu popísať aj tu, avšak SQL je na ITnetwork podrobne
venovaných hneď niekoľko kurzov).
Pri novej inštancii triedy *Command
musíme naplniť 2
základné vlastnosti - Connection
(pozri príklad 2) a
CommandText
. Ten bude práve obsahovať SQL dotaz. Potom môžeme
príkaz spustiť.
Na spustenie slúžia metódy:
ExecuteReader()
- Túto prvú využijeme vtedy, ak SQL dotaz vracia množinu dát (väčšina príkazovSELECT
, napr. dotaz na jedno alebo viac slovíčok).ExecuteScalar()
- Druhá metóda nájde svoje uplatnenie, ak SQL dotaz vracia jedinú hodnotu (typickySELECT
s agregačnou funkciou, napr. počet všetkých slovíčok).ExecuteNonQuery()
- Posledná metóda sa používa na spúšťanie dotazov, ktoré nevracajú žiadnu hodnotu (príkazyINSERT
,UPDATE
,DELETE
, napr. vloženie slovíčka). Jej návratová hodnota nesie informáciu o počte "ovplyvnených" riadkov.
Príklad 3
Vytvorte príkaz, ktorý z pripojenej databázy z príkladu 2 získa počet
záznamov v tabuľke Word
a vypíše ho na obrazovku.
Riešenie
SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandText = "SELECT COUNT(*) FROM Word"; int amountOfWords = (int)command.ExecuteScalar(); // the method returns object type - it is necessary to convert to int connection.Close(); Console.WriteLine("The amount of words in the DB is {0}", amountOfWords);
Výsledok:
Konzolová aplikácia
The amount of words in the DB is 6
Otázka začína slovom SELECT
(teda vyber). SQL klauzula sa
väčšinou píšu veľkými písmenami. Ďalej nasleduje COUNT(*)
,
tým hovoríme, že nás zaujíma počet. Hviezdička označuje, že chceme
počítať s ohľadom na všetky stĺpce. FROM Word
označuje, že
dáta vyberáme z tabuľky Word
. Jednoduché, že? Mimochodom, SQL
sa predtým volalo SEQUEL, kde ono EQUEL označovalo anglický dotazovací
jazyk. Každá otázka vyzerá preto ako jednoduchá anglická veta.
Niektorí začiatočníci zisťujú počet záznamov v
tabuľke tak, že si načítajú úplne všetky riadky aj s dátami a tie potom
spočítajú (riadky sa naučíme načítať nabudúce). Vrátený výsledok je
síce rovnaký ako výsledok pri použití COUNT
, lenže sme
databázu zbytočne zaťažili načítaním hodnôt, ktoré vôbec nevyužijeme.
Medzi "načítať jedno číslo" alebo "načítať milión slovíčok len preto,
aby sme zistili, že ich je milión" je veľký výkonový rozdiel:)
V nasledujúcom kvíze, Kvíz - Databáza, prístupy, pripojená aplikácia v C#- ADO.NET , si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 3x (10.58 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#