10. díl - První databázová aplikace v C# (LINQ to SQL)

C# .NET Databáze První databázová aplikace v C# (LINQ to SQL)

V minulém dílu našeho seriálu tutoriálů o C# .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 konečně vytvoříme svou první databázovou aplikaci v C# .NET.

Připojení k databázi z Visual Studia

Ve Visual Studio si vytvoříme nový projekt, Windows Form Application. Pojmenujeme ji Slovnicek. Nyní otevřeme Server Explorer (ve verzích Express se okno jmenuje Database Explorer), klikneme pravým na Data Connections a zvolíme Add Connection.

Server/Database Explorer ve Visual Studiu

V následujícím dialogu zkontrolujeme, že máme v DataSource nastaveno "Microsoft SQL Server (SqlClient)". Do Server name zadáme "localhost\JME­NO_VASEHO_SER­VERU" a dole vybereme naši databázi SlovnicekDB. Potvrdíme.

Přidání nového připojení k MS-SQL databázi ve Visual Studio

Visual Studio o naší databázi ví a dokáže se k ní připojit.

LINQ to SQL

My budeme pro práci s databází používat technologii LINQ to SQL. Již podle názvu se jedná o LINQ provider, který umožňuje komunikovat s MS-SQL databází pomocí technologie LINQ. Technologii LINQ z minulých lekcí umíme používat.

LINQ to SQL je na používání poměrně jednoduché ORM, díky kterému budeme s řádky z databáze pracovat jako s objekty.

K projektu Slovnicek si připojíme nový item, LINQ to SQL Classes. Jméno klidně ponecháme na DataClasses, jen smažeme tu jedničku.

LINQ to SQL Classes ve Visual Studio

Otevře se nám prázdná plocha. K projektu jsme nyní přidali třídy, které představují jednotlivé entity v databázi. Pro každou tabulku bude v DataClasses třída, která ji reprezentuje. Třída bude mít takové vlastnosti, jako má tabulka sloupce. Dále nám umožní jednoduše používat relace, které v naší situaci s jedinou tabulkou zatím nevyužijeme. DataClasses za nás samozřejmě vygeneruje Visual Studio, přesněji nástroj DBMetal. Stačí otevřít Server Explorer, označit všechny tabulky v databázi a myší je přesunout na bílou plochu DataClasses.

LINQ to SQL Classes ve Visual Studio

To je opravdu vše. Nyní můžeme s databází pracovat plně objektově. Pro lepší pochopení funkčnosti jsem pro vás připravil obrázek. Naše aplikace komunikuje pouze s DataClasses, kde jsou objekty s daty, o víc se my nestaráme. Na pozadí DataClasses komunikují s databází pomocí provideru LINQ to SQL a naše objektové dotazy jsou automaticky převáděny na čisté SQL, posílány databázi a výsledky z databáze jsou opět převáděny na objekty a vraceny pomocí DataClasses.

LIQn to SQL princip

Možná se vám to zdá složité, ono také složité je, ale pouze uvnitř. Celá technologie je velmi dobře odladěná a jednoduše použitelná, objektový komfort při psaní aplikací je velmi příjemný, urychluje vývoj a zpřehledňuje kód.

První databázová aplikace

Pojďme nakonec konečně něco naprogramovat. Přejděme do Form1.cs a na jeho plochu si natahněme DataGridView, tu pojmenujeme dataGridViewSlo­vicka. Dolů umístěme tlačítko Načti, pojmenované buttonNacti.

Databázový formulář s komponentou DataGridView v C# .NET

Právě kontrolka DataGridView se dokonale hodí k zobrazení dat z databáze. Umí toho opravdu mnoho a lze ji velmi dobře přizpůsobovat.

Uvnitř formuláře si vytvořme tzv. datový kontext. To je proměnná, která referencuje na objektovou strukturu databáze. Kontext nám vygenerovalo Visual Studio a je součásti DataClasses. Přidejme si tuto proměnnou do formuláře:

public partial class Form1 : Form
{
    DataClassesDataContext kontext = new DataClassesDataContext();

    ...

Zavoláním konstruktoru se nám aplikace k databázi připojí. Parametry připojení můžeme v konstruktoru blíže specifikovat nebo je můžeme upravit v souboru app.config, který se k našemu projektu přidal díky LINQ to SQL Classes. Zatím se tím však nebudeme zatěžovat.

Naklikněme si tlačítko buttonNacti, zde do zdroje dat dataGridView odkážeme kolekci Words z kontextu:

dataGridViewSlovicka.DataSource = kontext.Words;

Ano, Visual Studio nám při generování DataClasses vytvořilo pro každou tabulku kolekci. Kolekce slovíček (objektů typu Word) se jmenuje Words. Ve výchozím nastavení dochází k pluralizaci názvů, což je velmi intuitivní a přehledné. Funguje to samozřejmě jen v angličtině, kdybychom tabulku pojmenovali Slovicko, VS by došlo k názvu Slovickos, to není příliš pěkné. Proto budeme databázi preferovat v angličtině. Narážíme na další problém s používáním českých identifikátorů, proto to ve svých programech nikdy nedělám, nicméně jsem vám slíbil, že tutoriály budu psát česky.

Aplikaci spustíme a klikneme na tlačítko:

Databázový formulář s komponentou DataGridView v C# .NET

Vidíme, že jsme se úspěšně napojili na databázi a zobrazili si obsah tabulky Word, tedy kolekci Words v kontextu z DataClasses.

Aplikace je spolu s exportem databáze v příloze.


 

Stáhnout

Staženo 791x (51.32 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

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


 



 

 

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

Avatar
dvorak_cz
Člen
Avatar
dvorak_cz:

zdravim. sdraco - díky za super tutorialy. s databázemi začínám.Měl bych dotaz podobný jako misaz. Jde mi o to jak dotazovat. dataGridViewSlo­vicka.DataSou­rce = kontext.Words; mi vyplivne celou tabulku. Pokud bych chtěl např: English LIKE %o%

zkoušel jsem :
kontext.Execu­teCommand("SE­LECT * FROM Word WHERE English LIKE %o%");
nebo
kontext.Execu­teQuery<Word>("SE­LECT * FROM Word WHERE English LIKE %o%");

oboje asi probehlo ale jak to dostat zase do dataGridViewSlo­vicka ???
když dám dataGridViewSlo­vicka.DataSou­rce = kontext.Words; mám opět celou tabulku.

hledal jsem i SqlCeCommand jak píše pako ale bez výsledku.

díky za info

 
Odpovědět 28.2.2014 11:14
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dvorak_cz
Jan Vargovský:

Udělej to přímo pomocí LINQu a nepatlej se v SQL dotazech. Pracuješ tam přímo s objekty a né s tabulkami = pohodlnější práce :)

 
Odpovědět 28.2.2014 12:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na dvorak_cz
David Čápka:

Jelikož se technologie jmenuje LINQ to SQL, tak v ní budeš pro filtrování dat používat LINQ. Je tu popsaný v příslušné sekci.

Odpovědět 28.2.2014 12:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Veganekk
Člen
Avatar
Veganekk:

Chci se zeptat když chci přistupovat k databázi pres program jde to nejak bez tohoto LINQ TO SQL ?
Mám databazi na serveru a chci vypsat data z konkretni tabulky ale nevim presne jak na to ... Muzete me navist jak na to ?

Odpovědět 17.6.2014 1:47
Rád se učím novým věcem. A věci co nechápu rád pochopím a naučím.
Avatar
Odpovídá na Veganekk
Michal Štěpánek:

Můžeš použít buď LINQ TO SQL, nebo EF, nebo si můžeš položit klasický SQL dotaz přímo na tu databázi... (předpokládám, že máš SQL databázi)

Editováno 17.6.2014 10:01
Odpovědět 17.6.2014 10:00
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na Veganekk
Milan Křepelka:

Přečti si úvodní díly tohoto seriálu. Budeš mít základní přehled a pak už budeš vědět.

 
Odpovědět 17.6.2014 12:00
Avatar
srdosm
Člen
Avatar
srdosm:

To je divný. Když ten program chvíli nepoužívám, tak trvá strašně dlouho, než se to z tý databáze načte. A když se to načítá, tak to zasekne celej program. Je o tom v dalším díle něco víc, jestli se to ošetřuje nebo jestli je to tou metodou LINQ to SQL (jak bylo psáno, že data nemusí být úplně aktuální) nebo jestli je to databází nebo je standard?

 
Odpovědět 23.9.2014 18:20
Avatar
brundibar.brun:

Chtěl bych se zeptat, jestli nemáte článek, nebo o nějakém nevíte, kde by vysvětlovali práci s "dataGridView" ve Formové aplikaci. Potřeboval bych vědět to, že když kliknu do určité buňky v tabulce (dataGridView) aby se mi následně vypsaly informace např. vedle do textBoxů. Skoro vůbec nevím jak... Určitě nějak přes 'ify' . Představuju si to jako: ,,Pokud kliknu do určité buňky v určitém řádku => něco se stane např. vypíší se mi určité informace do textboxu." Moc děkuji za pomoc. Kdybyste sami věděli jak na to nebo o nějáké stránce, dejte vědět. diky :)

 
Odpovědět 3.8.2015 18:11
Avatar
Odpovídá na brundibar.brun
Michal Štěpánek:

Každý řádek v DGV je jeden záznam v tabulce. Když na nějaký řádek klikneš, lze to kliknutí navázat na nějakou proceduru, která vytáhne z DB informace o tom záznamu, např. na událost SelectedIdexChanged dáš spuštění procedury, kde bude nějaký dotaz do DB

SELECT FROM tabulka WHERE ID = DGV.SelectedCells(0).Value

Samozřejmě za předpokladu, že v prvním sloupci toho DataGridView máš IDčko toho řádku...

Editováno 4.8.2015 9:09
Odpovědět 4.8.2015 9:08
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Migi
Člen
Avatar
Odpovídá na David Čápka
Migi:

Ahoj, at hledam tak hledam, tak tu sekci nemuzu najit, muzu poprosit o link? Dekuji.

Odpovědět 28. června 19:47
I ta nejhorsi hodina v zivote trva jen 60 minut...
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 29. Zobrazit vše