Zimní výprodej Kotlin týden
Pouze tento týden sleva až 80 % na e-learning týkající se Kotlin
40 % bodů zdarma díky naší Zimní akci!

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.

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

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

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
4 hlasů
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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
DataSet podruhé
Všechny články v sekci
Databáze v C# - ADO.NET
Miniatura
Následující článek
Databáze: Tvorba konceptuálního modelu z business zadání
Aktivity (2)

 

 

Komentáře

Avatar
ejoty
Člen
Avatar
ejoty:19.4.2013 8:09

Děkuji za velice pěkný a přehledný seriál, který mi strašně hodně pomohl.
Bude ještě nějaké pokračování? zatím jsem nepřišel na to, jak editovat data, a zpětně ukládat do tabulky.

Editováno 19.4.2013 8:11
 
Odpovědět
19.4.2013 8:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na ejoty
David Čápka:19.4.2013 8:30

Díky, pokračování určitě bude, ale ne v nejbližší době.

Odpovědět
19.4.2013 8:30
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
keke1
Člen
Avatar
keke1:7.5.2013 12:46

Ahoj,
nevíte proč mi automaticky negeneruje VS název kolekce na Words, ale stále mi tam zůstává název Word, stejně jak se jmenuje samotná tabulka?

dataGridViewSlo­vicka.DataSou­rce = kontext.Word;

Díky za odpověď.

P.s. používám VS Express 2012, jestli to není náhodou tím :-)

 
Odpovědět
7.5.2013 12:46
Avatar
keke1
Člen
Avatar
keke1:9.5.2013 8:02

For Ejoty:
Zatím co jsem vypátral, tak ukládání nových záznamů do DB mi funguje tímto způsobem: (Mám 2x TextBox a Button)
private void ulozNovyZaznam_Clic­k(object sender, EventArgs e)
{
Word noveSlovicko = new Word();
noveSlovicko.Czech = tbNovyCzech.Text;
noveSlovicko.En­glish = tbNovyEnglish.Text;
kontext.Word.In­sertOnSubmit(no­veSlovicko);
kontext.Submit­Changes();
}
Toto řeší pouze vložení nového záznamu do DB. Ne aktualizaci zobrazeni dataGridView1

To Sdraco: Moc díky za super seriál! Doufám v brzké pokračování :-)

 
Odpovědět
9.5.2013 8:02
Avatar
Michal Žůrek - misaz:11.7.2013 20:53

Ahoj, myslím že máš prohozený 13. a 14. díl.

 
Odpovědět
11.7.2013 20:53
Avatar
Michal Žůrek - misaz:26.7.2013 16:21

Jak z té tabulky dostanu data, řekněme že bych si to chtěl zobrazit po svém.

Jak se na to dotazuje, že bych třeba ctěl něco upravovat, získávat podle pravidel, ...?

 
Odpovědět
26.7.2013 16:21
Avatar
Ľuboš Čurgó
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Ľuboš Čurgó:26.7.2013 16:38

Asi myslíš sql queries

 
Odpovědět
26.7.2013 16:38
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:26.7.2013 16:53

Tak tak, jak říká Nensen. Dotaz jak je uvedený v příkladu je třeba

SELECT sloupce FROM nazevtabulky WHERE podminka ORDERBY nazevsloupce

s tím, že u tohoto by ti stačilo třeba

select id,czech,english from word
Editováno 26.7.2013 16:53
 
Odpovědět
26.7.2013 16:53
Avatar
Michal Žůrek - misaz:26.7.2013 17:32

Ľuboš Čurgó a Jan Vargovský: mě nejde splácat ten dotaz, to umím, já jen nevím jak to volat z aplikace a jak to dále zpracovat. Navíc jste mi ani jeden neodpověděli jak z toho dostanu třeba onen string.

 
Odpovědět
26.7.2013 17:32
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:26.7.2013 17:43

Ukaž mi jakým způsobem plácáš ten dotaz, přesně tudle aplikaci jsem dělal před rokem tak jí mám v pc(ale jak koukám, dělal jsem ji jinak)

 
Odpovědět
26.7.2013 17:43
Avatar
Odpovídá na Jan Vargovský
Michal Žůrek - misaz:26.7.2013 17:45

přečetl jsis ten článek? Mě jde o to jak v C# docílím aby my databáze vrátila výsledek onoho dotazu. V php na PDO zavolám query, jenže v C# mi žádné $db->query(...) nebude fungovat.

 
Odpovědět
26.7.2013 17:45
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:26.7.2013 17:48

Ne nečetl. Říkáš, že umíš vytvořít sql query, tak se ptám jak jsi ho vytvořil. Klidně ti můžu říct třídy co k tomu potřebuješ a poraď si sám...

 
Odpovědět
26.7.2013 17:48
Avatar
Odpovídá na Michal Žůrek - misaz
Jiří Košata - kosata50:26.7.2013 17:58

Nějak mi pořád jasný, jestli se teda chceš na databázi dotazovat přes LINQ to SLQ, nebo chceš jen spustit klasický SQL dotaz a všechno si zpracovávat sám. Píšeš pod článek o LINQ ale řešíte tady klasický dotazy. :)

 
Odpovědět
26.7.2013 17:58
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Michal Žůrek - misaz
Jan Vargovský:26.7.2013 17:58

Query se tvoří v třídě SqlCeCommand, ten potom odešleš v třídě SqlCeDataAdapter jako paramarametr společně s databází(SqlCe­Connection) a ta má metodu Fill() kde parametr bere třídu DataTable a potom v tom DataTable máš výslednou odpověď - tabulku (a né string nebo jak jsi to nazval) pak už si naplníš ten DataGridView jako bylo úkázáno tady v tutoriálu.
Btw když budeš insertovat a nebo cokoliv dělat s databázi tak jí musíš nejdřív otevřít a na konci zase zavřít.

Jiří Košata - kosata50 Tím SQL dotazem to je poněkud složitější no, viz tento post.

Editováno 26.7.2013 18:00
 
Odpovědět
26.7.2013 17:58
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na keke1
JOF:27.12.2013 11:18

Pluralizaci názvů tabulek je možné u LinqToSql vypnout.
Pokud máte názvy DB tabulek česky, tak je to možná i lepší.
Podívej se do menu Tools->Options->Database Tools->O/R Designer.
Tam je položka Pluralization of names. Nemáš enabled nastaveno na false?

 
Odpovědět
27.12.2013 11:18
Avatar
Tommy
Člen
Avatar
Tommy:4.1.2014 18:26

Vo WPF to nefunguje. Nepozná príkaz dataGridViewSlo­vicka.DataSou­rce = kontext.Words;

Vedel by niekto poradiť ako sa to dá obísť?

 
Odpovědět
4.1.2014 18:26
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Tommy
David Čápka:4.1.2014 18:43

Samozmořejmě, že to nefunguje v jiné technologii, než pro kterou to je psané. Pokud sis zde o WPF něco přečetl, tak budeš vědět jak to přepsat.

Odpovědět
4.1.2014 18:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Tommy
Jan Vargovský:4.1.2014 18:43

Použij vlastnost ItemsSource nebo to udělej v XAMLu pomocí Bindingu.

Editováno 4.1.2014 18:44
 
Odpovědět
4.1.2014 18:43
Avatar
Tommy
Člen
Avatar
Odpovídá na Jan Vargovský
Tommy:4.1.2014 21:46

Skúsil som to takto.
Tu je kód:
namespace WPF_SQLdataba­za4._1._2014
{
public partial class MainWindow : Window
{
DataClasses1Da­taContext kontext = new DataClasses1Da­taContext();

public MainWindow()
{
InitializeCom­ponent();
}
private void BTnacitajOnClic­k(object sender, RoutedEventArgs e)
{
dataGridViewSlo­vicka.ItemsSou­rce = kontext.Words;
}
}
}

A tu je XAML:
<Window x:Class="WPF_SQLda­tabaza4._1._2014­.MainWindow"
xmlns="http:/­/schemas.micro­soft.com/winfx/2006/xam­l/presentation"
xmlns:x="http­://schemas.mi­crosoft.com/win­fx/2006/xaml"
Title="slovnicek" Height="357" Width="340" WindowStartup­Location="Cen­terScreen" ResizeMode="Can­Minimize">
<Grid Margin="10">
<DataGrid AutoGenerateCo­lumns="False" Height="260" HorizontalAlig­nment="Center" Name="dataGrid­ViewSlovicka" VerticalAlignmen­t="Top" Width="300" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" Width="100" Header="ID"/>
<DataGridTextColumn Binding="{Binding Czech}" Width="100" Header="Czech"/>
<DataGridTextColumn Binding="{Binding English}" Width="100" Header="English"/>
</DataGrid.Columns>
</DataGrid>
<Button Content="Nacitaj" Height="23" HorizontalAlig­nment="Center" Margin="0,260,0,0" Name="BTnacitaj" VerticalAlignmen­t="Center" Width="75" Click="BTnaci­tajOnClick"/>
</Grid>
</Window>

Riešenie je správne? Alebo sa to dá aj jednoduchšie?

Vopred ďakujem za odpoveď.

 
Odpovědět
4.1.2014 21:46
Avatar
dvorak_cz
Člen
Avatar
dvorak_cz:28.2.2014 11:14

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ý:28.2.2014 12:09

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:28.2.2014 12:10

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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Veganekk
Člen
Avatar
Veganekk:17.6.2014 1:47

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:17.6.2014 10:00

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:17.6.2014 12:00

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:23.9.2014 18:20

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:3.8.2015 18:11

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:4.8.2015 9:08

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
Redaktor
Avatar
Odpovídá na David Čápka
Migi:28.6.2016 19:47

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

Odpovědět
28.6.2016 19:47
I ta nejhorsi hodina v zivote trva jen 60 minut...
Avatar
jirka.skop
Člen
Avatar
jirka.skop:23.1.2018 15:54

Ahoj,mám VS 2017 a nemůžu tam nikde najít ten item LINQ to SQL,může mi někdo poradit.Díky Jirka.

 
Odpovědět
23.1.2018 15:54
Avatar
Michaal.K
Člen
Avatar
Michaal.K:10.7.2018 11:57

Ahoj,
používám visual studio 2015 a k pluralizaci názvů v kolekci slovíček mi nedochází. A to mám vs2015 defaultně nastavené a nikde jsem nic neměnil. Intellisense mi nabídlo toto:

dataGridViewSlovicka.DataSource = kontext.Word;

Apka funguje normálně, jen mě zajímá proč nedochází k pluralizaci...
Díky

 
Odpovědět
10.7.2018 11:57
Avatar
Pavel Pešek
Člen
Avatar
Pavel Pešek:8.1.2019 14:50

using System.Data.Linq;
...
DataClassesDa­taContext kontext = new DataClassesDa­taContext();

Chyba "Type or namespace name 'DataClassesDa­taContext' could not be found."

Používám Studio Community 2017, verze 15.9.4. Mám nainstalované Linq to SQL Tools. Tabulky ze Server Exploreru jsem na plochu DataClasses bez potíží přetáhl.

Když dám prohledávat Google, jedna z častých odpovědí je, že žádná taková třída neexistuje. Teoreticky by to mohla být třída DataContext, která ovšem jako parametr používá connection string.

Takže:

  1. Dotaz. Jak postupovat?
  2. Postup uvedený v návodu zjevně nemusí fungovat, pokud nejsou splněny další předpoklady, které by bylo záhodno v návodu uvést.
 
Odpovědět
8.1.2019 14:50
Avatar
Pavel Pešek
Člen
Avatar
Odpovídá na Pavel Pešek
Pavel Pešek:8.1.2019 15:04

Vyřešeno - nesmazal jsem tu 1, jak bylo doporučeno v předešlém kroku. Nedošlo mi, že to není obecná třída, ale že se její název vygeneruje.

 
Odpovědět
8.1.2019 15:04
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 34 zpráv z 34.