TVORBA DATABÁZOVÝCH APLIKACÍ. Studijní opory

Rozměr: px
Začít zobrazení ze stránky:

Download "TVORBA DATABÁZOVÝCH APLIKACÍ. Studijní opory"

Transkript

1 Operační program Vzdělávání pro konkurenceschopnost PROJEKT Integrovaný systém modulární počítačové podpory výuky ekonomicko technického zaměření CZ.1.07/2.2.00/ TVORBA DATABÁZOVÝCH APLIKACÍ Studijní opory Ing. Romana Garzinová, Ph.D

2 POKYNY KE STUDIU Tvorba databázových aplikací Pro předmět Tvorba databázových aplikací navazujícího magisterského studia studijního programu Management kvality a řízení průmyslových systémů jste obdrželi studijní balík obsahující integrované skriptum pro kombinované studium obsahující i pokyny ke studiu. Cíl předmětu a výstupy z učení Cílem předmětu je seznámení se základními architekturami informačních systémů, standardem programovacího jazyka T SQL, základy objektového programování a v neposlední řadě s programovacím jazykem C# umožňující tvorbu moderních databázových aplikací v prostředí MS.NET Framework. Po prostudování předmětu by měl student být schopen: výstupy znalostí: student bude umět vytvářet základní databázové dotazy pomocí T SQL student bude umět prezentovat data v rámci WPF aplikace student bude umět prezentovat data v rámci webové aplikace ASP.NET student bude umět data zpracovávat v rámci distribuovaných aplikací pomocí WCF výstupy dovedností: student bude umět efektivně navrhovat a využívat databázové modely v MS SQL Serveru student bude umět aplikovat své teoretické znalosti v rámci technologických prostředí, které produkují množství nesourodých dat, které je nutno prezentovat případně na základě získaných dat predikovat případně optimalizovat další procesy řízení technologických procesů Pro koho je předmět určen Předmět je zařazen do navazujícího magisterského studia studijního programu Management kvality a řízení průmyslových systémů, specializace Inteligentní řídicí systémy v průmyslu, ale může jej studovat i zájemce z kteréhokoliv jiného oboru, pokud splňuje požadované prerekvizity. Studijní opora se dělí na části, kapitoly, které odpovídají logickému dělení studované látky, ale nejsou stejně obsáhlé. Předpokládaná doba ke studiu kapitoly se může výrazně lišit, proto jsou velké kapitoly děleny dále na číslované podkapitoly a těm odpovídá níže popsaná struktura. 2

3 Způsob komunikace s vyučujícím Studenti jsou s danou problematikou seznamování v rámci přednášek a praktických cvičeních, na kterých si prakticky osvojí tématiku probíranou na teoretických přednáškách. 3

4 STRUKTURA KAPITOL Čas ke studiu Na úvod kapitoly je uveden čas potřebný pro prostudování látky. Čas je orientační a může Vám sloužit jako hrubé vodítko pro rozvržení studia celého předmětu. Někomu se čas může zdát příliš dlouhý, někomu naopak. Jsou studenti, kteří se s touto problematikou ještě nikdy nesetkali a naopak takoví, kteří již v tomto oboru mají bohaté zkušenosti. Cíl Ihned poté jsou uvedeny cíle, kterých máte dosáhnout po prostudování této kapitoly konkrétní znalosti a dovednosti. Výklad Následuje vlastní výklad studované látky, zavedení nových pojmů, jejich vysvětlení, vše doprovázeno obrázky, tabulkami, řešenými příklady, odkazy na animace. Čas k zamyšlení V rámci studia kapitol se setkáte s otázkami a problémy, které je vhodné si pro správné osvojení látky promyslet. Správná řešení navazují na položené otázky, proto nepokračujte ve čtení, dokud si vše dobře nepromyslíte. K lepšímu pochopení probírané látky využijte praktické příklady aplikace vysvětlovaných teoretických znalostí. 4

5 Animace, Video Ke zvýšení názornosti studované látky doprovázejí výklad animace, k dokreslení a rozšíření znalostí pak videa. Shrnutí pojmů Na závěr kapitoly jsou zopakovány hlavní pojmy, které si v ní máte osvojit. Pokud některému z nich ještě nerozumíte, vraťte se k nim ještě jednou. Otázky Pro ověření, že jste dobře a úplně látku kapitoly zvládli, máte k dispozici několik teoretických otázek. Použitá literatura Na úplný závěr kapitoly je uvedena použitá literatura, z které je možno čerpat další informace z dané problematiky. Klíč k řešení Na konci studijních opor naleznete klíč k řešení úloh a odpovědi na otázky. Úspěšné a příjemné studium s touto učebnicí Vám přeje autor výukového materiálu. Ing. Romana Garzinová, Ph.D. 5

6 OBSAH POKYNY KE STUDIU... 2 STRUKTURA KAPITOL... 4 OBSAH ÚVOD DO PŘEDMĚTU ZPŮSOBY ZÍSKÁVÁNÍ DAT, DEFINICE ARCHITEKTURY ŘEŠENÍ A MODERNÍ TECHNOLOGICKÉ TRENDY VÝVOJE SOFTWARE Historie standardu t sql Architektura řešení Jednovrstvé (centrální) systémy Dvouvrstvá architektura (klient/server) Třívrstvá architektura N vrstvé modely ZÁKLADNÍ OBJEKTY MS SQL SERVERU Základní objekty Datové typy MS SQL serveru TABLE DEFINICE DATABÁZOVÝCH TABULEK A INTEGRITY DAT Příkaz create table Definice primárních klíčů Definice cizích klíčů (foreign key) Definice výchozích hodnot (default constraints) ZÍSKÁVÁNÍ DAT Z JEDINÉHO A VÍCE DATOVÝCH ZDROJŮ (SELECT, JOIN) Základní výběr hodnot (příkaz select) Přirozené spojení join Modifikátory DISTINCT TOP Modifikace záhlaví sloupců

7 5 ŘAZENÍ A FILTROVÁNÍ DAT Operátor EXIsTS SQL vnořené dotazy Operátory SQL dotazy s agregací COUNT(*) SUM(sloupec) AVG(sloupec) MIN (sloupec) MAX (sloupec) Další použití agregačních funkcí POUŽITÍ A PRÁCE S ULOŽENÝMI PROCEDURAMI V MS SQL SERVERU Podmíněné zpracování IF, ELSE CASE Řízení toku RETURN WHILE GOTO Kurzory Životní cyklus kurzoru Deklarace kurzoru Otevření kurzoru Práce s řádky Zavření a dealokace kurzoru Komplexní příklad: Uložené procedury Uživatelsky definované funkce Skalární uživatelsky definované funkce Přímé tabulkové uživatelsky definované funkce Vícepříkazové uživatelsky definované funkce ODCHYTÁVÁNÍ VYJÍMEK Funkce poskytující informace o chybách Konstrukce TRY...CATCH

8 7.3 Vytváření vlastních vyjímek Vyvolávání vlastních vyjímek ÚVOD DO MS.NET FRAMEWORK A OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ Objektově orientovaný přístup Jak OOP funguje Třída Zapouzdření Dědičnost Polymorfismus Statika Statické třídy Rozhraní Vícenásobná dědičnost TVORBA DATABÁZOVÝCH APLIKACÍ K čemu databázi? Přístupy pro práci s relačními databázemi v.net Neobjektové programování Databázový Wrapper Objektově relační mapování Objektové databáze Možnosti připojení k databázi Připojená aplikace Odpojená aplikace DataSet LINQ To SQL Entity Framework Komunikace s databázi pomocí ADO.NET Architektura ADO.NET ADO.NET zprostředkovatele dat Základní třídy ADO.NET ADO.NET Entity Framework Dotazování dat pomocí Entity Frameworku V tomto případě se kromě informací o kategoriích vypisují informace o produktech dané kategorie. Na základě definice cizího klíče Entity Framework správně stanovuje vazbu mezi třídami Product a Category Vytváření nových záznamů

9 9.5.3 Změna dat Mazání záznamů Volání uložených procedur v Entity Frameworku SOA SERVICE ORIENTED ARCHITECTURE principy SOA Standardizovaný kontrakt služby Slabé vazby mezi komponentami Princip abstrakce Znovupoužití Nezávislost Bezstavovost Princip identifikovatelnosti Princip skládání WCF TVORBA DISTRIBUOVANÝCH SYSTÉMU V PROSTŘEDÍ.NET Výběr koncového bodu služby ASP.NET WEBOVÉ TECHNOLOGIE PRO PREZENTACI DAT Základní principy ASP.NET Statický web (bez ASP.NET) Dynamický web (s ASP.NET) WebForms vs. MVC WebForms MVC Jak se v ASP.NET programuje? Inicializace projektu Přidání Web Formu do webového projektu Definice klientského vzhledu Web Formu Definice aplikační logiky

10 1 ÚVOD DO PŘEDMĚTU ZPŮSOBY ZÍSKÁVÁNÍ DAT, DEFINICE ARCHITEKTURY ŘEŠENÍ A MODERNÍ TECHNOLOGICKÉ TRENDY VÝVOJE SOFTWARE Čas ke studiu 1 hodina Cíl Cílem této kapitoly je předání základních informací o historii vývoje databázových systémů, základních architekturách řešení. Výklad 1.1 HISTORIE STANDARDU T SQL V technické praxi je pojem SQL zkratkou Structured Query Language. SQL je standartním jazykem, který byl navržen pro dotazování a správu dat v relačních databázových systémech (RDMS relational database management systems). RDMS je založen na relačním modelu, jehož základem jsou dva matematické obory: teorie množin a predikátové logiky. Tato kapitola představuje teoretický základ SQL, relačního modelu a životního cyklu dat. Cílem není výklad matematických teorémů, ale předložit základní informace o možnostech T SQL jazyka, umožňující základní operace s daty. Relační databázové systémy jsou v současné době na vrcholu své slávy. Ukládání dat pomocí relačního databázového systému je dnes velice rozšířené. Nejedná se však o novinku. Základní principy struktury relačních databází zformuloval již koncem 60. let minulého století E.F. Codd z firmy IBM, který zároveň vytvořil zvláštní jazyk s názvem Structured English QUEry Language neboli SEQUEL, toto označení bylo posléze zkráceno na dnešní Structured Query Language neboli SQL. Za relačními 10

11 databázemi se skrývala docela jednoduchá myšlenka omezit záznam opakovaných dat a vyřešit některé další problémy databází, které v té době byly běžné, a tím zvýšit míru integrity dat a snížit náklady na databáze. V 70. Letech minulého století začaly relační databázové systémy nabízet jako první společnosti Oracle a Sybase. V 81. Letech vstoupila do hry také americká standardizační organizace ANSI (American National Standards Institute), která vytvořila specifikaci jazyka SQL pod názvem ANSI SQL. To byl pro relační databázové systémy ve skutečnosti naprosto klíčový okamžik, protože standard znamenal zlepšení kompatibility mezi různými výrobci databází. Mimoto výsledky vývoje v jednom relačním databázovém systému bylo možné větší části využít i v konkurenčním systému. Díky tomu se zároveň mohl úspěšně zvětšit počet vývojářů v komunitě SQL. Microsoft SQL Server se původně zrodil ze Sybase SQL Serveru. Firma Microsoft vstoupila v roce 1989 se Sybase do spolupráce, jejímž cílem bylo vyvinout SQL server pro systémy OS/2. Vztah spolupráce mezi oběma firmami se rozpadl s vydáním verze 6.0. Počínaje verzí 6.5 je již SQL Server výhradně produktem společnosti Microsoft. V současné době v rámci instalace MS SQL Serveru dostáváme mnohem více než jen obvyklý relační databázový systém hlavní relační databázový systém, fulltext, analytické nástroje, replikace, služby pro transformaci dat, podpora cloudového řešení, optimalizační nástroje, podpora clusteru apod. 1.2 ARCHITEKTURA ŘEŠENÍ Z předešlého je vidět, že máme k dispozici silný databázový nástroj, který chceme využít pro své účely. Nyní se však dostáváme do zásadního problému do jaké architektury databázový server začlenit. Existuje mnoho odborných článků a výzkumů ohledně vhodných architektur aplikačních řešení. Dnes a denně s rozvojem mobilních aplikací a internetu obecně slyšíme o nových principech, o nových standardech a každá zpráva tvrdí, že ta či ona technologie, architektura je tou nejlepší a žádná jiná v podstatě nepřipadá v úvahu. Nicméně platí jednoduché pravidlo, na které se mnohdy zapomíná: Dokonalá architektura, kterou máme při řešení daného problému použít, je taková architektura, jaká je správná právě pro dané konkrétní řešení, na němž pracujeme. V každodenním životě existuje jen velmi málo otázek, na něž existuje snadná odpověď, přičemž otázka softwarové architektury pro určitý projekt k nim sotva bude patřit. Nenechejte se nikým zviklat a nepodléhejte žádnému jasnému názoru, že ta či ona architektura je vždy nejlepší. Než stanovíte výslednou architekturu, zvažte vždy pečlivě všechny požadavky na funkčnost, předpokládaný objem dat, uživatelské požadavky na ovládání, vzájemnou kooperaci s jinými systémy apod. Na základě těchto vstupních informací zvolte nejvhodnější architekturu, která sedí daným požadavkům. 11

12 Obecně dnes rozdělujeme činnost aplikace podle toho, jakým způsobem se staví ke třem skupinám služeb: Uživatelské služby do této kategorie spadají takové aspekty, jako je například uživatelské rozhraní, základní formátování, či pravidla pro validace vstupních dat. Celé uživatelské služby se tak starají o prezentaci dat a o zajištění správného obsahu datových polí. Aplikační služby tato část aplikace zpracovává různá aplikační pravidla. Mohou obsahovat pravidla komunikace mezi systémy, logiku výpočtů, rozhodovací logiku apod. Datové služby starají se o procesy související s načítáním a ukládáním dat. Většinou znají pravidla datové integrity, již se ale nestarají, jakým způsobem jsou data získávána a transformována. V této pozici se nacházejí výše uvedené databázové systémy. Nyní se podívejme na některé klasické architektury a ukažme si, jak do nich zapadají výše popsané služby Jednovrstvé (centrální) systémy Starý model s centrálním počítačem patří do světa sálových počítačů (mainframe) a minipočítačů. Klientské stanice neobsahují žádnou samostatnou logikou, pracují v režimu terminál. Do terminálu se dostávají pouze informace o rozložení obrazovky a zobrazovaná data Dvouvrstvá architektura (klient/server) Tato architektura získala na oblibě začátkem 90. Let minulého století. Tato architektura měla ve skutečnosti dva podtypy: soustředěné na klienta nebo na serveru. Architektura soustředěná u klienta Vycházela z myšlenky laciných osobních počítačů a z názoru, že největší výkon aplikací získáme tehdy, pokud nejvíce výpočetních nároků odsuneme, neboli distribuujeme. Proto se v této architektuře na serveru vykonávaly datové služby. Aplikační logika a uživatelské služby se zpracovávaly u klienta. Nevýhodou tohoto řešení je šířka komunikačního pásma velký objem přenášených dat Architektura soustředěná na serveru Tato architektura se snaží vytěžit určité výhody centralizovaných systémů. Na klienta se přesouvají pouze uživatelské služby. Na klienta se zasílají pouze potřebná již omezená data, která se mají prezentovat uživateli systému na obrazovce. Aplikační a datové služby zajišťuje server. 12

13 1.2.3 Třívrstvá architektura V současnosti nejpoužívanější model. U tohoto modelu se všechny tři úrovně rozdělí do zcela samostatných logických modelů. Každý klient je odpovědný pouze za práci uživatelského rozhraní podobně jako v případě architektury klient/server soustředěné na serveru. Rozdíl mezi oběma modely spočívá v tom, že zde jsou aplikační a datové služby od sebe oddělené. Znamená to, že aplikační a datové služby mohou a nemusí běžet na jednom serveru. Díky tmu získáváme větší stabilitu a škálovatelnost řešení, protože můžeme jednak rozdělit provozní zátěž na více serverů a jednotlivé vrstvy jsou lépe rozšiřitelné, protože veškeré změny a doplňky zasahují do menších částí programového kódu. Další výhodou je nezávislost na uživatelském rozhraní. V dnešní době je běžná architektura, kdy datové a aplikační služby sdílí více uživatelských rozhraní např. windows aplikace, internetové aplikace, mobilní aplikace na různých platformách ios, Android, Windows Mobile apod N vrstvé modely Tento je v podstatě stejný s předešlým, rozdíl je v tom, že komponenty jsou v nich rozděleny na co nejmenší logické jednotky. Pokud je v tomto systému správně nadefinovaná vrstva datových služeb, může se i databáze rozmístit na více serverů. Podmínkou je dostupnost datových služeb v aplikační vrstvě jednoznačnou definicí spojení, které poskytne požadovaná data. Shrnutí pojmů SQL, relace, databázové systémy, architektura řešení Otázky 1. Co znamená zkratka SQL? 2. Jaké je základní rozdělení činnosti současných aplikací? 3. Jaké jsou základní typy architektury a ve stručnosti definujte rozdíly mezi nimi? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc.,

14 [2] MISTRY, R., MISNER, S. Introducing Microsoft SQl Server Místo vydání: Microsoft Press,

15 2 ZÁKLADNÍ OBJEKTY MS SQL SERVERU Čas ke studiu 1 hodina Cíl Cílem této kapitoly je předání znalostí o základních objektech a datových typech databázového serveru MS SQL. Výklad 2.1 ZÁKLADNÍ OBJEKTY V předešlé kapitole jsme se zabývali možnými architekturami technického řešení, otázkami, kde má být centralizovaná aplikační logika a data, jak komplexně distribuovat výkon celého řešení. V této kapitole se zaměříme pouze na aplikační úroveň, která má zajišťovat efektivní úložiště a distribuci dat databázi. Co všechno tvoří databázi? Samozřejmě jsou to v první řadě data. Relační databázový systém ve skutečnosti nejsou jen pouhá data. Jestliže chcete data pouze někde uložit, postačí vám obyčejný textový soubor. Relační databázový systém umožňuje mnohem více můžeme v něm definovat, jak data mají vypadat, neboli popisovat aplikační pravidla. Databázový server zahrnuje základní objekty: Samotnou databázi databázi tvoří skupina určité množiny objektů tabulek, uložených procedur, pohledů, které náleží k určitému seskupení dat, uložených v tabulkách této databáze. Jeden databázový server může obsahovat celou řadu uživatelských databází. Transakční protokol Samotný soubor databáze není tím místem, kde se toho děje nejvíce. Data se načítají z databáze, nicméně všechny provedené změny nejdou do databáze ihned, namísto toho dochází k zápisu do transakčního logu. V určitém okamžiku dochází v databázi k vytvoření kontrolního bodu a právě v tento moment se veškeré změny zaznamenané v protokolu přenesou také do vlastního databázového souboru. 15

16 Tabulka nejzákladnější objekt databáze. V tabulkách jsou uložena vlastní data příslušné databáze. Každá definice tabulky obsahuje takzvaná metadata, což jsou informace popisující vlastní data, základní datové typy sloupců databázové tabulky, rozsah jejich hodnot, definici množiny pravidel vymezující data, která lze do daného sloupce uložit. Při narušení pravidel libovolného ze sloupců může systém zamítnout nejen nově vložený řádek, ale také aktualizaci stávajícího řádku nebo odstranění zvoleného řádku. Diagramy grafické zobrazení databázových tabulek včetně definic jejich sloupců a vzájemných vztahů mezi jednotlivými tabulkami. Obrázek 1 Databázový diagram Uložené procedury jsou základem programování v SQL Serveru. Je tvořena příkazy jazyka Transact SQL, které jsou zabaleny do ucelené logické jednotky. V těle uložených procedur jsou povoleny proměnné a parametry, ale také výběrové konstrukce a cykly. Uživatelsky definované funkce jsou v mnoha ohledech podobné uloženým procedurám. Na rozdíl od nich však pracují s menší množinou datových typů SQL serveru a nemohou provádět veškeré operace (změny v tabulkách, odesílání e mailů apod.) 2.2 DATOVÉ TYPY MS SQL SERVERU 16

17 Název Třída Velikost Popis Bit Celočíselný 1 Může nabývat hodnot 0, 1 nebo NULL. Používá se pro účely logických operací Bigint Celočíselný 8 Rozsah celočíselných hodnot až Int Celočíselný 4 Celá čísla z intervalu až Smallint Celočíselný 2 Celá čísla z intervalu až Tinyint Celočíselný 1 Celá čísla 0 až 255 Decimal nebo numeric Dekadický / číselný Proměnlivá Čísla s pevnou přesností a rozsahem od do Money Peněžní 8 Peněžní jednotky od 2 63 do 2 63 plus přesnost na čtyři desetinná místa SmallMoney Peněžní 4 Peněžní jednotky od ,3648 do ,3647 Float Přibližný číselný Proměnlivá Přrbírá argumant, který určuje velikost a 17

18 přesnost datového typu. Interval platných hodnot 1,79E+308 do 1,79E+308 DateTime Datum/čas 8 Datumové a časové údaje počínaje a konce s přesností na jednu třicetinu sekundy SmallDateTime Datum/čas 4 Datumové a časové údaje počínaje a konce s přesností na jednu minutu Cursor Speciální číselný 1 Ukazatel na kurzor Timestamp/rowversion Speciální číselný 8 Speciální hodnota, která je jedinečná v dané databázi. Uniqueidentifier Speciální číselný 16 Speciální hodnota globálního jedinečného identifikátoru. Tento identifikátor je zaručené jedinečný v prostore a čase Char Znakový Proměnlivá Znakové údaje o pevné délce. Textové hodnoty kratší než pevně definovaná 18

19 velikost se na požadovanou velikost doplní mezerami Varchar Znakový Proměnlivá Znakové údaje o proměnné délce. Hodnoty se mezerami nedoplňují Text Znakový Proměnlivá Maximální délka tohoto datového typu je znaků. Nchar Unicode Proměnlivá Znakové údaje formátu Unicode o pevné délce. NVarchar Unicode Proměnlivá Znakové údaje formátu Unicode o proměnlivé délce. NText Unicode Proměnlivá Znakové údaje formátu Unicode o proměnné délce. Maximální velikost je znaků Binary Binární Proměnlivá Binární data o pevné délce VarBinary Binární Proměnlivá Binární data o proměnné délce Image Binární Proměnlivá Binární data o proměnné délce, maximálně bajtů. 19

20 Table Ostatní Zvláštní Primárně je určen pro práci s výslednými tabulkami XML Ostatní Zvláštní Slouží pro ukládání dat ve formátu XML Shrnutí pojmů Databáze, transakční protokol, tabulka, diagram, uložená procedura, uživatelsky definované funkce, datové typy Otázky 1. Jaké jsou základní objekty databázového serveru? 2. Který z databázových objektů je nejzákladnější? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc., [2] MISTRY, R., MISNER, S. Introducing Microsoft SQl Server Místo vydání: Microsoft Press,

21 3 TABLE DEFINICE DATABÁZOVÝCH TABULEK A INTEGRITY DAT Čas ke studiu 1 hodina Cíl Seznámení se s vytvořením základního objektu databázového systému databázovou tabulkou včetně definic primárních a cizích klíčů. Výklad V předešlé kapitole jsme se seznámili se základními objekty databázového serveru. Elementární jednotkou každé databáze je databázová tabulka. V tabulkách jsou uložena vlastní data příslušné databáze. Každá definice tabulky obsahuje takzvaná metadata, což jsou informace popisující vlastní data, základní datové typy sloupců databázové tabulky, rozsah jejich hodnot, definici množiny pravidel vymezující data, která lze do daného sloupce uložit. V této kapitole se seznámíme jak vytvořit databázovou tabulku, jakým způsobem nastavit její základní atributy. 3.1 PŘÍKAZ CREATE TABLE Následující kód vytvoří databázovou tabulku v databázi TSQL2012. USE TSQL2012 IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.employees; 21

22 CREATE TABLE dbo.employees ( empid INT NOT NULL, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, hiredate DATE NOT NULL, mgrid INT NULL, ssn VARCHAR(20) NOT NULL, salary MONEY NOT NULL ); První příklad USE nastavuje kontext databáze TSQL2012, jinak řečeno deklarujeme databázovému serveru, že následující příkazy po příkazu USE se budou týkat databáze konkrétní databáze TSQL2012. Následující podmínka IF využívá funkci OBJECT_ID, kterou zjišťujeme, zda v databázi TSQL2012 již neexistuje databázová tabulka s názvem Employees. Návratovou hodnotou funkce je buďto ID hledaného objektu nebo hodnota NULL. V případě, že výstupní hodnotou není hodnota NULL, provede se smazání této tabulky včetně všech dat. Typ U reprezentuje databázový objekt tabulka. Příkaz CREATE TABLE vytvoří hlavičku databázové tabulky. Obsahuje jednak definice vlastního názvu tabulky Employees a dále pak definici sloupců tabulky. Každý sloupec je definován hodnotami: Název sloupce Datový typ Definice, zda daný sloupec musí obsahovat hodnotu daného typu (NOT NULL) nebo může být hodnota prázdná (NULL) 3.2 DEFINICE PRIMÁRNÍCH KLÍČŮ 22

23 Primární klíč je pole nebo kombinace polí databázové tabulky jednoznačně identifikující každý záznam v databázové tabulce. Žádné pole, které je součástí primárního klíče nesmí obsahovat NULL hodnotu. Každá tabulka má mít definovaný právě jeden primární klíč. Ve většině případů je primárním klíčem identifikační číslo seznamu, v našem případě se jedná o položku empid. Definice primárního klíče: ALTER TABLE dbo.employees ADD CONSTRAINT PK_Employees PRIMARY KEY(empid); 3.3 DEFINICE CIZÍCH KLÍČŮ (FOREIGN KEY) Cizí klíč (FOREIGN KEY) definuje vztah mezi dvěma tabulkami. Definicí cizího klíče deklarujeme povinnost existence určitého záznamu z jedné databázové tabulky v definované jiné tabulce. Vytváříme tak spojení jednoho nebo více sloupců se sloupcem nebo více sloupci jiné ( cizí ) tabulky. Cizí klíč umožňuje definovat akce, které mají nastat při pokusu o změnu nebo mazání záznamů v cizí tabulce. Například, po smazání záznamu z cizí tabulky budou ve zdrojové tabulce záznamy s odpovídající hodnotou cizího klíče také smazány, nebo budou jejich hodnoty nastaveny na neutrální hodnotu, nebo se smazání záznamů v cizí tabulce zabrání. Následující kód vytváří další databázovou tabulku Orders s definicí primárního klíče orderid: IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.orders; CREATE TABLE dbo.orders ( 23

24 orderid INT NOT NULL, empid INT NOT NULL, custid VARCHAR(10) NOT NULL, orderts DATETIME2 NOT NULL, qty INT NOT NULL, CONSTRAINT PK_Orders PRIMARY Požadavkem je zajištění integrity dat. Tabulka objednávek nesmí obsahovat záznam bez vazby na ID zadavatele, jehož data jsou uloženy v databázové tabulce Employees. To zajistíme definicí cizího klíče empid: ALTER TABLE dbo.orders ADD CONSTRAINT FK_Orders_Employees FOREIGN KEY(empid) REFERENCES dbo.employees(empid); 3.4 DEFINICE VÝCHOZÍCH HODNOT (DEFAULT CONSTRAINTS) Definicí výchozích hodnot je pro definovaný sloupec databázové tabulky nastavena výchozí jeho výchozí hodnota v případech, kdy jeho hodnota není explicitně definována při vkládání nového záznamů do této tabulky. Následující příklad definuje výchozí hodnotu datumu a času při vložení záznamu nové objednávky: 24

25 ALTER TABLE dbo.orders ADD CONSTRAINT DFT_Orders_orderts DEFAULT(SYSDATETIME()) FOR orderts Návratovou hodnotou použité funkce SYSDATETIME je aktuální datum a čas. Shrnutí pojmů Příkaz CREATE TABLE, primární klíč, cizí klíč, výchozí hodnota Otázky 1. Jaká je základní syntaxe T SQL pro vytvořené databázové tabulky? 2. Co to je primární klíč a jaké je syntaxe jeho vytvoření v T SQL? 3. Co to je cizí klíč a jaké je syntaxe jeho vytvoření v T SQL? 4. Jaká je syntaxe v T SQL pro vytvoření defaultních hodnot? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc., [2] MISTRY, R., MISNER, S. Introducing Microsoft SQl Server Místo vydání: Microsoft Press,

26 4 ZÍSKÁVÁNÍ DAT Z JEDINÉHO A VÍCE DATOVÝCH ZDROJŮ (SELECT, JOIN) Čas ke studiu 1 hodina Cíl Definice jednoduchých T SQL dotazů pro výběr záznamů z jedné nebo více databázových tabulek. Výklad V předcházející kapitole jsme se seznámili s T SQL příkazy pro vytvoření databázové tabulky. Máme tak elementární jednotku držící si ve své struktuře potřebné informace, které v určité fázi funkčnosti aplikace chceme zužitkovat. Jakým způsobem data vytáhnout ze struktur databázových tabulek popisuje tato kapitola. 4.1 ZÁKLADNÍ VÝBĚR HODNOT (PŘÍKAZ SELECT) Nejjednodušším způsobem pro získání dat z jedné databázové tabulky je T SQL příkaz SELECT. Ten ve své definici obsahuje informace jednak o zdroji dat, ale také celkový popis dat, které chce ze zdroje získat včetně výsledného formátování. Syntaxe jednoduchého T SQL příkazu SELECT je následující: SELECT [DISTINCT] {* [sloupec_vyraz [[AS] alias] [,...]} FROM tabulka [alias] [,...] 26

27 [WHERE podmínka] [GROUP BY seznam_sloupců [HAVING podmínka]] [ORDER BY seznam_sloupců_řazení]; Vysvětleme si postupně význam všech variant základní syntaxe: SELECT * FROM Orders Tento příklad představuje základní formu SELECTu, který vrací všechny záznamy z databázové tabulky. Všimněme si znaku *, který v jazyce T SQL představuje zástupný znak pro všechny sloupce databázové tabulky. Osobně nedoporučuji tuto formu zápisu, který sice správně vrátí požadovaný výsledek, ale vzhledem k optimalizaci dotazů a požadavku co nejrychlejších odezev databázového serveru doporučuji vždy v SELECT příkazu vydefinovat všechny sloupce, které chceme příkazem SELECT získat. Optimální verze SELECT příkazu by byla tedy: SELECT orderid, empid, orderts FROM Orders Výše uvedený příkaz vrací z celé množiny definovaných sloupců databázové tabulky Orders pouze tři požadované id objednávky, id zaměstnance a datum a čas pořízení objednávky. Pokud požadujeme údaje konkrétní objednávky, specifikujeme podmínku omezující vrácenou množinu záznamů: 27

28 SELECT orderid, empid, orderts FROM Orders WHERE custid=71 Tento příklad vrací seznam objednávek jednoho zákazníka, jehož ID je v databázi definován hodnotou 71. Pokud bychom chtěli objednávky seskupit podle zaměstnance, který objednávku vytvořil a podle roku vytvoření, použijeme následující T SQL příkaz: SELECT orderid, empid, orderts FROM Orders WHERE custid=71 GROUP BY empid, YEAR(orderdate) Pokud bychom chtěli množinu vrácených záznamů seřadit podle ID zaměstnance a zároveň podle roku pořízení objednávky, je možné rozšířit příkaz SELECT o syntaxi ORDER BY: SELECT orderid, empid, orderts, YEAR(orderdate) AS orederyear FROM Orders WHERE custid=71 GROUP BY empid, YEAR(orderdate) ORDER BY empid, orederyear Všimněme si použité asociace syntaxí AS (YEAR(orderdate) AS orederyear). Funkce YEAR vrací hodnotu odpovídající pouze hodnotě určující rok datového typu DATETIME. Syntaxe AS deklaruje, že vrácené hodnoty této položky budou pojmenovány orderyear. 28

29 Není možné v příkazech SELECT zaměňovat korektní logické pořadí. 4.2 PŘIROZENÉ SPOJENÍ JOIN V předchozích příkladech jsme byli vždy omezeni na jednu jedinou tabulku. Mohli jsme tedy vypisovat pouze údaje, které byly dostupné v rámci jedné tabulky. Ve většině případech však budeme chtít vypisovat údaje, které budeme potřebovat přečíst hned z několika tabulek najednou. K tomu potřebujeme znát ještě jeden pojem, a to přirozené spojení. Přirozené spojení je sloučení dvou a více tabulek "dohromady". Každý řádek v jedné tabulce je "rozšířen" o sloupce z tabulek dalších. Odpovídající řádek získá systém díky vazbě primární klíč cizí klíč. Nejlépe přirozené spojení ukáže následující příklad. Mějme tabulky KNIHA a AUTORI a tabulku NAPSANE_KNIHY, která nám zprostředkovává vazbu typu M:N mezi entitami KNIHA a AUTOR. SELECT prijmeni, jmeno FROM AUTORI a INNER JOIN napsane_knihy nk ON nk.autor_id = a.id INNER JOIN kniha k ON k.id = nk.kniha_id WHERE k.nazev LIKE 'Jak publikovat články' Rozšiřme předchozí příklad o další dvě databázové tabulky NAKLADATELSTVÍ a VÝTISK. Požadujme vyhledat všechny nakladatelství, ve kterých byla v roce 1996 vydána díla Robina Cooka. Odpověď nám dá následující příklad: SELECT nakladatelství.název FROM nakladatelství, výtisk, kniha, napsané_knihy, autoři WHERE nakladatelství.id = výtisk.nakladatel_id 29

30 AND výtisk.kniha_id = kniha.id AND kniha.id = napsané_knihy.kniha_id AND napsané_knihy.autor_id = autoři.id AND nakladatelství.rok_vydání = 1996 AND autoři.jméno = 'Robin' AND autoři.příjmení = 'Coo V uvedených příkladech může dojít k duplicitám. To jest, ve výstupu se mohou nějaké řádky opakovat. Jedním z možných nástrojů, jak tyto nežádoucí duplicity odstranit, je použití modifikátoru DISTINCT. 4.3 MODIFIKÁTORY Modifikátory se zapisují hned za klíčové slovo SELECT, ještě před názvy projektovaných sloupců: SELECT [MODIFIKÁTOR] jména projektovaných sloupců DISTINCT Rozšiřme předchozí příklad o další dvě databázové tabulky NAKLADATELSTVI a VYTISK. Požadujme vyhledat všechny nakladatelství, ve kterých byla v roce 1996 vydána díla Robina Cooka. Pokud by však nějaké nakladatelství v roce 1996 vydalo např. 3 různá díla od Robina Cooka, dostali bychom název takového nakladatelství ve výstupním výpise celkem třikrát. Modifikátor DISTINCT slouží k odstranění duplicit v odpovědích na příkaz SELECT. Takže očekávanou odpověď pro otázku v posledním příkladu, bychom získali následujícím příkazem: SELECT DISTINCT nd.nazev 30

31 FROM AUTORI a INNER JOIN napsane_knihy nk ON nk.autor_id = a.id INNER JOIN kniha k ON k.id = nk.kniha_id INNER JOIN VYTISK v ON v.kniha_id = k.id INNER JOIN nakladatelstvi nd ON nd.id = v.nakladatel_id WHERE nd.rok_vydani = 1996 AND a.jmeno = 'Robin' AND a.prijmeni = 'Cook' TOP Dalším, často používaným modifikátorem, je klíčové slovo TOP. Někdy se nám totiž může stát, že vrácených řádků vyhovujících zadanému dotazu může být velmi mnoho. Modifikátor TOP zajistí vrácení jenom prvních N řádků. Číslo N zadáme přímo v dotazu za klíčovým slovem TOP. Kdybychom chtěli získat abecedně prvních pět autorů publikace "Jak publikovat články", napsali bychom následující dotaz: SELECT TOP 5 prijmeni, jmeno FROM AUTORI a INNER JOIN napsane_knihy nk ON nk.autor_id = a.id INNER JOIN kniha k ON k.id = nk.kniha_id WHERE k.nazev LIKE 'Jak publikovat články' 4.4 MODIFIKACE ZÁHLAVÍ SLOUPCŮ 31

32 Vždy, když dostaneme výpis řádků na nějaký dotaz, sloupce ve výpisu jsou pojmenovány přesně tak, jak jsme je zapsali při vytváření tabulky. Jazyk SQL nám umožňuje měnit názvy sloupců, podle naší potřeby. K tomu slouží klíčové slovo AS, které se uvádí za jméno sloupce, a za ním následuje nový název: SELECT TOP 10 kniha_id AS cislo, nazev AS dilo FROM kniha Shrnutí pojmů Příkazy SELECT, JOIN, DISTINCT, TOP Otázky 1. Syntaxe T SQL příkazu SELECT? 2. Co představuje přirozené spojení dvou a více databázových tabulek? 3. Jakou funkci má modifikátor DISTINCT? 4. Jakou funkci má modifikátor TOP? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc., [2] MISTRY, R., MISNER, S. Introducing Microsoft SQl Server Místo vydání: Microsoft Press,

33 5 ŘAZENÍ A FILTROVÁNÍ DAT Čas ke studiu 1,5 hodiny Cíl Seznámení se se základními operátory T SQL a jejich významem. Výklad 5.1 OPERÁTOR EXISTS Tento operátor nám vrací pravdivostní hodnotu TRUE nebo FALSE na základě toho, zdali vnořený SQL dotaz vrací nějakou hodnotu. To znamená, že jej neaplikujeme na žádný sloupec, ani hodnotu. Pakliže vnořený SQL dotaz vrátí alespoň jeden řádek, operátor EXISTS nám vrátí TRUE. Má ještě jednu zvláštnost. Vnořený SQL dotaz v argumentu operátoru EXISTS se vyhodnocuje zvlášť pro každý řádek. Proto je potřeba uvážit použití operátoru EXISTS, neboť při špatně navržených dotazech by mohlo dojít k relativně velkému zatížení SQL serveru. Zatímco u ostatních operátorů pro vnořené SQL dotazy jsme nebyli nuceni používat aliasy na jména tabulek, u operátoru EXISTS to bude téměř nutností. To vyplývá z toho, že vnořený dotaz se vyhodnocuje pro každý řádek zvlášť a tam se nám nesmí dostat do kolize dva tytéž názvy tabulek. SELECT název FROM kniha WHERE NOT EXISTS ( SELECT autor_id 33

34 FROM napsané_knihy WHERE kniha.id = napsané_knihy.publikace_id Všimněte si, že jsem v příkladu nepoužil aliasů tabulek jsou samozřejmě zbytečné, neboť ke kolizi jmen tabulek nám zde nedochází. 5.2 SQL VNOŘENÉ DOTAZY Vnořené dotazy využijeme tam, kde potřebujeme získat nějaké informace na základě jiných údajů uložených v databázi. Vnořený dotaz není nic jiného, než příkaz SELECT vnořený do jiného příkazu SELECT. Vnořené dotazy využijeme tam, kde potřebujeme nejprve zjistit nějakou informaci a v závislosti na ní zjistit pak informace další. Typickým příkladem by mohl být následující dotaz. Vypište seznam všech zaměstnanců, kteří mají nadprůměrný plat. Pomocí klasických SQL dotazů, které zatím známe, tento výsledek obdržíme ve dvou krocích. Nejprve si zjistíme, jaký je průměrný plat ve firmě (použijeme agregační funkci AVG): SELECT AVG(plat) FROM platy Tento dotaz nám vrátí např. číslo Toto číslo si zapamatujeme a použijeme jej v konstrukci následujícího dotazu: SELECT jméno, příjmení FROM platy WHERE plat >

35 Jistě uznáte, byť je tento příklad docela jednoduchý, že by někdy bylo pohodlnější, kdybychom oba kroky mohli spojit do jednoho, tj. napsali bychom jeden příkaz, který by nám potřebný seznam zaměstnanců vrátil. Výše uvedený dotaz jsme schopni zajistit vnořeným dotazem: SELECT jméno, příjmení FROM platy WHERE plat > (SELECT AVG(plat) FROM platy) V restrikci výše uvedeného příkazu máme podmínku plat > vypočtená hodnota. Vypočtená hodnota se nám vyhodnotí vnořeným SELECTem na jednu hodnotu a máme tedy podmínku zapsanou v pořádku a dotaz je korektní. Pro úplnost uvádím, že vnořený SELECT se vyhodnotí pouze jednou, hodnotu si SQL server "zapamatuje" a s ní pak porovnává všechny ostatní hodnoty v tabulce. 5.3 OPERÁTORY Vnořování dotazů nám rozšiřuje klasickou množinu relačních operátorů o operátory další, které se aplikují z levé strany na sloupec a z pravé strany na vnořený dotaz vracející více hodnot. Mezi ně patří operátory IN, ANY (SOME), ALL. Operátor IN slouží pro jednoduché porovnání, zdali se hodnota sloupce vlevo vyskytuje mezi hodnotami vrácených vnořeným dotazem. Kdybychom např. chtěli názvy knih vydané v letech 1997 až 2000, mohli bychom takový dotaz pomocí operátoru IN zapsat takto: SELECT název FROM kniha, výtisk WHERE kniha.id = výtisk.publikace_id AND rok IN (1997, 1998, 1999, 2000) 35

36 Výraz v závorce je množina všech hodnot, ve kterých se má daná hodnota hledat. Většinou neuvádíme výčet explicitně, ale vrací nám jej nějaký vnořený dotaz. SELECT název n v.publikace_id FROM kniha, autoři, napsané_knihy, výtisk WHERE kniha.id = napsané_knihy.publikace_id AND napsané_knihy.autor_id = autoři.id AND kniha.id = výtisk.publikace_id AND rok IN ( SELECT rok FROM autoři a, výtisk v, napsané_knihy WHERE a.id = n.autor_id AND n.publikace_id = AND a.jméno LIKE 'Alois' AND a.příjmení LIKE 'Jirásek') Operátor ANY nebo SOME určují, že relace se vztahuje na alespoň jednu z hodnot, kterou vrátí vnořený dotaz, operátor ALL aplikuje relaci na všechny hodnoty vrácené poddotazem. 5.4 SQL DOTAZY S AGREGACÍ Agregační funkce slouží pro získávání celkových souhrnných údajů, jako jsou aritmetické průměry, součty, minima nebo maxima. SELECT seznam sloupců FROM seznam tabulek [WHERE podmínky] [GROUP BY výrazy pro seskupení] [ORDER BY dle čeho třídit] 36

37 5.4.1 COUNT(*) Je nejzákladnější agregační funkcí, která slouží jenom k získání počtu záznamů v rámci jedné skupiny agregovaných řádků. Nejjednodušší použití agregační funkce COUNT je následující: SELECT COUNT(*) FROM KNIHA Uvedený příkaz vrátí počet záznamů v tabulce KNIHA. Takto lze funkci COUNT aplikovat na libovolnou tabulku a vždy jako odpověď dostaneme jedno číslo udávající počet záznamů v tabulce. Dále se COUNT dá použít pro počítání počtu záznamů v rámci jednotlivých skupin SUM(sloupec) Agregační funkce SUM(sloupec) vrátí součet hodnot v uvedeném sloupci v rámci shluknuté skupiny záznamů. Pokud bychom chtěli seznam všech názvů knih a nakladatelství a pro každou dvojici kniha nakladatelství součet cen výtisků daného díla v daném nakladatelství, napsali bychom následující příkaz: SELECT kniha.název, nakladatelství.název, SUM(cena) FROM kniha, výtisk, nakladatelství WHERE kniha.id = výtisk.kniha_id AND výtisk.nakladatel_id = nakladatelství.id GROUP BY kniha.název, nakladatelství.název 37

38 5.4.3 AVG(sloupec) Funkce AVG počítá aritmetický průměr z vybraných hodnot zadaného sloupce. Mějme následující příklad. Vezměme si pouze brněnská nakladatelství a pro všechny knihy, které byly těmito nakladatelstvími vydány, zjistěte průměrnou hmotnost: SELECT kniha.název, nakladatelství.název, AVG(hmotnost) FROM kniha, výtisk, nakladatelství WHERE nakladatelství.id = výtisk.nakladatel_id AND výtisk.kniha_id = kniha.id AND adr_psč >= AND adr_psč <= GROUP BY kniha.název, nakladatelství.název MIN (sloupec) Agregační funkce MIN slouží pro vrácení minima z hodnot ve sloupci ze seskupených záznamů. Následující příkaz vypíše seznam všech nakladatelství, a pro každé z nich napíše, v kterém roce byla vydána nejstarší kniha. SELECT název, MIN(rok) FROM výtisk, nakladatelství WHERE nakladatelství.id = výtisk.nakladatel_id GROUP BY název, kniha_id 38

39 5.4.5 MAX (sloupec) Funkce MAX vrací maximum z hodnot zadaného sloupce. Příklad vypíše seznam nakladatelství, a pro každé z nich bude uvedeno kolik stojí jejich nejdražší výtisk. SELECT název, MAX(cena) FROM nakladatelství, výtisk WHERE nakladatelství.id = výtisk.nakladatel_id GROUP BY název Další použití agregačních funkcí Je sice pěkné, že dostaneme na výstup všechny skupiny agregovaných záznamů, ale někdy potřebujeme v rámci takových záznamů vybrat jen ty záznamy, které ještě dále budou splňovat další podmínky. Jinými slovy, máme možnost udělat další restrikci po provedení agregace. Dodatečnou restrikci zapisujeme v příkazu SELECT v části HAVING: SELECT kniha.název, nakladatelství.název, SUM(cena) FROM kniha, výtisk, nakladatelství WHERE kniha.id = výtisk.kniha_id AND výtisk.nakladatel_id = nakladatelství.id GROUP BY kniha.název, nakladatelství.název HAVING count(*) >=3 Výše uvedený příklad generuje seznam všech knih a nakladatelství a pro každou dvojici kniha nakladatel součet cen výtisků daného díla v daném nakladatelství. Do výpisu zahrneme ale jen ta nakladatelství, která vydala alespoň 3 různá vydání dané knihy. 39

40 Shrnutí pojmů EXISTS, vnořený dotaz, operátor, agregace Otázky 1. K jakému účelu se používá operátor EXISTS? 2. Kde je vhodné využít vnořených dotazů? 3. Jaké znáte operátory? 4. Jaké znáte agregační funkce? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc.,

41 6 POUŽITÍ A PRÁCE S ULOŽENÝMI PROCEDURAMI V MS SQL SERVERU Čas ke studiu 3 hodiny Cíl Seznámení se se základními možnostmi podmíněného zpracování, řízení toku, kurzory a následnou implementaci v rámci uložených procedur nebo uživatelských funkcích, přičemž bude vysvětlen rozdíl mezi uloženou procedurou s uživatelskou funkcí. Výklad T SQL poskytuje širokou škálu funkcionality pro programátory nebo databázové administrátory. Transact SQL umožňuje řízení SQL dotazů, podmíněné zpracování konstrukcemi IF, ELSE, CASE, nebo WHILE, využití zabudovaných funkcí MSSQL serveru, nebo také sekvenční zpracování pomocí kurzorů. Velká síla T SQL je v uložených procedurách díky nimž mohou programátoři definovat dávky SQL a znovu využívat kód, definovat triggery, nebo například řešit část aplikační logiky už na databázovém serveru. Administrátoři mohou pomocí systémových uložených procedur administrovat server, systémové procedury totiž umožňují pomocí T SQL nastavovat velkou škálu parametrů SQL serveru, vytvářet databáze, zálohovat, nastavovat práva atd 6.1 PODMÍNĚNÉ ZPRACOVÁNÍ T SQL umožňuje vracet hodnoty dotazu na základě dalšího zpracování a logického vyhodnocení výrazů. Můžeme vykonat blok příkazů, pokud je splněna podmínka, nebo vykonat úplně jiný kód pokud podmínka splněna není. Na základě získaný hodnot můžeme tyto hodnoty dále zpracovávat nebo úplně měnit či transformovat. 41

42 6.1.1 IF, ELSE Struktura IF, ELSE umožňuje vyhodnotit logický výraz a dle jeho výsledku vykonat dotaz. IF Boolean_expression { sql_statement statement_block } [ ELSE { sql_statement statement_block } ] Příklad: int = 250 > 100 BEGIN SELECT TOP 100 * FROM TABLE END ELSE BEGIN SELECT * FROM TABLE END CASE Funkce CASE umožňuje vracet hodnotu na základě vyhodnocení jednoho, nebo více výrazů. Syntaxe: CASE input_expression 42

43 WHEN when_expression THEN result_expression [...n ] [ ELSE else_result_expression ] END Příklad: SELECT firstname, surname, CASE gender WHEN 'male' THEN 'M' WHEN 'female' THEN 'F' ELSE 'UNKNOWN' END, Age, birthdate FROM peoples 6.2 ŘÍZENÍ TOKU T SQL umožňuje zpracovávat bloky příkazů opakovaně, pohybovat se v nich, nebo je s nějakou podmínkou okamžitě opouštět. Pomocí cyklu WHILE můžeme vykonávat blok příkazů, dokud není splněná námi definovaná podmínka pomocí příkazu GOTO, se můžeme dle uvážení pohybovat v bloku příkazů nebo bloky opouštět pomocí příkazu RETURN RETURN RETURN umožňuje okamžitě opustit aktuální dotaz, dávku, nebo proceduru a vrátit se do nadřazeného bloku s návratovou hodnotou. Syntaxe: RETURN [ integer_expression ] Příklad: 43

44 CREATE PROCEDURE sysname = NULL AS IS NULL BEGIN PRINT 'You must give a user name' RETURN END ELSE BEGIN SELECT o.name, o.id, o.uid FROM sysobjects o INNER JOIN master..syslogins l ON o.uid = l.sid WHERE l.name END; WHILE Umožňuje v cyklu vykonávat příkaz nebo dávku příkazů. Syntaxe: WHILE Boolean_expression { sql_statement statement_block BREAK CONTINUE } Příklad: int FROM anytable WHERE columna>10) 44

45 BEGIN BREAK UPDATE anytable SET columna=(columna+1) END GOTO Umožňuje provádět skoky v dávkách SQL. Syntaxe: GOTO label Příklad:... UPDATE anytable SET columna=1 = 0 GOTO endblock UPDATE anytable SET columnb= endblock: RETURN 45

46 6.3 KURZORY Kurzory umožňují sekvenčně zpracovávat řádky dotazu. Někdy je zapotřebí zpracovávat řádky jeden po druhém a ne celou sadu a právě k tomu kurzory slouží. Nicméně pokud to není nezbytně zapotřebí je lépe použít jiné konstrukce. Kurzory mohou totiž způsobit při svém běhu některé problémy, jedním z nich je velká paměťová náročnost, kurzory mohou způsobit i vyčerpání veškeré dostupné paměti, další problém nám může způsobit zamykání prostředků, ale asi největším jejich nedostatkem je rychlost, MSSQL server je založen na práci se sadami řádků a ne se sekvenčním zpracováním, proto je práce se sadami vždy rychlejší. Někdy však vaše aplikace použití kurzorů vyžaduje a vy jejich funkcionalitu velmi oceníte. // Kurzor se definuje SQL dotazem, který vrací sadu řádků. Řádky se pak z něj dají brát postupně po jednom, nebo po blocích a to v obou směrech podle definice kurzoru. Když skončíte práci s kurzorem je nutné ho explicitně uzavřít a dealokovat, aby jste uvolnili veškeré prostředky, které kurzor alokoval. Pokud tak neučiníte, kurzor zůstane v paměti a bude jí blokovat. Problém může také nastat, pokud by jste alokovali dva stejně pojmenované kurzory (i když nejsou ve stejném bloku!), je lépe tomu předcházet a v každé proceduře pojmenovávat kurzor dle jeho funkce jiným názvem Životní cyklus kurzoru 1. deklarace kurzoru 2. otevření kurzoru 3. práce s řádky 4. uzavření kurzoru 5. dealokace kurzoru Deklarace kurzoru Už při deklaraci kurzoru definujeme, jak s ním budeme pracovat a také se kterými daty, při jeho deklaraci určujeme SQL dotazem, se kterými daty budeme pracovat a dodatečným deklaracemi můžeme určit, jestli budeme kurzor otevírat pouze pro čtení, jestli se budeme pohybovat pouze dopředu nebo i zpět, nebo třeba viditelnost kurzoru. Syntaxe: 46

47 DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY UPDATE [ OF column_name [,...n ] ] } ] [;] Příklad: DECLARE cursorabc CURSOR FOR SELECT columna,columnb,columnc FROM anytab Otevření kurzoru příkazem OPEN kurzor naplníme Syntaxe: OPEN { { [ GLOBAL ] cursor_name } cursor_variable_name } Příklad: OPEN cursorabc Práce s řádky pracovat s řádky můžeme pomocí příkazu FETCH kterým načítáme do proměnných hodnoty z jednotlivých řádků, výsledek volání fetch je uložen v (0 úspěch, 1 neúspěch, 2 chybějící řádek) 47

48 Syntaxe: FETCH [ [ NEXT PRIOR FIRST LAST ABSOLUTE { } RELATIVE { } ] FROM ] { { [ GLOBAL ] cursor_name } [ [,...n ] ] Příklad: FETCH NEXT FROM cursorabc Zavření a dealokace kurzoru příkazem CLOSE uvolníme paměť, kterou alokoval kurzor pro načtení řádků příkazem DEALOCATE uvolníme veškeré prostředky, které kurzor alokoval Syntaxe: CLOSE { { [ GLOBAL ] cursor_name } cursor_variable_name } DEALLOCATE { { [ GLOBAL ] cursor_name } Příklad: CLOSE cursorabc 48

49 DEALLOCATE cursorabc Komplexní příklad: -- deklarace proměnných int varchar(10) decimal(10,2) -- deklarace kurzoru DECLARE cursorabc CURSOR FORWRD_ONLY FOR SELECT columna,columnb,columnc FROM anytable -- otevření kurzoru OPEN cursorabc -- načte řádek do kurzoru FETCH NEXT FROM cursorabc INTO -- cyklus pro zpracování všech řádek WHILE = 0 BEGIN -- zde můžeme zpracovávat řádky -- načte další řádek 49

50 FETCH NEXT END -- uzavření kurzoru CLOSE cursorabc -- dealokace kurzoru DEALLOCATE 6.4 ULOŽENÉ PROCEDURY Uložené procedura je seskupení příkazů T SQL do jediného objektu uloženého na SQL serveru. Když se procedura vykonává poprvé po nastartovaní instance SQL serveru, uloží se do cache plán optimálního přístupu k datům, server pak tento plán využívá při každém dalším spuštění, čímž může urychlit vykonání dotazu. To je jedna a ne jediná z výhod uložených procedur. Další výhodou je znovupoužitelnost kódu, namísto, aby jste všude kde je potřeba definovali jednoúčelový blok příkazů je lepší využít uloženou proceduru. Pokud by se tento kód měl vykonávat v nějaké z vašich aplikací jejich výhody se znásobí. Pokud by se třeba změnilo uložení dat v tabulkách, musíte vaši aplikaci popřípadě více aplikací na všech místech přepsat a v horším případě i překompilovat, ale pokud používáte uloženou proceduru, stačí ji změnit a pro aplikace se v podstatě nic nestalo. Použití procedur je také z pohledu db administrátora bezpečnější než přímý přístup do tabulek. Syntaxe: CREATE { PROC PROCEDURE } [schema_name.] procedure_name [ ; number ] [ [ type_schema_name. ] data_type } [ VARYING ] [ = DEFAULT ] [ OUT OUTPUT ] [READONLY] ] [,...n ] [ WITH <procedure_option> [,...n ] ] 50

51 [ FOR REPLICATION ] AS { <sql_statement> [;][...n ] <method_specifier> } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ] <sql_statement> ::= { [ BEGIN ] statements [ END ] } <method_specifier> ::= EXTERNAL NAME assembly_name.class_name.method_name Příklad: CREATE procedure int,@other int,@sometext varchar(100) AS IF ISNULL(@pid,0)=0 RETURN EXEC IF ISNULL(@other,0)<>0 BEGIN int 51

52 FROM anytable WHERE AND END UPDATE sometable SET WHERE 6.5 UŽIVATELSKY DEFINOVANÉ FUNKCE Uživatelsky definované funkce mají stejně jako uložené procedury mnoho výhod ukládání do cache, znovupoužití kódu atd., narozdíl od procedur však můžeme funkce použít i tam kde procedury ne (například v klauzuli SELECT). Typy uživatelsky definovaných funkcí: Skalární uživatelsky definované funkce Přímé tabulkové uživatelsky definované funkce Vícepříkazové uživatelsky definované funkce Skalární uživatelsky definované funkce mohou přebírat nula nebo více argumentů vrací jedinou hodnotu Syntaxe: CREATE FUNCTION [ schema_name. ] function_name ( [ [ AS ][ type_schema_name. ] parameter_data_type [ = DEFAULT ] [ READONLY ] } [,...n ] ] 52

53 ) RETURNS return_data_type [ WITH <function_option> [,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END [ ; ] Příklad: CREATE FUNCTION dbo.udf_dayofweek(@dtdate DATETIME) RETURNS VARCHAR(10) AS BEGIN VARCHAR(10) = CASE DATEPART(weekday,@dtDate) WHEN 1 THEN 'Monday' WHEN 2 THEN 'Tuesday' WHEN 3 THEN 'Wednesday' WHEN 4 THEN 'Thursday' WHEN 5 THEN 'Friday' WHEN 6 THEN 'Saturday' WHEN 7 THEN 'Sunday' END RETURN (@rtdayofweek) END GO 53

54 -- použití funkce SELECT udf_dayofweek(getdate()) Přímé tabulkové uživatelsky definované funkce mohou přebírat nula nebo více argumentů vrací data na základě jediného příkazu SELECT odkazuje se na ně z klauzule FROM Syntaxe: CREATE FUNCTION [ schema_name. ] function_name ( [ [ AS ] [ type_schema_name. ] parameter_data_type [ = DEFAULT ] [ READONLY ] } [,...n ] ] ) RETURNS TABLE [ WITH <function_option> [,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [ ; ] Příklad: 54

55 CREATE FUNCTION varchar(100)) RETURNS TABLE AS RETURN ( SELECT * FROM peoples WHERE city=@city ( GO Příklad použití funkce: SELECT * FROM GetByCity('Prague') Vícepříkazové uživatelsky definované funkce Na rozdíl od přímých tabulkových funkcí, které jsou omezeny na jediný příkaz select, mohou vícepříkazové funkce vrátit výsledek definovaný pomocí více příkazů T SQL Syntaxe: CREATE FUNCTION [ schema_name. ] function_name ( [ [ AS ] [ type_schema_name. ] parameter_data_type [ = DEFAULT ] [READONLY] } [,...n ] ] ) 55

56 TABLE <table_type_definition> [ WITH <function_option> [,...n ] ] [ AS ] BEGIN function_body RETURN END [ ; ] Shrnutí pojmů IF, ELSE, CASE, RETURN, WHILE, GOTO, kurzor, uložená procedura, uživatelsky definovaná funkce Otázky 1. K jakým účelům se používají příkazy CASE a IF ELSE a jaký je mezi nimi rozdíl? 2. Jaké znáte příkazy pro řízení toku a vysvětlete ve stručnosti rozdíl mezi jednotlivými variantami? 3. Co to je kurzor a jaká je syntaxe pro jeho vytvoření? 4. Co to je uložená procedura, jaké je její využití a syntaxe pro její vytvoření? 5. Jaký rozdíl je mezi uloženou procedurou a uživatelskou funkcí? Použitá literatura [1] ITZIK BEN GAN. Microsoft SQL Server 2012 T SQL Fundamentals. Místo vydání: O Reilly Media, Inc.,

57 [2] NATARAJNA, J., SHAW, R., BRUCHEZ, R., COLES, M. Pro T SQL 2012 Programmer's Guide. Místo vydání: Apress,

58 7 ODCHYTÁVÁNÍ VYJÍMEK Čas ke studiu 1 hodina Cíl Seznámení se s praktikami odchytávání výjimek. Výklad Pokud chceme v našich SQL příkazech nebo procedurách odchytávat výjimka, dává nám k tomu T SQL nástroj v podobě konstrukce TRY CATCH. Tato konstrukce je schopná zachytit výjimky, které mohou nastat při vykonávání našeho kódu a vykonat nějakou reakci na vzniklou chybu. Například vygenerovat zprávu o chybě nebo anulovat transakci. Nastane li v bloku TRY nějaká výjimka, skončí SQL server v místě, kde nastala a vykoná příkazy v bloku catch. Výhoda této konstrukce je, že se do sebe může libovolně vnořovat. Konstrukce TRY nezachytí syntaktické chyby, nebo chybné názvy objektů. 7.1 FUNKCE POSKYTUJÍCÍ INFORMACE O CHYBÁCH ERROR_LINE číslo řádky kde došlo k chybě ERROR_MESSAGE chybová zpráva ERROR_NUMBER číslo chyby ERROR_PROCEDURE název procedury kde došlo k chybě ERROR_SEVERITY závažnost chyby ERROR_STATE stav chyby 7.2 KONSTRUKCE TRY...CATCH 58

59 Syntaxe: BEGIN TRY { sql_statement statement_block } END TRY BEGIN CATCH [ { sql_statement statement_block } ] END CATCH [ ; ] Příklad: BEGIN TRY INSERT anytable (columna,columnb,columnc) VALUES (1,2,3) END TRY BEGIN CATCH print 'Chyba při vykonávání příkazu!' END CATCH 7.3 VYTVÁŘENÍ VLASTNÍCH VYJÍMEK Někdy potřebujeme na chyby reagovat vlastními výjimkami, i na to má T SQL nástroj, vlastní výjimku můžeme přidat pomocí systémové procedury sp_addmessage a výjimku vyvolávat příkazem RAISERROR. 59

60 Syntaxe sp_addmessage = ] msg_id, = ] severity, = ] 'msg' [, = ] 'language' ] [, = ] { 'TRUE' 'FALSE' } ] [, = ] 'replace' ] -- úprava vlastní vyjímky sp_altermessage = ] message_number, = ] 'write_to_log', = ] 'value' -- odstraněni vyjímky sp_dropmessage = ] message_number [, = ] 'language' ] Příklad: EXEC sp_addmessage , 20, N'Došlo k mojí vyjímce!' 7.4 VYVOLÁVÁNÍ VLASTNÍCH VYJÍMEK Vyvolat vlastní výjimku můžeme pomocí RAISERROR Syntaxe: RAISERROR ( { msg_id } 60

61 {,severity,state } [,argument [,...n ] ] ) [ WITH OPTION [,...n ] ] Příklad: RAISERROR (123456, 20, 1, N'any.anytable' ) Shrnutí pojmů TRY, CATCH, RAISERROR Otázky 1. Jakým způsobem lze odchytávat výjimky v T SQL? 2. Jak lze vytvořit vlastní výjimku v T SQL? Použitá literatura [1] NATARAJNA, J., SHAW, R., BRUCHEZ, R., COLES, M. Pro T SQL 2012 Programmer's Guide. Místo vydání: Apress,

62 8 ÚVOD DO MS.NET FRAMEWORK A OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ Čas ke studiu 8 hodin Cíl Cílem je definovat základní pojmy objektově orientovaného programování na příkladech programovacího jazyka C#. Pochopit základní principy OOP: zapouzdření, dědičnost, polymorfismus. Výklad Objektově orientované programování představuje moderní metodiku vývoje softwaru, kterou podporuje většina programovacích jazyků. OOP je filosofie, je to nový pohled na funkci programu a komunikaci mezi jeho jednotlivými částmi. Mělo by se používat vždy, ať už děláme malou utilitku nebo složitý databázový systém. 8.1 OBJEKTOVĚ ORIENTOVANÝ PŘÍSTUP Při použití OOP klademe důraz na znovupoužitelnost. Přístup nalézá inspiraci v průmyslové revoluci vynález základních komponent, které budeme dále využívat (např. když stavíme dům, nebudeme si pálit cihly a soustružit šroubky, prostě je již máme hotové). Poskládání programu z komponent je výhodnější a levnější. Můžeme mu věřit, je otestovaný (o komponentách se ví, že fungují, jsou otestovány a udržovány). Pokud je někde chyba, stačí ji opravit na jednom místě. 62

63 8.1.1 Jak OOP funguje Při tvorbě softwarového řešení se snažíme nasimulovat realitu tak, jak ji jsme zvyklí vnímat a převést ji do formy zdrojových kódů daného programovacího jazyka. Základní jednotkou v OOP je objekt, který odpovídá nějakému objektu z reálného světa (např. objekt člověk nebo databáze). Obrázek 2 Základní objekty Každý objekt má své atributy a metody, se kterými pracujeme. Atributy Atributy objektu jsou vlastnosti neboli data, která objekt charakterizuje a jsou pro něj specifické (např. u člověka jméno a věk, u databáze heslo). Metody Metody jsou schopnostmi, které umí objekt vykonávat. U člověka by to mohly být metody: JdiDoPrace(), Pozdrav() nebo Mrkni(). U databáze PridejZaznam() nebo Vyhledej()). Metody mohou mít parametry a mohou také vracet nějakou hodnotu. Obrázek 3 Definice objektu včetně atributů a metod 63

64 8.1.2 Třída Třídou jako takovou v terminologii objektově orientovaného programování chápeme jako vzor, podle kterého se objekty vytváří. Definuje tedy jejich základní vlastnosti a schopnosti. Objekt, který se vytvoří podle třídy, se nazývá instance. Instance mají stejné rozhraní jako třída, podle které se vytváří, ale navzájem se liší svými daty (atributy). Mějme například definovanou obecnou třídu Člověk. Z této třídy budeme vycházet při deklaraci konkrétních osob, se kterými v rámci OOP chceme pracovat. Vytvořme si tak například dvě instance Karel a Josef. Jak jsme si již řekli, obě takto vytvořené instance mají ty samé metody a atributy, jako třída (např. jméno a věk) a metody (JdiDoPrace() a Pozdrav()), ale hodnoty v nich se liší (první instance má v atributu jméno hodnotu "Karel" a ve věk 22, druhá "Josef" a 45). Obrázek 4 Definice třídy a vtvoření jejich instancí OOP stojí na základních třech pilířích: Zapouzdření, Dědičnost a Polymorfismus Zapouzdření Zapouzdření umožňuje skrýt některé metody a atributy tak, aby zůstaly použitelné pouze uvnitř definované třídy. Objekt si tak můžeme představit jako černou skřínku, která komunikuje s okolím pouze pomocí definovaného rozhraní (interface). Přes toto rozhraní jsou objektu předávána vstupní data, případně instrukce, které následně interně zpracovává. 64

65 Okolní objekty nemají informaci, jak to uvnitř funguje, ale ví resp. očekávají, jaké chování lze očekávat. Nemůžeme tedy způsobit nějakou chybu, protože využíváme a vidíme jen to, co tvůrce třídy zpřístupnil. Příkladem může být naše definice třídy Člověk, která bude mít atribut datumnarozeni a na jeho základě další atributy: plnolety a vek. Hodnota atributu plnolety je závislá na hodnotě atributu vek, který je ale závislý na hodnotě atributu datumnarozeni. Kdyby někdo objektu zvenčí změnil datumnarozeni, přestaly by platit proměnné plnolety a vek. Říkáme, že vnitřní stav objektu by byl nekonzistentní. Toto se nám ve strukturovaném programování může klidně stát. V OOP však objekt zapouzdříme a atribut datumnarozeni stejně jako atributy plnolety a vek definujeme jako privátní, čímž říkáme, že je použitelný pouze v rámci daného objektu. Takto zajistíme, že tento argument nebude zvenčí viditelný. Nicméně potřebujeme vytvořit rozhraní, přes které umožníme atribut datumnarozeni změnit. Deklarujeme tedy objektu metodu ZmenDatumNarozeni(), která dosadí nové datum narození do atributu datumnarozeni a zároveň provede potřebný přepočet věku a přehodnocení plnoletosti. Použití objektu je tak bezpečné a aplikace stabilní. Zapouzdření tedy donutí programátory používat objekt jen tím správným způsobem Dědičnost Dědičnost je další ze základních vlastností OOP a slouží k vytvoření nových datových struktur na základě starých. Vysvětleme si to na jednoduchém příkladu: Budeme programovat informační systém pro správu zvířat v ZOO. Náš systém budou používat dva typy uživatelů: uživatel a administrátor. Uživatel je běžný ošetřovatel zvířat, který bude moci upravovat informace o zvířatech, např. jejich váhu nebo rozpětí křídel. Administrátor bude moci také upravovat údaje o zvířatech a navíc zvířata přidávat a mazat z databáze. Z atributů bude mít navíc telefonní číslo, aby ho bylo možné kontaktovat v případě výpadku systému. Bylo by jistě zbytečné a nepřehledné, kdybychom si museli definovat obě třídy úplně celé, protože mnoho vlastností těchto 2 objektů je společných. Uživatel i administrátor budou mít jistě jméno, věk a budou se moci přihlásit a odhlásit. Nadefinujeme si tedy základní třídu Uzivatel: class Uzivatel 65

66 { private string jmeno; private string heslo; private int vek; public bool Prihlasit(string heslo) {... } public bool Odhlasit {... } Bez znalosti principů dědičnosti bychom třídu Administrator definovali asi takto: class Administrator { private string jmeno; private string heslo; private int vek; private string telefonnicislo; 66

67 public bool Prihlasit(string heslo) {... } public bool Odhlasit {... } public void NastavVahu(Zvire zvire) {... } public void PridejZvire(Zvire zvire) { } public void VymazZvire(Zvire zvire) { Vidíme, že máme ve třídě Administrator spoustu duplikovaného kódu. V případě jakékoli změny musíme nyní provádět úpravy v obou třídách, kód se nám velmi komplikuje. 67

68 Z tohoto důvodu je vhodné použít principu dědičnosti. Definujeme tedy třídu Administrator tak, aby z třídy Uzivatel dědila. Atributy a metody uživatele tedy již nemusíme znovu definovat, C# nám je do třídy sám dodá: class Administrator: Uzivatel { private string telefonnicislo; public void PridejZvire(Zvire zvire) { } public void VymazZvire(Zvire zvire) { }... } Vidíme, že ke zdědění jsme použili operátor ":". V anglické literatuře najdete dědičnost pod slovem inheritance. Z předchozí kapitoly týkající se principu zapouzdření již víte, že v potomkovi nebudou přístupné privátní atributy třídy Uzivatel, ale pouze atributy a metody s modifikátorem public. Privátní atributy a metody jsou chápány jako speciální logika konkrétní třídy, která je potomkovi utajena, i když ji vlastně používá, nemůže ji měnit. 68

69 Pokud bychom požadovali, aby i potomek mohl s těmito atributy pracovat, použijeme nový modifikátor přístupu protected, který funguje stejně, jako private, ale dovoluje tyto atributy dědit. Začátek třídy Uzivatel by tedy vypadal takto: class Uzivatel { protected string jmeno; protected string heslo; protected int vek; Když si nyní vytvoříme instance uživatele a administrátora, oba budou mít např. atribut jmeno a metodu Prihlasit(). C# třídu Uzivatel zdědí a doplní nám automaticky všechny její atributy. Výhody dědění jsou jasné, nemusíme opisovat oběma třídám ty samé atributy, ale stačí dopsat jen to, v čem se liší. Zbytek se podědí. Přínos je obrovský, můžeme rozšiřovat existující komponenty o nové metody a tím je znovu využívat. Nemusíme psát spousty duplikovaného kódu. A hlavně když změníme jediný atribut v mateřské třídě, automaticky se tato změna všude podědí a je použitelná u všech potomků. Nedojde tedy k tomu, že bychom to museli měnit ručně u 20ti tříd a někde na to zapomněli a způsobili chybu. O mateřské třídě se někdy hovoří jako o předkovi (v našem případě třída Uzivatel) a o třídě, která z ní dědí, jako o potomkovi (v našem případě třída Administrator). Potomek může přidávat nové metody nebo si uzpůsobovat metody z mateřské třídy (viz dále). Další možností, jak objektový model navrhnout, by bylo zavést mateřskou třídu Uzivatel, která by sloužila pouze k dědění. Z Uzivatel by potom dědili třídy Osetrovatel a z něj třída Administrator. To by se však vyplatilo při větším počtu typů uživatelů. V takovém případě hovoříme o hierarchii tříd. Náš příklad byl jednoduchý, a proto nám stačily pouze definice 2 tříd. Existují tzv. návrhové vzory, které obsahují osvědčená schémata objektových struktur pro známé případy užití. 69

70 V technické literatuře se setkáte také s grafickou prezentací objektového modelu. K tomuto účelu se využívá jazyka UML (Unified Modeling Language), což je ve stručnosti soubor grafických notací sloužící pro jednoduché znázornění závislosti mezi jednotlivými objekty. V rámci tohoto objektového modelování se dědičnost znázorňuje graficky jako prázdná šipka směřující k předkovi. V našem případě by grafická notace vypadala takto: Obrázek 5 Znázornění objektového modelu pomocí UML Datový typ při dědičnosti Obrovskou výhodou dědičnosti je, možnost vytvoření proměnné s datovým typem mateřské třídy, do které můžeme bez problému ukládat i její potomky. Je to dané tím, že potomek obsahuje vše, co obsahuje mateřská třída, splňuje tedy "požadavky" (přesněji obsahuje rozhraní) datového typu. A k tomu má oproti mateřské třídě něco navíc. Můžeme si tedy vytvořit proměnnou typu Uzivatel a v ní mít instance jak uživatele, tak administrátory. Tato implementace dědičnosti by vypadala následovně: Uzivatel u = new Uzivatel("Jan Novák", 33); 70

71 Administrator a = new Administrator("Josef Nový", 25); // Nyní do uživatele uložíme administrátora: u = a; // Vše je v pořádku, protože uživatel je předek // Zkusíme to opačně a dostaneme chybu: a = u; V C# je mnoho konstrukcí, jak operovat s typy instancí při dědičnosti. Následující příklad prezentuje postup jak např. ověřit typ instance dané proměnné: Uzivatel u = new Administrator("Josef Nový", 25); if (u is Administrator) Console.WriteLine("Je to administrátor"); else Console.WriteLine("Je to uživatel"); Pomocí operátoru is se můžeme zeptat, zda je objekt daného typu. Kód výše otestuje, zda je v proměnné u uživatel nebo jeho potomek administrátor. Jazyky, které dědičnost podporují, buď umí dědičnost jednoduchou, kde třída dědí jen z jedné třídy, nebo vícenásobnou, kde třída dědí hned z několika tříd najednou. Vícenásobná dědičnost se však v praxi příliš neosvědčila. C# podporuje pouze jednoduchou dědičnost, s vícenásobnou dědičností se můžete setkat např. v programovacím jazyce C Polymorfismus Nenechte se vystrašit příšerným názvem této techniky, protože je v jádru velmi jednoduchá. Polymorfismus umožňuje používat jednotné rozhraní pro práci s různými typy objektů. Mějme například mnoho objektů, které reprezentují nějaké geometrické útvary (kruh, čtverec, trojúhelník). Bylo by jistě přínosné a přehledné, kdybychom s nimi mohli komunikovat jednotně, ačkoli se liší. Můžeme zavést třídu GeometrickyUtvar, která by obsahovala atribut barva a metodu Vykresli. Všechny geometrické 71

72 tvary by potom dědily z této třídy její interface (rozhraní). Objekty kruh a čtverec se ale jistě vykreslují jinak. Polymorfismus nám umožňuje definici metody vykresli u každé podtřídy samostatně tak, aby pracovala tak jak vyžadujeme. Rozhraní daného objektu tak zůstane zachováno a my nebudeme muset přemýšlet, jak se daného obejktu volá. Polymorfismus bývá často vysvětlován na obrázku se zvířaty, která mají všechna v rozhraní metodu Speak(), ale každé si ji vykonává po svém. Obrázek 6 Obecný příklad polymorfismu Podstatou polymorfismu je tedy metoda nebo metody, které mají všichni potomci definované se stejnou hlavičkou, ale jiným tělem. 72

73 8.1.6 Statika Až doposud jsme byli zvyklí, že data (stav) nese vždy instance daného objektu. Proměnné, které jsme definovali, tedy patřily instanci a byly pro každou instanci jedinečné. OOP však umožňuje definovat proměnné a metody na samotné třídě bez nutnosti vytvoření instance daného třídy. Těmto prvkům říkáme statické a jsou nezávislé na instanci Statické proměnné Jako statické můžeme označit různé prvky. Začněme u proměnných. Jak jsem se již v úvodu zmínil, statické prvky patří třídě, nikoli její instanci. Data v nich uložená tedy můžeme číst bez ohledu na to, zda nějaká instance existuje. V podstatě můžeme říci, že statické proměnné jsou společné pro všechny instance třídy, ale není to přesné, protože s instancemi doopravdy vůbec nesouvisí. Definujme jednoduchou třídu Uzivatel: class Uzivatel { private string jmeno; private string heslo; private bool prihlaseny; public Uzivatel(string jmeno, string heslo) { this.jmeno = jmeno; this.heslo = heslo; prihlaseny = false; } public bool PrihlasSe(string zadaneheslo) 73

74 { if (zadaneheslo == heslo) { prihlaseny = true; return true; } else return false; // hesla nesouhlasí } } Třída je poměrně jednoduchá, reprezentuje uživatele nějakého systému. Každá instance uživatele má své jméno, heslo a také se o ni ví, zda je přihlášená či nikoli. Aby se uživatel přihlásil, zavolá se na něm metoda PrihlasSe() a v jejím parametru heslo, které člověk za klávesnicí zadal. Metoda ověří, zda se jedná opravdu o tohoto uživatele a pokusí se ho přihlásit. Vrátí hodnotu true/false podle toho, zda přihlášení proběhlo úspěšně. Když se uživatel registruje, systém mu napíše, jakou minimální délku musí jeho heslo mít. Toto číslo bychom měli mít někde uložené. Ve chvíli, kdy uživatele registrujeme, tak ještě nemáme k dispozici jeho instanci. Objekt není vytvořený a vytvoří se až po vyplnění formuláře. Nemůžeme tedy v třídě Uzivatel k tomuto účelu použít veřejnou proměnnou minimalnidelkahesla. Samozřejmě by bylo velmi přínosné, kdybychom měli údaj o minimální délce hesla uložený ve třídě Uzivatel, protože k němu logicky patří. Řešení je jednoduché, údaj uložíme do statické proměnné pomocí modifikátoru static: class Uzivatel { private string jmeno; 74

75 private string heslo; private bool prihlaseny; public static int minimalnidelkahesla = 6;... } K takto definované proměnné můžeme nyní přistupovat přímo přes třídu bez nutnosti vytvářet její instanci: Console.WriteLine(Uzivatel.minimalniDelkaHesla); Vidíme, že proměnná opravdu náleží třídě. Můžeme se na ni ptát v různých místech programu bez toho, aniž bychom měli uživatele vytvořeného. Naopak na konkrétní instanci třídy Uzivatel tuto proměnnou nenalezneme: Uzivatel u = new Uzivatel("Tomáš Marný", "heslojeveslo"); // Kompilátor jazyka C# u následující příkazu zahlásí chybu a kód se nezkompiluje. Console.WriteLine(u.minimalniDelkaHesla); 75

76 Statické metody Statické metody se volají na třídě. Jedná se zejména o pomocné metody, které potřebujeme často používat a nevyplatí se nám tvořit instanci. Mnoho takovýchto metod již známe, jen jsme si to neuvědomovali. Nikdy jsme např. netvořili instanci konzole k tomu, abychom do ní mohli zapisovat. Metoda WriteLine() na třídě Console je statická. Konzole je jen jedna a bylo by zbytečné tvořit si z ní instanci, když ji chceme používat. Podobně je tomu např. u metody Round() na třídě Math. Když chceme zaokrouhlit číslo, nebudeme si k tomu přeci tvořit objekt. Jedná se tedy většinou o pomocné metody, kde by instanciace zbytečně zdržovala nebo nedávala smysl. Ukažme si opět reálný příklad. Při registraci uživatele potřebujeme znát minimální délku hesla ještě před jeho vytvořením. Bylo by také dobré, kdybychom mohli před jeho vytvořením i heslo zkontrolovat, zda má správnou délku, neobsahuje diakritiku, je v něm alespoň jedno číslo a podobně. Za tímto účelem si vytvoříme pomocnou statickou metodu ZvalidujHeslo(): public static bool ZvalidujHeslo(string heslo) { if (heslo.length >= minimalnidelkahesla) { // podrobnou logiku validace hesla vynecháme return true; } return false; } Opět si zkusíme, že metodu můžeme na třídě Uzivatel zavolat: Console.WriteLine(Uzivatel.ZvalidujHeslo("heslojeveslo")); 76

77 Pozor! Díky tomu, že metoda ZvalidujHeslo() náleží třídě, nemůžeme v ní přistupovat k žádným instančním proměnným. Tyto proměnné totiž neexistují v kontextu třídy, ale instance. Ptát se na jmeno by v naší metodě nemělo smysl! Stejné funkčnosti při validaci hesla samozřejmě můžeme dosáhnout i bez znalosti statiky. Vytvořili bychom si nějakou třídu, např. ValidatorUzivatelu a do ní napsali tyto metody. Museli bychom poté vytvořit její instanci, abychom metody mohli volat. Bylo by to trochu matoucí, protože logika uživatele by byla zbytečně rozdělena do dvou tříd, když může být za pomoci statiky pohromadě Statické třídy Pokud se nám vyskytne třída, která obsahuje jen pomocné metody nebo nemá smysl od ni tvořit instance (např. nikdy nebudeme mít 2 konzole), můžeme ji označit jako statickou. Takovouto třídu poté nelze instanciovat (vytvořit její instanci). Statické třídy v C# nelze dědit. Statické třídy, se kterými jsme se setkali, jsou např. Console a Math Rozhraní Rozhraním objektu se myslí to, jak je objekt viditelný zvenku. Již víme, že objekt obsahuje nějaké metody, ty mohou být privátní nebo veřejné. Rozhraní objektu tvoří právě jeho veřejné metody a představuje definici způsobu, jakým s určitým typem objektu můžeme komunikovat. Rozhraní se deklaruje obdobně jako třída zvlášť, přičemž takto definované rozhraní použijeme jako datový typ. Definujme si například třídu Ptak: class Ptak { public void Pipni() { 77

78 Console.WriteLine(" "); } public void Dychej() { Console.WriteLine("Dýchám..."); } public void Klovni() { Console.WriteLine("Klov, klov!"); } } Třída je opravdu triviální. Vytvořme si instanci ptáka: Ptak ptak = new Ptak(); Pokud budeme pracovat v prostředí MS Visual Studia, máme možnost po zapsání názvu instance třídy vidět náhled na všechny definované metody dané třídy tak jak je znázorněno na obr. 7 78

79 Obrázek 7 Náhled na existující veřejné metody instance dané třídy Nyní řešení pozměníme a to takovým způsobem, že pro třídu Ptak definujeme Interface (rozhraní). Využijeme k tomu klíčového slova interface. Je dobrým zvykem, že rozhraní začíná vždy na písmeno I (jako Interface). Vytvořme tedy interface IPtak. Do rozhraní IPtak přidáme hlavičky metod, schválně jednu vynecháme a přidáme pouze hlavičky metod Pipni a Dychej: interface IPtak { void Pipni(); void Dychej(); } Modifikátor public neuvádíme, protože rozhraní obsahuje vždy pouze veřejné metody (jinak by nemělo smysl, udává, jak s objektem zvenku pracovat). Definujme nyní proměnnou ptak tak, aby již nebyla typu Ptak, ale IPtak: 79

80 IPtak ptak = new Ptak(); Kódem výše říkáme, že v proměnné typu IPtak očekáváme objekt, který obsahuje ty metody, které jsou definovány v rozhraní. Abychom toho docílili, musíme změnit vlastní definici třídy Ptak. Definujme tedy třídu Ptak, která je odvozena z rozhraní IPtak. Dělá se to stejně, jako když třída od jiné dědí: class Ptak: IPtak {... Od instance takto definované třídy můžeme nyní očekávat pouze to, co poskytuje rozhraní. To proto, že proměnná ptak je již typu IPtak, nikoli Ptak. Metoda Klovni() úplně chybí. K čemu je to dobré? Výhod a využití je více, na první jsme již přišli. Pomocí rozhraní dokážeme zjednodušit rozhraní nějakého složitého objektu a vystavit jen tu část, která se nám v tu dobu hodí Vícenásobná dědičnost C# (stejně jako většina jazyků) nepodporuje vícenásobnou dědičnost. Nemůžeme tedy jednu třídu vytvořit děděním z několika jiných tříd. Je to hlavně z toho důvodu, že může vyvstat problém kolize názvů metod v různých třídách, ze kterých dědíme. Vícenásobná dědičnost se často obchází právě přes interface, protože těch můžeme ve třídě implementovat kolik chceme. Umožňuje nám to s instancí poté pracovat určitým způsobem a vůbec nás nezajímá, jakého typu objekt ve skutečnosti je a co všechno navíc obsahuje. Vytvořme tedy nový interface IJester. Bude to interface ještěra. Ten bude umět také dýchat a ještě se plazit: 80

81 interface IJester { void PlazSe(); void Dychej(); } Vyzkoušejme si "vícenásobnou dědičnost", přesněji implementaci více rozhraní v jedné třídě. Vytvořme si ptakoještěra. Třída PtakoJester bude implementovat rozhraní IPtak a IJester: class PtakoJester: IJester, IPtak { } Když nyní klikneme v tomto kódu pravým tlačítkem na jednotlivé interface (tedy na IJester a IPtak), můžeme v kontextovém menu zvolit možnost Implement Interface. Visual Studio nám automaticky do třídy vygeneruje potřebné metody. 81

82 Obrázek 7 Implementace rozhraní v prostředí MS Visual Studio Po implementaci obou rozhraní vypadá kód třídy takto: class PtakoJester: IJester, IPtak { public void PlazSe() { throw new NotImplementedException(); 82

83 } public void Dychej() { throw new NotImplementedException(); } public void Pipni() { throw new NotImplementedException(); } } Metody doimplementujeme: public void PlazSe() { Console.WriteLine("Plazím se..."); } public void Dychej() { Console.WriteLine("Dýchám..."); } 83

84 public void Pipni() { Console.WriteLine(" "); } Instanci třídy PtakoJester vytvoříme jako: PtakoJester ptakojester = new PtakoJester(); Na obr. 8 vidíme, že takto vytvořená instance obsahuje všechny metody třidy Ptak i Jester. Obrázek 8 Instance třídy PtakoJester implementující rozhraní Ptak i Jester Shrnutí pojmů 84

85 objekt, třída, atribut, metoda, zapouzdření, dědičnost, polymorfismus, statika, statické proměnné, statické metody, rozhraní, vícenásobná dědičnost Otázky 1. Jaký je základní princip objektově orientovaného programování? 2. Co je to třída a jaká je základní syntaxe v jazyce C#? 3. Co to je zapouzdření? 4. Vysvětlete pojem dědičnosti v rámci OOP? 5. Vysvětlete pojem polymorfismu v rámci OOP? 6. Co je to statická třída a jaký je rozdíl mezi klasickou třídou? 7. Co je to rozhraní? 8. Jakým způsobem realizovat vícenásobnou dědičnost? Použitá literatura [1] NAGEL, CH., EVJEN, B., GLYNN, J., WATSON, K., SKINNER, M. Professional C# 2012 and.net 4.5. Místo vydání: John Wiley & Sons, Inc., [2] MURACH, M. C# Místo vydání: Mike Murach & Associates, Inc., [3] TROELSEN, A. Pro C# 5.0 and the.net 4.5 Framework. Místo vydání: Apress,

86 9 TVORBA DATABÁZOVÝCH APLIKACÍ Čas ke studiu 5 hodin Cíl Představení základních možností a technologií pro vývoj databázových aplikací v prostředí MS.NET Framework. Výklad 9.1 K ČEMU DATABÁZI? Možná vás napadlo, k čemu vlastně potřebujeme nějakou databázi. Data bychom stejně dobře mohli ukládat do textových souborů, XML nebo dalších datových souborů. V odborné literatuře se místo pojmu databáze setkáme s označením RDBMS (Relation DataBase Management System). Volně by se dal tento pojem přeložit jako "systém řízení báze dat", případně databázový stroj. Ten sám o sobě není jen úložištěm dat. Jedná se o velmi sofistikovaný a odladěný nástroj, který za nás řeší spoustu problémů a zároveň je extrémně jednoduchý k použití. Prostředníkem pro komunikaci s databází je jak již víme jazyk SQL. V následujících kapitolách si ukážeme, jak je pomocí.net Frameworku přistupovat k relačním databázím. 9.2 PŘÍSTUPY PRO PRÁCI S RELAČNÍMI DATABÁZEMI V.NET Objektový svět a svět relačních databází (svět relační) jsou velmi rozdílné. Jedná se o 2 odlišné filozofie, o kterých si zde troufnu prohlásit, že jsou neslučitelné. Relační databáze jsou ověřený způsob jak pracovat s daty. I když existují i databáze plně objektové, firmám se do nich nyní nevyplatí investovat peníze a proto se zatím neprosadily. Po revoluci 86

87 v programování a příchodu objektů samozřejmě nastal problém s ukládáním dat, jelikož relační databáze objektově nefungují a objekty ukládat neumí. Existuje několik možností, jak se s tímto vypořádat Neobjektové programování První možností je samozřejmě programovat úplně bez objektů. Tím bychom však šli proti proudu, nemohli bychom používat žádné komponenty 3. stran a náš kód by byl velmi nekvalitní. Jelikož C# je objektový jazyk, ani by to v něm dost dobře nešlo Databázový Wrapper Přístup tzv. wrapperu nám umožňuje s databází pracovat jako s objektem, nicméně komunikujeme s ní stále v jejím jazyce SQL. Mícháme tedy objektový a relační kód. Přístup je jakýmsi kompromisem a vyžaduje filozofii OOP trochu ohnout. Výhodou je zachování výkonu a schopností databáze za cenu mírné degradace myšlenek OOP. Data z databáze vidíme nejčastěji jako hodnoty v tabulce (ta je objektem) a přicházíme o možnost přidělit entitám nějakou funkcionalitu. Tu místo toho sdružujeme do tzv. manažerů. Lze i částečně mapovat data na existující třídy, nicméně plnohodnotného konceptu objektového modelu nedosáhneme Objektově relační mapování Objektově relační mapování (ORM) jde ortodoxně za myšlenkou OOP. Z databáze tedy místo pole hodnot dostáváme rovnou objekty a ty na sobě mají metody. V jazyce SQL vůbec nekomunikujeme, tabulky v databázi vidíme jako kolekce objektů, se kterými můžeme pracovat běžnými prostředky jazyka. Jsme vlastně úplně odstíněni od toho, že pracujeme s relační databází. Nevýhodou tohoto systému je degradace výkonu databáze, SQL dotazy se generují automaticky a jsou často neefektivní. Dalším problémem ORM je, že je velmi složité. C# má naštěstí perfektně odladěné ORM přímo v sobě, čili nemusíme nic řešit. Naopak např. zprovoznit ORM v PHP není nic jednoduchého a tam preferuji přístup wrapperu Objektové databáze Kromě databází relačních existují i již zmíněné databáze objektové. Ty řeší problém neslučitelnosti objektového a relačního přístupu. Poskytují stejný komfort, jako ORM, ale vnitřně není třeba data převádět do tabulek, ukládají se rovnou jako objekty. Teoreticky neexistuje výkonnostní ani jiný důvod, proč by neměly nahradit databáze relační. V praxi se ale bohužel téměř nepoužívají a můžeme jen doufat, že se to časem změní. Zájemci se mohou podívat např. na projekt MongoDB. 87

88 9.3 MOŽNOSTI PŘIPOJENÍ K DATABÁZI V.NETu máme několik možností, jak databázi v naší aplikaci používat Připojená aplikace Přístup připojené aplikace použijeme ve chvíli, kdy potřebujeme data často v reálném čase číst nebo měnit. Pomocí tříd DataReader, Command a Connection posíláme databázi přímo příkazy v jazyce SQL a dostáváme výsledky. Obrázek 9 Příklad připojené aplikace Odpojená aplikace DataSet Přístup odpojené aplikace funguje tak, že máme v operační paměti tzv. DataSet, který v sobě obsahuje data z databáze. Aplikace pracuje s DataSetem a občas se DataSet sesynchronizuje s ostrou databází na serveru (disku). Za cenu méně aktuálních dat získáváme zvýšení rychlosti a pohodlnější práci. DataSet v sobě obsahuje tabulky, tabulka řádky a řádek sloupce. Tabulka je objekt, můžeme do ní řádky přidávat a upravovat je bez psaní SQL kódu. Když chceme spustit na databázi nějaký příkaz, použijeme DataAdapter, pomocí kterého si naplníme DataSet daty. Příkazy již musíme psát v jazyce SQL dané databáze. Obrázek 10 Příklad odpojené aplikace 88

89 Máme tedy určitou objektovou abstrakci, s tabulkami pracujeme objektově, ale data jsou stále jen sloupečky v tabulce, ne instance nějakých objektů. Také stále používáme jazyk SQL. Z hlediska výše uvedených přístupů se jedná o wrapper LINQ To SQL LINQ to SQL poskytuje kompletní objektovou abstrakci nad databází (objektově relační mapování). S databází pracujeme, jako kdyby to byl např. seznam objektů a vůbec neřešíme SQL dotazy, nevíme o tabulkách ani sloupcích, vše se děje na pozadí automaticky, dotaz nám vrací rovnou plnohodnotné objekty. Cena za takový luxus je horší optimalizace dotazů, která ale většinou nevadí. V naší aplikaci figuruje tzv. DataClasses, což je objektová struktura databáze. Obsahuje třídy pro jednotlivé tabulky, sloupce tabulky jsou vlastnosti daných tříd. V aplikaci komunikujeme pouze s DataClasses, ta potom na pozadí pomocí LINQ to SQL komunikuje s databází a provádí za nás SQL dotazy. My s jazykem SQL vůbec nepřijdeme do styku a s databází pracujeme jako s objektovou strukturou v operační paměti. Obrázek 11 LINQ to SQL Entity Framework Entity framework jde ještě dále, než LINQ to SQL. Jedná se o složitější technologii, která toho umí více (např. vazbu M:N), ale je těžkopádnější na použití. Více o této technologii se dozvíte v kapitole KOMUNIKACE S DATABÁZI POMOCÍ ADO.NET 89

90 .NET Framework obsahuje svou vlastní technologii pro přístup k datům ADO.NET, který se skládá y tříd, které umožňují aplikacím.net připojovat se ke zdrojům dat, vykonávat příkazy a spravovat odpojená data Architektura ADO.NET ADO.NET používá vícevrstvou architekturu, která se soustřeďuje okolo několika klíčových pojmů jako je Connection (objekt připojení), Command (objekt příkazu) a DataSet (objekt sady dat). Na rozdíl od dřívějších databázových technologií, kde bylo použito obecné řady objektů bez ohledu na to, o jaký zdroj dat se jedná (pokud například chcete získat nějaký záznam z databáze Oracle použijete stejnou třídu Connection jako v případě přístup k MS SQL Serveru), ADO.NET využívá k přístupu k databázím zprostředkovatale data (data provider modely), které jsou dostupné pro každá databázový zdroj zvlášť. Máte tak k dispozici data provider objekty pro databázi Oracle a jiné pro MS SQL Server ADO.NET zprostředkovatele dat Zprostředkovatele dat (data provider) je sada tříd ADO.NET, které umožňují přístup ke konkrétním databázi, vykonávat efektivně příkazy SQL a získávat, případně modifikovat data. Do tříd, z nichž se skládá každý zprostředkovatel dat patří: Connection umožňuje napojení se ke zdroji dat Command s jeho pomocí se vykonávají příkazy SQL případně se vyvolávají ke zpracování uložené procedury DataReader poskytuje rychlý přístup k datům získaným z dotazu. Data slouží pouze ke čtení a pouze směrem vpřed DataAdapter umožňuje naplnění objektu DataSet, který reprezentuje objekt sady dat (odpojena kolekce tabulek a relací), které jsme získali ze zdroje dat. Další vlastností je možnost promítnutí změn dat do zdroje dat Jednou z klíčových vlastností modelu ADO.NET je to, že je rozšiřitelný, tzn. Umožňuje pro patentované zdroje dat vytvářet své vlastní zprostředkovatele..net Framework je vybaven sadou 4 zprostředkovatelů: Data Provider pro MS SQL Server Data Provider pro OLE DB Data Provider Oracle Data Provider ODBC 90

91 Při vývoji databázové aplikace by jste se nejprve měli pokusit najít nativního data provideru.net, který je přizpůsoben vašemu zdroji dat. V případě, kdy není dostupný žádný nativní Data Provider, lze použít OLE DB Data Provider za předpokladu, že pro zdroj dat existuje ovladač OLE DB. V případě, kdy není dostupný ani OLE DB Data Provider, je možno použít ODBC provider, který pracuje v součinnosti s ovladačem ODBC Základní třídy ADO.NET ADO.NET obsahuje dva druhy objektů: Objekty založené na připojení jsou to objekty Data Providerů včetně objektů Connction, Command, DataAdapter, DataReader. Umožňují připojit se k databázi, vykonávat příkazy SQL, procházet sadu výsledných dat a naplnit objekt sady dat. Objekty založené na obsahu jsou pouze krabice na data. Patří sem objekty sady dat DataSet, datového sloupce DataColumn, datového řádku DataRow, datové relace DataRelation a několik dalších. Jsou zcela nezávislé na použitém zdroji dat a nacházejí se ve jmenném prostoru System.Data Třída Connection Třída Connection umožňuje připojení k datovému zdroji, se kterým chceme komunikovat. Definice připojení je základem jakékoliv datové komunikace. Při vytvoření objektu Connection je nutno vždy definovat připojovací řetězec (connection string), který je série nastavení název/hodnota, které jsou oddělený středníky. Nezáleží na pořadí nastavení ani na velikosti písmen. Všechny tyto nastavení představují základní inforamce, které jsou potřebné k vytvoření samotného přípojení. Connection string musí vždy obsahovat minimálně tyto informace: Server, kde sídlí databáze, ke které se chceme připojit Databáze, se kterou chceme pracovat Způsob, kterým databáze ověří vaši identitu 91

92 Definice připojovacího řetězce, který by jste použili pro připojení k lokální databázi Northwind prostřednictvím integrovaného zabezpečení (pro přihlášení se použije uživatel, který je aktuálně přihlášen do systému Windows): String connectionstring = Data Source=localhost; Initial Catalog=Northwind; Integrated Security=SSPI ; Jestliže nechcete využít integrovaného zabezpečení systému Windows, musí se pro připojení k databázi použít platné kombinace uživatelského jména a hesla. String connectionstring = Data Source=localhost; Initial Catalog=Northwind; user id=sa; password=opensame ; Pro efektivní strukturu aplikace není vhodné vkládat připojovací řetězec přímo do kódu. Vhodným místem pro ukládání připojovacích řetězců je sekce <connectionstrings> aplikačního konfiguračního souboru. Jakmile je definován připojovací řetězec, je správa připojení jednoduchá jednoduše spojení otevřete metodou Open() a po skončení datové komunikace spojení ukončíte Close(). String connectionstring = ConfigurationManager.ConnectionStrings[ Northwind ]; SqlConnection con = new SqlConnection(connectionString); try{ 92

93 con.open(); string version = con.serverversion; string connectionstate = con.state.tostring(); } catch(exception err) { Console.WriteLn(err.Message); } finally{ con.close(); } Třída SqlCommand Tato třída se používá pro vlastní provedení SQL dotazu nad databází specifikovanou třídou Connection. Pomocí této třídy je možno provádět nejen INSERT, UPDATE, DELETE, SELECT operace, ale také vyvolat zpracování uložené procedury. Třída System.Data.SqlClient je implementací třídy DBCommand specifická pro MS SQL Server Metoda ExecuteNonQuery Metoda ExecuteNonQuery se používá pro provedení SQL příkazů, jejichž výstupem není žádná množina dat. Je používána např. pro provádění INSERT, UPDATE a DELETE příkazů, u kterých nepředpokládáme žádnou návratovou hodnotu. Následující příklad demonstruje využití pro INSERT dat do databáze: SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); 93

94 SqlCommand cmd = new SqlCommand(); cmd.connection = cn; cmd.commandtype = CommandType.Text; cmd.commandtext = "INSERT INTO Person (FirstName, LastName) " + "VALUES ('Joe', 'Smith')"; cmd.executenonquery(); cn.close(); Všimněte si 3 základních vlastností třídy SqlCommand, které je nutno inicializovat před vlastním voláním metody ExecuteNonQuery. První z nich je vlastnost Connection, kterou je nutno nastavit pro správné připojení se k databázovému serveru. Druhou důležitou vlastností je specifikace, jaký tvar bude mít vlastní SQL příkaz vlatnost CommandType. Jestliže příkaz budete definovat přímo SQL příkazem v rámci zdrojového kódu, použijete stejně jako v předešlém příkladu nastavení CommandType.Text. Pokud budete chtít vyvolat zpracování uložené procedury, využijete nastavení CommandType.StoredProcedure, přičemž pokud definice uložené procedury obsahuje definici vstupních parametrů, musí SqlCommand obsahovat jejich definici. Jak postupovat v takovém případě demonstruje následující příklad. Mějme v rámci databáze MS SQL Serveru definovanou uloženou proceduru, pomocí níž se budou do databázové tabulky PERSON vkládat údaje o jménu a příjmení osoby. Uložená procedura bude mít název PersonInsert a je definována CREATE PROCEDURE varchar(50) AS BEGIN INSERT INTO PERSON (FirstName, LastName) VALUES END 94

95 Následující kód pak zajišťuje volání uložené procedury se vstupními SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); SqlCommand cmd = new SqlCommand(); cmd.connection = cn; cmd.commandtype = CommandType.StoredProcedure; cmd.commandtext = "PersonInsert"; cmd.parameters.add(new SqlParameter("@FirstName", "Joe")); cmd.parameters.add(new SqlParameter("@LastName", "Smith")); cmd.executenonquery(); Třída SqlCommand má vlastnost Parameters, kterou lze definovat vstupní parametry uložených procedur Metoda ExecuteReader Metoda ExecuteReader zlouží k získání výstupní množiny dotazovaných dat třídou SqlCommand. Výstupem volání této metody je objekt DBDataReader, v případě využít MS SQL Serveru se jedná SqlDataReader. Objekt DBDataReader představuje dopředně indexovanou výstupní množinu dat, vyžadující stále otevřené připojení k databázi při čtení výstupní množiny dat. Dopřednou indexací je myšleno takové chování, kdy čtení dat je umožněno pouze v postupných krocích. Není možná změna kurzoru nad aktuálními daty o několik kroků dopředu či opačným směrem, vždy pouze o následující krok. 95

96 Následující příklad demonstruje načtení dat o osobách a výpis jejich jmen a příjmení na obrazovku SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); SqlCommand cmd = new SqlCommand(); cmd.connection = cn; cmd.commandtype = CommandType.Text; cmd.commandtext = "SELECT * FROM Person"; SqlDataReader dr = cmd.executereader(); if (dr.hasrows) { while (dr.read()) { Debug.WriteLine(string.Format("First Name: {0}, Last Name: {1}", dr["firstname"], dr["lastname"])); } } dr.close(); cn.close(); Všimněte si, že po zpracování dat je nutno uzavřít práci s objektem DataReaderu a vlastním objektem pro práci s databázovým serverem Metoda ExecuteScalar Metoda ExecuteScalar se používá v případech, kdy víme, že výsledkem SQL dotazu bude obsahovat resultset s jedním sloupcem a řádkem. 96

97 Následující příklad vrací celkový počet záznamů databázové tabulky Person: SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); SqlCommand cmd = new SqlCommand(); cmd.connection = cn; cmd.commandtype = CommandType.Text; cmd.commandtext = "SELECT COUNT(*) FROM Person"; object obj = cmd.executescalar(); Debug.WriteLine(string.Format("Count: {0}", obj.tostring())); cn.close(); Metoda ExecuteScalar vždy vrací objekt, který je nutno konvertovat na správný datový typ, který požadujeme pro další zpracování v aplikační logice aplikace DataSet, DataTable a DataAdapter Další možností jak získat výslednou množinu dat je využití objetů DataSet a DataTable. Objekt DataTable je podobný objektu DBDataReader s tím rozdílem, že umožňující práci s daty v režimu uzavřeného spojení s databází. Dalším podstatným rozdílem je, že v rámci kurzoru množiny dat je možno pohybovat se oběma směry, jak dopředu, tak i o záznamy s indexem nižším než je aktuální. Podstatnou změnou oproti DBDataReaderu je možnost změny dat, obnovení spojení s databází a přenesení změn zpět do databáze. DataSet představuje kontejner pro jednu nebo více objektů DataTable. Pomocí objektu DataSet je možné provádět několik SQL příkazů a jejich výsledky si uložit do samostatných objektů DataTable. Následně je možné data v DataSetu filtrovat, řadit, upravovat. Všechny tyto operace se provádějí v paměti bez vazby na databázový server. DataAdapter je využíván pro naplnění DataSetu nebo DataTable objetů a následné obnovení připojení k databázi umožňující INSERT, UPDATE nebo DELETE modifikovaných dat. 97

98 Následující příklad využívá objektu DataSet, do kterého jsou načteny data z tabulky Person a následně jsou uživateli vypsány na obrazovku: SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Person", cn); DataSet ds = new DataSet(); da.fill(ds, "Person"); cn.close(); foreach (DataRow row in ds.tables[0].rows) { Debug.WriteLine(string.Format("First Name: {0}, Last Name: {1}", row["firstname"], row["lastname"])); } Pomocí SqlDataAdapteru je provededno získání dat z databáze a následné naplnění objektu DataSet daty voláním metody Fill. Všimněte si, že po volání metody Fill je spojení s databází ukončeno, nicméně objekt DataSet je stále použitelný pro práci s načtenými daty, což v případě DBDataReaderu možné není. Objekt DataSet obsahuje vlastnost Tables reprezentující referenci na objekty DataTable obsahující výsledek SQL dotazu. Každý objekt DataTable pak obsahuje vlastnost Rows obsahující kolekci DataRow objektů reprezentující konkrétní data pro jeden požadovaný záznam. Celkový počet nalezených záznamů specifikuje vlastnost Count. Jak již bylo zmíněno, DataAdapter umožňuje provádět operace INSERT, UPDATE, DELETE v rámci objektu DataTable. Následující příklad demonstruje tyto vlastnosti: 98

99 SqlConnection cn = new SqlConnection(); cn.connectionstring = "Server=myServerAddress;Database=myDataBase; User Id=myUsername;Password=myPassword;"; cn.open(); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Person", cn); //Create the insert command SqlCommand insert = new SqlCommand(); insert.connection = cn; insert.commandtype = CommandType.Text; insert.commandtext = "INSERT INTO Person (FirstName, LastName) VALUES //Create the parameters insert.parameters.add(new SqlParameter("@FirstName", SqlDbType.VarChar, 50, "FirstName")); insert.parameters.add(new SqlParameter("@LastName", SqlDbType.VarChar, 50, "LastName")); //Associate the insert command with the DataAdapter. da.insertcommand = insert; //Get the data. DataSet ds = new DataSet(); da.fill(ds, "Person"); //Add a new row. DataRow newrow = ds.tables[0].newrow(); newrow["firstname"] = "Jane"; newrow["lastname"] = "Doe"; ds.tables[0].rows.add(newrow); //Update the database. da.update(ds.tables[0]); cn.close(); 9.5 ADO.NET ENTITY FRAMEWORK Další možností.net Frameworku jak provádět základní datové operace INSERT, UPDATE, DELETE je vužití tříd ADO.NET Entity Frameworku. Entity Framework je přívětivější grafický interface, který umožňuje drag and drop metodikou umisťovat databázové objekty v rámci návrhové vrstvy. Obecně 99

100 se tento postup nazývá Object Relational Mapping tool neboli ORM. Na trhu existuje několik ORM nástrojů pro vývoj aplikací. Entity Framework společně s LINQ to SQL je integrován přímo do vývojového prostředí MS Visual Studia. Ve své podstatě jádro Entity Frameworku je model. ADO.NET Entity Framework provádí převod schématu relační databáze na objekty. Oproti předchozímu ADO.NET přístupu umožňuje ADO.NET Entity Framework přímo definovat třídy, které jsou nezávislé na databázové struktuře, přičemž definuje mapování těchto tříd do databázových tabulek a tak je asociuje s databází. Použitím takových objektů v rámci aplikace docílíme odolnost aplikace proti změnám databáze. ADO.NET Entity Framework používá pro definici mapování databázových tabulek na objekty několik úrovní. První úrovní je vlastní vytvoření databázového modelu, následující je definice entitních tříd a poslední úrovní je vlastní mapování entitní vrstvy s databázovým modelem. Obecně jsou tyto vrstvy definovány jako: Logický model definuje relační databázový model (SSDL) Konceptuální model definice.net tříd entit (CSDL) Mapovací model zajišťuje mapování.net tříd na relační databázové tabulky včetně asociací (MSL) Jádrem práce s ADO.NET Frameworkem je model. Následujícím postupem vytvoříme takovýto model ukázkové databáze Northwinds: 1. Spustíme Visual Studio Ze startovací nabídky zvolíme položku New Project 3. Zvolíme šablonu pro vytvoření projektu Console Application 4. Projekt nazveme například NorthwindsConsole 5. Do vytvořeného projektu je nutno přidat reference na potřebné knihovny Entity Frameworku 100

101 a. Otevřete ve Visual Studiu okno Paqckage Manager Console (Tools > NuGet Package Manager > Package Manager Console b. Ujistěte se, že v jeho horní části v rozbalovacím seznamu Default project je vybrán správný projekt (NorthwindsConsole) c. Obrázek 12 Rozhraní NuGet Package konzole d. Zadejte následující příkaz install package EntityFramework, kterým nainstalujete balíček s Entity Frameworkem do vašeho projektu Obrázek 13 Přidání Entity Frameworku do projektu 6. V Solution Exploreru pravým klikem vyvoláme nabídku, ve které zvolíme položku Add a následně zvolíme položku New Item 7. Z instalovaných template vybereme, že budeme chtít vytvořit ADO.NET Entity Data Model 8. Změníme název např. na NorthwindsModel a stiskneme tlačítko Add. Zobrazí se nám Entity Data Model Wizard 101

102 Obrázek 14 Vytvoření Entity Framework datového modelu 9. Protože budeme vytvářet model nad existující databází, zvolíme variantu Generate from Database. Tento postup je také nazýván v terminologii Entity Frameworku jako Database First přístup. Alternativou je Model First, který postupuje opačným směrem, kdy se nejdříve vytvářejí všechny třídy a následně se generuje z těchto tříd databázový model. 10. Klikněte na tlačítko Next. Na následující stránce je nutno definovat databázové připojení. 11. Klikněte na tlačítko New Connection, zobrazí se dialog pro definici připojení 12. Zvolte název databázového serveru, na kterém se databáze Northwind nachází. 13. Zvolte typ autentikace k databázovému serveru. Na výběr máte dvě možnosti Windows Authentication nebo SQL Server Authentication, u které je nutno zadat validní SQL přihlašovací jméno a heslo 14. Zadejte nebo zvolte ze seznamu název databáze v našem případě Nothwind 102

103 Obrázek 15 Definice databázového připojení v rámci Entity Data Model Wizardu prostření MS Visual Studia 103

104 15. Zmáčkněte tlačítko OK, který Vás vrátí zpět do wizardu vytvoření Entity Data Modelu. Defaultně je právě nastavené databázové připojení uloženo do app.config souboru Vaši aplikace. 16. V následujícím kroku máte možnost výběru databázových objektů, které chcete modelem mapovat. Zvolte položky Tables, Views a Stored Procedures. Ostatní nastavení nechte zachovány. Klikněte na tlačítko Finish. Entity Data Model Wizard automaticky vygeneruje model: Obrázek 16 Vygenerovaný Entity Data Model Všimněte si také, že do vašeho projektu byl přidán soubor NorthwindsModel.edmx. Tento soubor je grafickou reprezentací všech tříd, které byly vymodelovány a reprezentují všechny objekty 104

105 dané databáze. Ve své podstatě se jedná o XML definici, která obsahuje všechny vrstvy SSDL, CSDL i MSL. Rozklikněte položky, které jsou sdruženy v rámci soubory NorthwindsModel.edmx. Zaměřme se na soubor NorthwindsModel.tt. Ten představuje tzv. Text Transformation Template Toolkit soubor, nazýván také jako T4 šablona. T4 šablona se používá pro automatickou generaci kódu v rámci Visual Studia. T4 šablona je mix textových bloků a řídících příkazů, které slouží ke generaci zdrojových kódů. Pod souborem NorthwindsModel.tt je sdruženo několik zdrojových souborů, které byly vygenerovány touto šablonou. Pro každou tabulku, view, uloženou proceduru je vytvořen samostatný soubor. Otevřete si např. soubor Category.cs, který obsahuje třídu mapující databázovou tabulku Category v databázi Northwinds. Každá vlastnost této třídy odpovídá sloupci databázové tabulky. Mimo jiné si všimněte vlastnosti nazvanou Products, která je definována datovým typem ICollection<Product>. Důvodem této definice vazby databázové tabulky Products s tabulkou Category pomoci definice cizího klíče. Díky této vazbě může mít kategorie vazbu na několik produktů. Všechny tyto vazby Entity Framework Wizard vyhodnocuje z vás na pozadí, z čeho plyne důraz na vlastní návrh databázového modelu s definicí všech nutných vazeb Dotazování dat pomocí Entity Frameworku Jestliže máme takto připraven model, můžeme bez jakékoliv znalosti SQL jazyka načítat data z databáze. Následující příklad načte záznamy z databázové tabulky Category a vypíše je na obrazovku. using (NorthwindsEntities db = new NorthwindsEntities()) { var categories = from c in db.categories select c; foreach (Category category in categories) { Debug.WriteLine(string.Format("CategoryId: {0}, CategoryName: {1}", category.categoryid, 105

106 } } category.categoryname)); Výsledkem je výpis: CategoryId: 1, CategoryName: Beverages CategoryId: 2, CategoryName: Condiments CategoryId: 3, CategoryName: Confections CategoryId: 4, CategoryName: Dairy Products CategoryId: 5, CategoryName: Grains/Cereals CategoryId: 6, CategoryName: Meat/Poultry CategoryId: 7, CategoryName: Produce CategoryId: 8, CategoryName: Seafood Jak je vidět, bez definice SQL dotazu, jen pomocí Entity Frameworku a sestavení LINQ dotazu jsme získali data z databáze. Veškeré příkazy byly sestaveny a zkompilovány pomocí syntaxe programovacího jazyka C#. Následující příklad demonstruje, jak vytvořit LINQ dotaz pro načtení dat, které obsahuje vazbu dvou tabulek. 106

107 using (NorthwindsEntities db = new NorthwindsEntities()) { var products = from c in db.categories join p in db.products on c.categoryid equals p.categoryid select p; foreach (Product product in products) { Debug.WriteLine(string.Format("ProductName: {0}, CategorName: {1}", product.productname, product.category.categoryname)); } V tomto případě se kromě informací o kategoriích vypisují informace o produktech dané kategorie. Na základě definice cizího klíče Entity Framework správně stanovuje vazbu mezi třídami Product a Category Vytváření nových záznamů Přidávání dat pomocí Entity Frameworku je velice snadné. Proncip je založen na vytvoření nové instance třídy a nastavení její vlastností. Tato instance je přidána k databázovému kontextu a metodou SaveChanges() je nový záznam přidán do databáze. Jak vidíte, tento postup opět nevyžadoval definici jakéhokoliv SQL skriptu. Celý postup je demonstrován na následujícím příkladu, kdy chceme do databáze vložit záznam o nové kategorii. 107

108 using (NorthwindsEntities db = new NorthwindsEntities()) { Category category = new Category() { CategoryName = "Alcohol", Description = "Happy Beverages" }; db.categories.add(category); db.savechanges(); } Změna dat Změna záznamů pomocí Entity Frameworku obdobně jako v předešlém případě je triviální záležitostí. Oproti vkládání dat se nevytváří nová instance třídy, ale načte se ta, jejíž vlastnosti chceme změnit. Opět příkazem SaveChanges záznam uložíme. Postup změny popisu existující kategorie demonstruje následující příklad. using (NorthwindsEntities db = new NorthwindsEntities()) { Category category = db.categories.first(c => c.categoryname == "Alcohol"); category.description = "Happy People"; db.savechanges(); } 108

109 9.5.4 Mazání záznamů Mazání dat je podobný předchozí operaci na změnu dat, jediným rozdílem je, že záznam, který chceme smazat z databáze odstraníme z kontextu. Tuto operaci demonstruje následující příklad. using (NorthwindsEntities db = new NorthwindsEntities()) { Category category = db.categories.first(c => c.categoryname == "Alcohol"); db.categories.remove(category); db.savechanges(); } Volání uložených procedur v Entity Frameworku Jak bylo ukázáno v úvodu kapitolu 9.5, tak možností při vytváření modelu pomocí Entity Data Model Wizardu je zahrnutí i uložených procedur do nově vytvářeného modelu. Uložená procedura je tak spuštěna pouze voláním příslušné metody modelu. Následující příklad vyvolává uloženou proceduru CustOrderHist, jejíž vstupním parametrem je zákaznické ID a výsledkem volání je seznam všech objednávek daného zákazníka. using (NorthwindsEntities db = new NorthwindsEntities()) { var custorderhist = db.custorderhist("alfki"); 109

110 foreach (CustOrderHist_Result result in custorderhist) { Debug.WriteLine(string.Format("ProductName: {0}, Total: {1}", result.productname, result.total)); } } Shrnutí pojmů Wrapper, objektově relační mapování, DataReader, Command, Connection, DataAdapter, DataSet, DataColumn, DataRow, DataTable, ExecuteNonQuery, ExecuteReader, ExecuteScalar, LINQ, ADO.NET, Entity Framework, logický model, konceptuální model, mapovací model Otázky 1. Jaké jsou základní možnosti přístupu pro práci s relačními databázemi v prostředí MS.NET Framework? 2. Jaké jsou v.net možnosti připojení k databázi? 3. Jaký ADO.NET objekt je používán pro připojení k databázi? 4. Jaká metoda objektu Command nevrací po jejím provedení žádný záznam? 5. Jaký rozdíl je mezi objekty DataAdapter a DataSet? 6. V případě, kdy využíváte ADO.NET Entity Framework, vytváříte model reprezentující objekty v databázi. Jaká třída reprezentuje vytvořený model? 7. Jak je reprezentována uložená procedura v rámci ADO.NET Entity Frameworku? Použitá literatura [1] NAGEL CH., EVJEN, B., GLYNN, J., WATSON, K., SKINNER, M. Professional C# 2012 and.net 4.5. Místo vydání: John Wiley & Sons, Inc., [2] TROELSEN, A. Pro C# 5.0 and the.net 4.5 Framework. Místo vydání: Apress, 2013.

111 10 SOA SERVICE ORIENTED ARCHITECTURE. Čas ke studiu 1,5 hodiny Cíl Představení servisně orientované architektury. Definice základních vlastností této architektury. Výklad Zkratka SOA znamená v překladu z angličtiny architekturu orientovanou na služby. Službou zde myslíme něco, co poskytne přidanou hodnotu, v rámci firmy tedy jde o jasně definovanou podnikovou činnost jako například objednání zboží od dodavatele. V rámci aplikace to může být dílčí úkol, který je nutno splnit při obsluze uživatele. Jako příklad může posloužit aplikační mini modul, jenž zaokrouhluje čísla zobrazující se uživateli jako výsledek výpočtu. Při správném návrhu aplikace orientované na služby lze poté tuto komponentu odpojit a zapojit jinou, která bude zaokrouhlovat odlišně, aniž bychom nějak zasahovali do zbytku aplikace. Jednotlivé komponenty lze zpravidla různě kombinovat, doplňovat, případně nahrazovat jednu za druhou. Tímto přístupem se prvky v systému stávají samostatnými, systém je tedy stabilnější a také je zde výhodné rozložení zátěže na více komponent. Při výpadku jedné komponenty může být nahrazena jinou, funkční. Systém se pak lépe spravuje (při poruše komponenty lze jednoznačně určit, kde se vyskytla chyba), ale také vylepšuje, jelikož je potřeba zasahovat jen do určité komponenty a ne do celého systému. Při dodržení principů SOA ve fázi návrhu lze výsledný systém přirovnat ke známé stavebnici Lego, jejíž součásti představují jednotlivé komponenty. Dokud se psaly desktopové aplikace, bylo to většinou pro určitou platformu, navíc vývojáři byli specializováni na svůj programovací jazyk, ve kterém byla celá aplikace realizována. V této době také vznikl a vyvinul se až do současné podoby objektově orientovaný přístup ve tvorbě IT systémů. Jelikož byl celý systém provozován na jedné platformě, stačilo pro komunikaci s okolím definovat hranice systému pomocí API dané technologie. Na toto API se poté případně napojovaly další systémy či komponenty. V současné době je již situace odlišná. Objektový přístup při návrhu a tvorbě informačních systémů sice zůstal, změnily se ale požadavky na hranice vyvíjených systémů. Dnes systémy, aby se uplatnily na trhu, musí komunikovat i mezi různými verzemi, platformami apod., nestačí tedy definovat API jedné technologie. Pryč je také doba, kdy se vývojáři specializovali na jednu jedinou technologii. Důvodem těchto změn je bezesporu snaha o kompletní pokrytí business procesů informačními systémy, čehož je dosahováno jen kombinací několika technologií. Tyto aspekty a některé další se zapříčinily k prudkému rozvoji SOA přístupu, kdy se hranice systému definují prostřednictvím specifikovaného formátu předávaných dat, které daná služba produkuje či přijímá. V současnosti v drtivé většině případů ke specifikaci přenášených dat dochází prostřednictvím formátu XML, jelikož je velmi dobře strojově čitelný. Dalším důležitým krokem k rozšíření využití SOA bylo zavedení popisu existujících služeb. Každou již existující službu lze vystavit světu pomocí strojem

112 čitelného XML kódu jazyka WSDL (web service description language). Tento jazyk popisuje, jak lze službu volat, jaká data vrací a v jakém formátu PRINCIPY SOA Standardizovaný kontrakt služby Servisní kontrakt poskytované služby je jasně definovaný. Proto je již při návrhu SOA komponenty třeba zvážit technické rozhraní a formát dat, který bude služba přijímat/odesílat. Kontrakt je brán jako slib dané služby svému okolí, co bude poskytovat Slabé vazby mezi komponentami Vazby mezi jednotlivými komponentami při návrhu SOA mají být co nejtenčí. Tento princip spočívá v tom, že jsou závislosti dodefinovány těsně před použitím a navíc externě, tedy mimo vyvinutou službu, čímž se redukuje závislost kontraktu služby, její implementační logiky a konzumentů Princip abstrakce Jeho úkolem je co nejvíce skrýt implementační detaily služby/komponenty Znovupoužití Při návrhu jakékoliv služby či komponenty by se mělo počítat s jejím využitím i jinde, než pro aktuální projekt, čímž se maximalizuje použitelnost vyvíjené části Nezávislost Aby mohla služba zajistit správné fungování, tedy dodržení definovaného kontraktu, musí v sobě obsahovat vnitřní nezávislou logiku pro správu zdrojů, ze kterých čerpá. Zajištění nezávislost komponenty/služby je důležité pro umožnění principu znovupoužití Bezstavovost Princip bezstavovosti se začal promítat do návrhů systémů s rozvojem podnikových systémů, které obsluhují velký počet uživatelů. Bezstavovost v tomto případě přímo umožňuje znovupoužití, protože komponenty, které si nepamatují stav lze bez jakýchkoliv inicializačních požadavků okamžitě využít i jinde. Tento princip zajišťuje také větší možnosti škálovatelnosti systému v budoucnu Princip identifikovatelnosti Tento princip má spíše své ekonomické opodstatnění. Služba, která je lehce identifikovatelná, jakožto je lehce zjistitelný i způsob jejího použití, má obrovskou výhodu na trhu. Identifikovatelnost v SOA je zajištěna WSDL jazykem Princip skládání V SOA je tímto principem zajištěno možné seskládání jednotlivých služeb a zajištění jejich vzájemné synergie. Kromě již zmiňovaných výhod postupného složení nezávislých komponent/služeb, jde navíc ruku v ruce s odvěkým pravidlem pro řešení komplexních problémů. A sice jejich rozložení na malé, lehce řešitelné podproblémy. Jednotlivá řešení jsou potom seskládána do výsledného systému tak, aby dokázaly zvládnout komplexní problém.

113 Shrnutí pojmů SOA, kontrakt, abstrakce, nezávislost, bezstavovost, identifikovatelnost Otázky 1. Vysvětlete pojem SOA? 2. Jaké jsou základní principy této architektury? Použitá literatura [1] PATHAK, N. Pro WCF 4, Practical Microsoft SOA Implementation. Místo vydání: Apress, 2010 [2] TROELSEN, A. Pro C# 5.0 and the.net 4.5 Framework. Místo vydání: Apress, 2013.

114 11 WCF TVORBA DISTRIBUOVANÝCH SYSTÉMU V PROSTŘEDÍ.NET. Čas ke studiu 1 hodina Cíl Seznámení se s konceptem tvorby distribuovaných systému v prostředí.net Výklad Windows Communication Foundation (WCF) je jednotná architektura pro vytváření bezpečných, spolehlivých, s podporou transakcí a interoperabilních distribuovaných aplikací. Existuje několik technologií, které mohly být využity pro komunikaci mezi aplikacemi. Pokud jste chtěli sdílet informace tak, aby byly povoleny k přístupu z libovolné platformy, použili byste webovou službu (označovanou také jako ASMX webová služba). Pokud jste chtěli pouze přesunout data mezi klientem a serverem, kteří byli spuštěni v operačním systému Windows, použili by jste.net Remoting. Pokud jste chtěli transakční komunikaci, použili byste Enterprise Services (DCOM) nebo pokud jste chtěli model ve frontě, použili byste službu Řízení front zpráv (také známo jako služba MSMQ). WCF spojuje funkce všech těchto technologií v rámci jednotného programovacího modelu. To zjednodušuje možnosti vývoje distribuovaných aplikací. WCF Data Services jsou služby, které spolupracují přímo s databází. Proto jsou WCF Data Services vhodné pro aplikace, které slouží k vytvoření, aktualizaci nebo odstranění záznamů v databázi. WCF. Model programování WCF je založen na komunikaci mezi dvěma subjekty: klient WCF a službou Služba WCF je tedy založena na rozhraní, které definuje kontrakt mezi klientem a službou. Je označeno atributem ServiceContractAttribute, jak je ukázáno v následujícím kódu: [ServiceContract] public interface IService1 [OperationContract]

115 string GetData(string value); Definujete li funkce nebo metody, které jsou vystaveny službou WCF jejich označením atributem OperationContractAttribute. Navíc můžete vystavit serializovaná data označením složeného typu atributem DataContractAttribute. Toto umožňuje vázání dat v klientovi. Potom, co jsou rozhraní a jeho metody definovány, jsou zapouzdřeny ve třídě, která implementuje rozhraní. Jediná třída služby WCF může implementovat více kontraktů služby. Služba WCF je vystavena pro užívání prostřednictvím toho, co se nazývá koncový bod. Koncový bod poskytuje jediný způsob, jak lze komunikovat se službou; nelze získat přístup k službě prostřednictvím přímého odkazu, jako byste to udělali s jinými třídami. Koncový bod se skládá z adresy, vazby a kontraktu. Adresa definuje, kde je služba umístěna; to by mohla být adresa URL, adresa protokolu FTP, síťová nebo místní cesta. Vazba definuje způsob, jakým komunikujete se službou. Vazby WCF poskytují všestranný model pro určující protokol jako například protokol HTTP nebo protokol FTP, bezpečnostní mechanismus, jako je například ověřování systému Windows nebo uživatelské jména a hesla a mnohem více. Kontrakt obsahuje operace, které jsou vystaveny třídou služby WCF. Více koncových bodů může být vystaveno jedinou službou WCF. To umožňuje různým klientům komunikovat různými způsoby se stejnou službou. Bankovní služba může například poskytnout jeden koncový bod pro zaměstnance a jiný pro externí zákazníky, každý pomocí jiné adresy, vazby a/nebo kontraktu. Klient WCF se skládá z proxy serveru, která umožňuje aplikaci komunikovat se službou WCF a koncového bodu, který odpovídá koncovému bodu definovanému pro službu. Proxy server je generován na straně klienta v souboru app.config a obsahuje informace o typech a metodách, které jsou vystaveny službou. Pro služby, které vystavují více koncových bodů může klient vybrat ten, který nejlépe vyhovuje jeho potřebám, například pro komunikaci přes protokol HTTP a použití ověřování systému Windows. Po vytvoření klienta WCF odkazujete na službu ve svém kódu stejným způsobem jako libovolný jiný objekt. Chcete li například volat metodu GetData, jak bylo ukázáno dříve, zapsali byste kód podobný následujícímu: private void button1_click(system.object sender, System.EventArgs e) { ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); string returnstring; returnstring = client.getdata(textbox1.text); label1.text = returnstring;

116 } 11.1 VÝBĚR KONCOVÉHO BODU SLUŽBY Některé služby Windows Communication Foundation (WCF) vystavují více koncových bodů, přes které klient může komunikovat se službou. Například služba může vystavit jeden koncový bod, který používá vazbu HTTP a zabezpečení uživatelské jméno / heslo a druhý koncový bod používající ověřování systému Windows protokolu FTP. První koncový bod se může používat aplikacemi, které přistupují ke službě mimo bránu firewall, vzhledem k tomu, že druhý může být používaný v síti intranet. V takovém případě můžete určit endpointconfigurationname jako parametr do konstruktoru pro službu. Shrnutí pojmů WCF, ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, koncový bod Otázky 1. Jaká je základní charakteristika technologie WCF? 2. Jaká je základní deklarace WCF služby? 3. Popište možnosti definic koncových bodů WCF služby? Použitá literatura [1] PATHAK, N. Pro WCF 4, Practical Microsoft SOA Implementation. Místo vydání: Apress, 2010 [2] TROELSEN, A. Pro C# 5.0 and the.net 4.5 Framework. Místo vydání: Apress, 2013.

117 12 ASP.NET WEBOVÉ TECHNOLOGIE PRO PREZENTACI DAT Čas ke studiu 2 hodiny Cíl Představení technologie ASP.NET, porovnání vlastností technologie s dalšími používanými pro tvorbu webových aplikací. Výklad ASP.NET je webový framework, stručně řečeno se jedná o sadu knihoven, které umožňují tvorbu webových aplikací v jazyce C#. Knihovny obsahují hotová řešení mnoha základních problémů, které ve webových technologiích vyvstávají. Mám na mysli např. bezpečnost, autentifikace uživatele, práce s databází, správa formulářů a podobně. ASP tedy není programovací jazyk, programovat budeme v C# a budete tedy potřebovat základní znalosti tohoto jazyka ZÁKLADNÍ PRINCIPY ASP.NET Technologie je založena na architektuře klient server. Aplikace v ASP.NET je tedy program, jehož výstupem je HTML stránka. ASP běží na straně serveru. Abychom lépe pochopili, jak ASP funguje, ukažme si nejprve obyčejný statický web Statický web (bez ASP.NET) V případě statického webu jsou HTML stránky jednoduše uložené na serveru. Jakmile klient (uživatel s prohlížečem) pošle požadavek na server, server mu jednoduše vrátí přesně ty stránky, co má uložené. Graficky vypadá komunikace asi nějak takto: Obrázek 17 Princip statických HTML stránek

118 Dynamický web (s ASP.NET) Statický web se těžko spravuje a má velká omezení. Proto začaly vznikat serverové jazyky, které umožňují HTML stránku ještě pozměnit předtím, než je klientovi odeslána. Lze tak vytvořit aktivní prvky, jako např. diskuzní fóra, přihlašování uživatelů, nahrávání obsahu pomocí editoru a podobně. ASP.NET tedy běží na serveru, na základě požadavků od klienta vygeneruje webovou stránku a pošle ji klientovi. Ten vidí už jenom výsledné HTML, ve kterém není po ASP.NET ani památky (tedy kromě toho, že stránka má koncovku.aspx a ne.htm). Graficky by situace vypadala takto: Obrázek 19 Princip dynamických webových aplikací Mezi C# a konkurenčním PHP jsou obrovské rozdíly. Zatímco PHP je dynamický jazyk, C# je silně typovaný. Jak se ukázalo, tak takový jazyk může být výhodný i pro web. Velkou výhodou je možnost použití.net frameworku, který se na serveru hodí, protože obsahuje mnoho užitečných knihoven a funkcí. ASP je pro upřesnění jedna ze součástí.net frameworku. ASP.NET běží na serveru IIS (Internet Information Services) a teoreticky může běžet i na webserveru Apache jako modul (podobně jako PHP WEBFORMS VS. MVC Microsoft nám nabízí 2 hlavní způsoby, jak webové stránky vytvářet, jsou to WebForms a MVC. Oba jsou zajímavé a oba se dívají na webovou aplikaci trochu jinak WebForms WebForms je pokus přenést WinForms (tedy standardní formulářové/okenní aplikace, jak je známe z desktopu) na web. Idea je jednoduše v designeru poskládat formulář z kontrolek z toolboxu (tlačítka, popisky, textová pole atd.) a těmto kontrolkám (controls) přiřadit události. Aplikace se navenek chová jako desktopová, ale na pozadí je složitější logika. Úkol nasimulovat desktopovou aplikaci na webu je poněkud nelehký a to z toho důvodu, že protokol HTTP je bezstavový. Stavem se myslí např. vyplněné hodnoty v polích, zaškrtnuté checkboxy, vybrané datum v kalendáři a podobně. Server vůbec neví, v jakém stavu je aplikace, pouze k němu přijde nějaký požadavek od uživatele a on na jeho základě generuje HTML stránky. Po odeslání stránky klientovi

119 většina informací na serveru zaniká. Představme si, že ve formuláři něco vyplníme, zaškrtneme a stránku odešleme. V nové stránce většinou chceme, aby zůstaly tyto hodnoty vyplněné, zvláště tehdy, když se jedná o ten samý formulář. Stav formuláře se tedy musí někde udržovat, v ASP.NET je to řešeno pomocí tzv. ViewState. ViewState není nic jiného, než skryté formulářové pole, které na výsledné HTML stránce uchovává stav aplikace a odešle ho s dalším dotazem serveru, který u sebe zrestauruje stav aplikace, jaký měla předtím, provede nějakou akci a opět vygeneruje ViewState a stav zapomene. Toto se na pozadí opakuje a klient (a většinou i programátor) mají pocit, že pracují s desktopovou aplikací. Výhodou je obrovská rychlost tvorby zejména aplikací, kde je hodně formulářů. Nevýhodou je samozřejmě zvýšená velikost HTML stránky kvůli odesílání ViewState a poněkud komplikovanější architektura MVC MVC je novější koncept a jde na celou věc jinak. Rozděluje webovou aplikaci do komponent 3 typů: Kontrolery, Modely a Pohledy (Model View Controller). Kontroler je řídící komponenta, která přijme data od uživatele a komunikuje s modelem. Model obsahuje logiku, pracuje s databází a podobně. Data od modelu předá kontroler pohledu. Pohled je vlastně šablonou, do které se data vloží a vznikne výsledná HTML stránka. Jednoduše řečeno, cílem konceptu je zpřehlednit architekturu webu a rozdělit ho na 2 části Logiku a Výstup. Kontroler poté tyto 2 části propojuje. Ačkoli to tak může vypadat, MVC není náhradou WebForms, je to pouze další alternativa jak web tvořit a jsou situace, kdy je WebForms výhodnější. MVC se tu budeme také věnovat JAK SE V ASP.NET PROGRAMUJE? Již víme, že WebForms se snaží přiblížit co nejvíce technologii desktopových aplikací WinForms. Každá dynamická stránka webové aplikace tak definuje Web Form. Tento Web Form obsahuje HTML resp. XHTML strukturu definující základní vzhled klientského rozhraní. XHTML se příliš od HTML neliší až na nutnost uzavírat stejně jako v případě XML formátu párové tagy. Hlavním elementem stránky je formulář Form. Právě na těchto formulářích je celé Web Forms postaveno. Následující příklad ukazuje, jak vytvořit prázdný Web Form v prostředí MS Visual Studia. Vytvoříme webovou aplikaci, která bude obsahovat jednoduchý vyhledávácí formulář pro nalezení produktů podle definovaných kategorií a názvu produktu. K tomuto účelu využijeme technologii Entity Framework popisovanou v kapitole Inicializace projektu Začneme založením nového projektu ve Visual Studio. Ze seznamu nainstalovaných projektových template zvolíme template pro ASP.NET aplikace.

120 Obrázek 20 Vytvoření projektu webové aplikace v prostředí MS Visual Studio Jakmile dialog potvrdíme, zobrazí se další s výběrem template. Template je předgenerovaná struktura projektu. Pro naše účely začneme s prázdným projektem, a proto vybereme Empty template. Obrázek 21 Výběr template webové aplikace v prostředí MS Visual Studio

121 Tímto se nám vygenerovala struktura projektu webové aplikace, do které nyní můžeme přidávat definice jednotlivých Web Formů Přidání Web Formu do webového projektu Stránku přidáme volbou položky Add New Item, otevře se nám opět dialog s definovanými šablonami položek, které máme možnost do projektu přidat. Zvolíme možnost Web Form, kde nově přidávanou stránku nazveme Default.aspx Obrázek 22 Seznam vzorů přidávaných projektových položek webové aplikace Název Default.aspx je standard pro definici stránky, která se nám otevře, když vstoupíme na hlavní stránku webu. Jiné technologie podobně pojmenovávají výchozí stránku index. Visual Studio nám vygeneruje novou webovou stránku Default.aspx s následujícím obsahem: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="NorthwindsWeb.Default" %> <!DOCTYPE html> <html xmlns=" <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server">

122 <div> </div> </form> </body> </html> Na stránce vidíme jednoduchou HTML strukturu s jediným elementem, kterým je formulář, který je pro webové aplikace ASP.NET stěžejní. Atribut runat= server označuje, že se HTML element zpracovává na serveru, jinak by ho ASP.NET ignorovalo a bralo by ho jako obyčejný HTML form. Na začátku dokumentu se nachází direktiva <%, která je jakási hlavička pro serverovou část webu. Určuje, jak má s dokumentem ASP.NET zacházet. Stránce se nastavuje programovací jazyk C# a tzv. CodeBehind, což je podobně jako u WinForms C# kód, který formulář obsluhuje Definice klientského vzhledu Web Formu Nyní je nutno definovat klientské rozhraní WebFormu. Je nutno do vytvořeného formuláře vložit ovládací prvky, které umožní uživateli webové aplikace definovat vstupní parametry, které se předají aplikační logice a v neposlední řadě by měla webová aplikace prezentovat na této stránce výstupní data, která uživatel vyžaduje. Visual Studio pro tyto účely obsahuje Design mód, což je grafický editor, přes který můžeme jednoduše měnit obsah stránky a přidávat nové ovládací prvky. V dolní části stránky naleznete tlačítko pro přepnutí do design módu. Obrázek 23 Tlačítko pro přepnutí do design módu Web Formu Po přepnutí do design módu se zobrazí Toolbox s nabídkou základních ovládacích prvků, které můžeme do formuláře umístit.

123 Obrázek 24 Toolbox se základními ovládacími prvky Web Formu Požadujeme vytvořit webový formulář pro vyhledání sortimentu podle dvou možných vstupních hodnot kategorie nebo názvu sortimentu. Proto si do formuláře z Toolboxu přetáhneme ovládací prvky Label, TextBox, DropDownList a Button. Pomocí těchto ovládacích prvků vytvoříme vyhledávací formulář. Obrázek 25 Základní struktura vyhledávacího formuláře V rámci práce s.net Frameworkem již víte, že všechny jeho charakteristiky vycházejí z objektového programování a u ovládacích prvků tomu není jinak. Každý ovládací prvek je

124 reprezentován příslušnou třídou s definovanými atributy a metodami. V design módu můžete tyto atributy snadno nastavit v okně Properties. Obrázek 26 Nastavení atributů ovládacího prvku webového formuláře Výsledná definice webového formuláře může mít například tento tvar: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="NorthwindsWeb.Default" %> <!DOCTYPE html> <html xmlns=" <head runat="server"> <title>northwind Search Web Application</title> <style> body { font-family:verdana; font-size:12px; }

125 </style> </head> <body> <form id="form1" runat="server"> <div style="text-align:center"> <table style="border: 0;padding: 0;border-spacing: 0;width: 50%"> <tr> <td> <asp:label ID="Label1" runat="server" Text="Kategorie: "></asp:label> <asp:dropdownlist ID="sCategories" runat="server"> </asp:dropdownlist> </td> <td> <asp:label ID="Label2" runat="server" Text="Název sortimentu: "></asp:label> <asp:textbox ID="tName" runat="server"></asp:textbox> </td> <td> <asp:button ID="bSearch" runat="server" Text="Vyhledat" /></td> </tr> </table> </div> </form> </body> </html> Definice aplikační logiky Stejně jak v desktopových aplikacích budeme oddělovat prezentační vrstvu od té logické, tzn. Výpočty, práce s databází a podobné úkony budou přehledné v samostatných třídách. Nejprve je nutno vytvořit třídu, která by nám z databáze dokázala načíst informace o existujících kategoriích a byli bychom tak schopni naplnit tímto seznamem ovládací prvek scategories. Vytvořme tedy samostatnou třídy CategoriesService pro práci s kategoriemi. Tato třída bude obsahovat veřejnou metodu LoadCategories načítající z databáze seznam kategorií. Tato třída může být definována např. jako: using System.Collections.Generic; using System.Linq; using NorthwindsWeb.Models; namespace NorthwindsWeb.Services { public class CategoriesService { public List<Categories> LoadCategories()

126 { using (Models.NORTHWNDEntities db = new NORTHWNDEntities()) { var categories = from c in db.categories select c; return categories.tolist(); } } } } V rámci definice této třídy jsme použili pro načtení dat Entity Framework. Nyní v aplikační logice stránky Default.aspx vytvořme privátní metodu initializecontrols, která bude plnit položky ovládacího prvku DropDown, které budou prezentovat jednotlivé kategorie uložené v databázi. Tvar této metody může být následující: private void initializecontrols() { CategoriesService categoriesservice = new CategoriesService(); scategories.datasource = categoriesservice.loadcategories(); scategories.datatextfield = "CategoryName"; scategories.datavaluefield = "CategoryID"; scategories.databind(); } Všimněte si opět objektového přístupu v nastavení ovládacího prvku DropDownList scategories. Tento objekt obsahuje atributy: DataSource specifikuje kolekci dat, která se mají zobrazit DataTextFiled atribut specifikující, který atribut vstupních dat bude prezentován uživateli DataValueFiled atribut spesifikující datovou hodnotu prvku seznamu. Jeho uplatnění si představíme později Nyní musíme metodu initializecontrols na vhodném místě životního cyklu webové stránky vyvolat. Tímto místem je metoda reprezentující obsluhu události načtení stránky Page_Load, která je volána při každém volání stránky včetně PostBack operace. protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { initializecontrols(); }

127 } Všimněte si, že jsem volání metody initializecontrols podmínili podmínkou!page.ispostback, což je základní událost dynamické stránky, kdy je na server odeslán požadavek na znovunačtení stránky po změně stavu nějakého ovládacího prvku, při kterém dojde ke změně ViewState. Tímto jsme docílili naplnění ovládacího prvku scategories. Obrázek 27 Naplnění ovládacího prvku daty Nyní máme připraveny všechny ovládací prvky pro zadání vstupních údajů. Nyní nám chybí realizace vlastního filtrování sortimentu podle vstupních parametrů a zobrazení výsledku. Vytvořme tedy třídu ProductsService, která bude obsahovat aplikační logiku pro vyhledání sortimentu. Může být definována např. jako: using System; using System.Collections.Generic; using System.Linq; using NorthwindsWeb.Models; namespace NorthwindsWeb.Services { public class ProductsService { public List<Products> Search(int CategoryID, string ProductNameCondition) { using (Models.NORTHWNDEntities db = new NORTHWNDEntities()) { var products = (String.IsNullOrEmpty(ProductNameCondition))? db.products.where(p => p.categoryid == CategoryID) :db.products.where(p => p.categoryid == CategoryID && p.productname.contains(productnamecondition)); return products.tolist(); } } } }

128 Metodu Search třídy ProductsService vyvoláme vždy po stisknutí tlačítka Vyhledat. Je nutné tedy definovat obsluhu události stisknutí tlačítka na webovém formuláři. Definici této obsluhy vyvoláme dvojklikem na ovládací prvku bsearch v design módu webového formuláře. Může mít následující tvar: protected void bsearch_click(object sender, EventArgs e) { ProductsService productsservice = new ProductsService(); List<Products> products = productsservice.search(convert.toint32(scategories.selectedvalue), tname.text); } Všimněte si, že metodě Search jsme jako vstupní parametry předali hodnoty atributů SelectedValue ovládacího prvku DropDownList scategories a Text ovládacího prvku TextBox tname. Výsledkem metody Search je seznam produktů, který je nutno vhodným způsobem zobrazit. Nabízí se několik variant zobrazení. My zvolíme tu nejjednodušší a to výpis do ovládacího prvku GridView sloužící k účelům prezentace dat. Do WebFormu tedy přidání daný ovládací prvek: <tr> <td colspan="3"> <asp:gridview ID="gResult" runat="server"></asp:gridview> </td> </tr> Obsluhu události kliku na tlačítko bsearch doplníme o naplnění nového ovládacího prvku výsledkem hledání sortimentů na základě vstupních parametrů. protected void bsearch_click(object sender, EventArgs e) { ProductsService productsservice = new ProductsService(); List<Products> products = productsservice.search(convert.toint32(scategories.selectedvalue), tname.text); gresult.datasource = products; gresult.databind(); } Nyní po zadání vstupních parametrů a kliknutí na tlačítko Vyhledat dojde k výpisu nalezených sortimentů.

129 Obrázek 28 Výsledek hledání podle vstupních parametrů Většinou vyžadujeme definici, jaké údaje se budou klientovi zobrazovat. Toho docílíme rozšířením definice sloupců ovládacího prvku GridView: <asp:gridview ID="gResult" runat="server" AutoGenerateColumns="False"> <Columns> <asp:boundfield HeaderText="Název sortimentu" DataField="ProductName" /> <asp:boundfield HeaderText="Množství v balení" DataField="QuantityPerUnit" /> <asp:boundfield HeaderText="Cena za kus" DataField="UnitPrice" /> <asp:boundfield HeaderText="Počet ks v balení" DataField="UnitsInStock" /> </Columns> </asp:gridview> Přidali jsme definici sloupců (atribut Columns), u kterých jsme definovali text záhlaví pomoci atributu HeaderText a položku vstupních dat, která bude v rámci tohoto sloupce zobrazována atribut DataField. Výsledný tvar uživatelského rozhraní znázorňuje obr. 29 a 30.

130 Obrázek 29 Výsledné klientské zobrazení sortimentu s filtrací podle kategorie Obrázek 30 Výsledné klientské zobrazení sortimentu s filtrací podle kategorie a názvu sortimentu Tímto jsme docílili funkční webové aplikace splňující naše požadavky. Jednalo se o velice jednoduchou webovou aplikace. Oblast technologie ASP.NET je však širší, nicméně její náročnost přesahuje cíle studijní oblasti. Shrnutí pojmů ASP.NET, statický web, dynamický web, WebForms, MVC, ViewState, kontroler, model, pohled, Form, HTML, CodeBehind, ovládací prvek, PostBack Otázky 1. K jakému účelu slouží ASP.NET? 2. Jaké jsou základní principy ASP.NET? 3. Jaké jsou rozdíly mezi WebForms a MVC?

Databázové systémy. Cvičení 6: SQL

Databázové systémy. Cvičení 6: SQL Databázové systémy Cvičení 6: SQL Co je SQL? SQL = Structured Query Language SQL je standardním (ANSI, ISO) textovým počítačovým jazykem SQL umožňuje jednoduchým způsobem přistupovat k datům v databázi

Více

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc. 1 Kurz Databáze Zpracování dat Doc. Ing. Radim Farana, CSc. Obsah Druhy dotazů, tvorba dotazu, prostředí QBE (Query by Example). Realizace základních relačních operací selekce, projekce a spojení. Agregace

Více

:20 1/13 Techniky T-SQL

:20 1/13 Techniky T-SQL 2016-04-09 05:20 1/13 Techniky T-SQL Techniky T-SQL Transact-SQL (T-SQL) je proprietární rozšíření pro SQL od společností Microsoft a Sybase. Microsoft tento jazyk pužívá ve svých produktech Microsoft

Více

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL 4 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah Jazyk SQL, datové typy, klauzule SELECT, WHERE, a ORDER BY. Doporučená

Více

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Návrh a tvorba WWW stránek 1/14. PHP a databáze Návrh a tvorba WWW stránek 1/14 PHP a databáze nejčastěji MySQL součástí balíčků PHP navíc podporuje standard ODBC PHP nemá žádné šablony pro práci s databází princip práce s databází je stále stejný opakované

Více

Databázové systémy. Doc.Ing.Miloš Koch,CSc. koch@fbm.vutbr.cz

Databázové systémy. Doc.Ing.Miloš Koch,CSc. koch@fbm.vutbr.cz Databázové systémy Doc.Ing.Miloš Koch,CSc. koch@fbm.vutbr.cz Vývoj databázových systémů Ukládání dat Aktualizace dat Vyhledávání dat Třídění dat Výpočty a agregace 60.-70. léta Program Komunikace Výpočty

Více

TEORIE ZPRACOVÁNÍ DAT

TEORIE ZPRACOVÁNÍ DAT Vysoká škola báňská - Technická univerzita Ostrava Fakulta elektrotechniky a informatiky TEORIE ZPRACOVÁNÍ DAT pro kombinované a distanční studium Jana Šarmanová Ostrava 2003 Jana Šarmanová, 2003 Fakulta

Více

Úvod do databázových systémů

Úvod do databázových systémů Vysoká škola báňská Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Úvod do databázových systémů Cvičení 8 Ing. Petr Lukáš petr.lukas@vsb.cz Ostrava, 2014 Opakování Entita Entitní typ

Více

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal Databázové systémy - SQL * definice dat * aktualizace * pohledy Tomáš Skopal Osnova přednášky definice dat definice (schémat) tabulek a integritních omezení CREATE TABLE změna definice schématu ALTER TABLE

Více

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek 5 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah Jazyk SQL, Spojení tabulek, agregační dotazy, jednoduché a složené

Více

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června 2007. krovacek@students.zcu.cz

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června 2007. krovacek@students.zcu.cz Databáze čajových sáčků Martina Málková Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky Databázové systémy 2 9. června 2007 krovacek@students.zcu.cz 1 1 Datová analýza V původním

Více

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE 2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE Studijní cíl Tento blok je věnován základní syntaxi příkazu SELECT, pojmům projekce a restrikce. Stručně zde budou představeny příkazy

Více

6. blok část B Vnořené dotazy

6. blok část B Vnořené dotazy 6. blok část B Vnořené dotazy Studijní cíl Tento blok je věnován práci s vnořenými dotazy. Popisuje rozdíl mezi korelovanými a nekorelovanými vnořenými dotazy a zobrazuje jejich použití. Doba nutná k nastudování

Více

Databáze SQL SELECT. David Hoksza http://siret.cz/hoksza

Databáze SQL SELECT. David Hoksza http://siret.cz/hoksza Databáze SQL SELECT David Hoksza http://siret.cz/hoksza Osnova Úvod do SQL Základní dotazování v SQL Cvičení základní dotazování v SQL Structured Query Language (SQL) SQL napodobuje jednoduché anglické

Více

KIV/ZIS cvičení 5. Tomáš Potužák

KIV/ZIS cvičení 5. Tomáš Potužák KIV/ZIS cvičení 5 Tomáš Potužák Úvod do SQL (1) SQL (Structured Query Language) je standardizovaný strukturovaný dotazovací jazyk pro práci s databází Veškeré operace v databázi se dají provádět pomocí

Více

Úvod do databázových systémů

Úvod do databázových systémů Vysoká škola báňská Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Katedra informatiky Database Research Group Úvod do databázových systémů Cvičení 3 Ing. Petr Lukáš petr.lukas@vsb.cz

Více

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd. PL/SQL Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd. Rozšířením jazyka SQL o proceduralitu od společnosti ORACLE je jazyk

Více

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id)) Vzorové příklady SQL Tabulka: Kniha CREATE TABLE kniha název VARCHAR(50, PRIMARY KEY (id Tabulka: Autoři CREATE TABLE autoři jméno VARCHAR(10, příjmení VARCHAR(20, titul VARCHAR(7, prostřední VARCHAR(10,

Více

Operátory ROLLUP a CUBE

Operátory ROLLUP a CUBE Operátory ROLLUP a CUBE Dotazovací jazyky, 2009 Marek Polák Martin Chytil Osnova přednášky o Analýza dat o Agregační funkce o GROUP BY a jeho problémy o Speciální hodnotový typ ALL o Operátor CUBE o Operátor

Více

6. blok část C Množinové operátory

6. blok část C Množinové operátory 6. blok část C Množinové operátory Studijní cíl Tento blok je věnován problematice množinových operátorů a práce s množinovými operátory v jazyce SQL. Čtenáři se seznámí s operátory, UNION, a INTERSECT.

Více

Úvod do databázových systémů

Úvod do databázových systémů Vysoká škola báňská Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Úvod do databázových systémů Cvičení 3 Ing. Petr Lukáš petr.lukas@vsb.cz Ostrava, 2014 Opakování 4 fáze vytváření

Více

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR): Mezi příkazy pro manipulaci s daty (DML) patří : 1. SELECT 2. ALTER 3. DELETE 4. REVOKE Jaké vlastnosti má identifikující relace: 1. Je relace, která se využívá pouze v případě modelovaní odvozených entit

Více

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux B0M33BDT Technologie pro velká data Supercvičení SQL, Python, Linux Sergej Stamenov, Jan Hučín 18. 10. 2017 Osnova cvičení Linux SQL Python 2 SQL pro uživatele aneb co potřebuje znát a umět bigdatový uživatel:

Více

Použití databází na Webu

Použití databází na Webu 4IZ228 tvorba webových stránek a aplikací Jirka Kosek Poslední modifikace: $Date: 2010/11/18 11:33:52 $ Obsah Co nás čeká... 3 Architektura webových databázových aplikací... 4 K čemu se používají databázové

Více

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev Úvod do databází Modelování v řízení Ing. Petr Kalčev Co je databáze? Množina záznamů a souborů, které jsou organizovány za určitým účelem. Jaké má mít přínosy? Rychlost Spolehlivost Přesnost Bezpečnost

Více

DUM 12 téma: Příkazy pro tvorbu databáze

DUM 12 téma: Příkazy pro tvorbu databáze DUM 12 téma: Příkazy pro tvorbu databáze ze sady: 3 tematický okruh sady: III. Databáze ze šablony: 7 Kancelářský software určeno pro: 4. ročník vzdělávací obor: 18-20-M/01 Informační technologie vzdělávací

Více

8.2 Používání a tvorba databází

8.2 Používání a tvorba databází 8.2 Používání a tvorba databází Slide 1 8.2.1 Základní pojmy z oblasti relačních databází Slide 2 Databáze ~ Evidence lidí peněz věcí... výběry, výpisy, početní úkony Slide 3 Pojmy tabulka, pole, záznam

Více

RELAČNÍ DATABÁZOVÉ SYSTÉMY

RELAČNÍ DATABÁZOVÉ SYSTÉMY RELAČNÍ DATABÁZOVÉ SYSTÉMY VÝPIS KONTROLNÍCH OTÁZEK S ODPOVĚDMI: Základní pojmy databázové technologie: 1. Uveďte základní aspekty pro vymezení jednotlivých přístupů ke zpracování hromadných dat: Pro vymezení

Více

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky XMW4 / IW4 Pokročilé SELECT dotazy Štefan Pataky TOP, OFFSET-FETCH Konverze datových typů Logické funkce Práce s řetězci Poddotazy a množinové dotazy SQL Windowing Agenda TOP TOP omezení počtu vrácených

Více

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D. Databáze 2011/2012 T-SQL - kurzry, funkce RNDr.David Hksza, Ph.D. http://siret.cz/hksza Osnva T-SQL kurzry T-SQL funkce Cvičení Kurzr Datvá struktura umžňující pracvat s výsledkem dtazu Smyslem kurzru

Více

Základní přehled SQL příkazů

Základní přehled SQL příkazů Základní přehled SQL příkazů SELECT Základní použití Příkaz SELECT slouží k získání dat z tabulky nebo pohledu v požadované podobě. Získání všech řádků a sloupců z tabulky SELECT * FROM Person.Contact

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Základy databází. O autorech 17 PRVNÍ ČÁST. KAPITOLA 1 Začínáme 19

Základy databází. O autorech 17 PRVNÍ ČÁST. KAPITOLA 1 Začínáme 19 3 Obsah Novinky v tomto vydání 10 Význam základních principů 11 Výuka principů nezávisle na databázových produktech 12 Klíčové pojmy, kontrolní otázky, cvičení, případové studie a projekty 12 Software,

Více

Databázové systémy I

Databázové systémy I Databázové systémy I Přednáška č. 8 Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky jiri.zechmeister@upce.cz Skupinové a souhrnné dotazy opakování Obsah Pohledy syntaxe použití význam Vnořené

Více

Databáze I. Přednáška 6

Databáze I. Přednáška 6 Databáze I Přednáška 6 SQL aritmetika v dotazech SQL lze přímo uvádět aritmetické výrazy násobení, dělení, sčítání, odčítání příklad z minulé přednášky: zdvojnásobení platu všem zaměstnancům UPDATE ZAMESTNANEC

Více

Databázové systémy a SQL

Databázové systémy a SQL Databázové systémy a SQL Daniel Klimeš Autor, Název akce 1 About me Daniel Klimeš Vzdělání: Obecná biologie PGS: onkologie Specializace: klinické databáze Databáze ORACLE klimes@iba.muni.cz Kotlářská 2,

Více

Vysoká škola báňská Technická univerzita Ostrava TEORIE ÚDRŽBY. učební text. Jan Famfulík. Jana Míková. Radek Krzyžanek

Vysoká škola báňská Technická univerzita Ostrava TEORIE ÚDRŽBY. učební text. Jan Famfulík. Jana Míková. Radek Krzyžanek Vysoká škola báňská Technická univerzita Ostrava TEORIE ÚDRŽBY učební text Jan Famfulík Jana Míková Radek Krzyžanek Ostrava 2007 Recenze: Prof. Ing. Milan Lánský, DrSc. Název: Teorie údržby Autor: Ing.

Více

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT david@wug.cz @gesvindr Logické zpracování dotazu Jazyk T-SQL je deklarativní Popisujeme,

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky

Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky Otázka 20 A7B36DBS Zadání... 1 Slovníček pojmů... 1 Relační DB struktury sloužící k optimalizaci dotazů - indexy, clustery, indexem organizované tabulky... 1 Zadání Relační DB struktury sloužící k optimalizaci

Více

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL) SQL strukturovaný dotazovací jazyk Structured Query Language (SQL) SQL - historie 1974-75 - IBM - 1.prototyp - SEQUEL od 1979 - do praxe - ORACLE (1979) IBM - SQL/DS (1981), DB/2 (1983) postupně přijímán

Více

10. Architektura klient/server a třívrstvá architektura

10. Architektura klient/server a třívrstvá architektura 10. Architektura klient/server a třívrstvá architektura 10.1. Varianty architektury... 3 10.2. Přínos architektury klient/server a třívrstvé architektury... 5 10.3. Podpora pro rozdělení zátěže v architektuře

Více

10. Architektura klient/server a třívrstvá architektura

10. Architektura klient/server a třívrstvá architektura 10. Architektura klient/server a třívrstvá architektura 10.1. Varianty architektury... 3 10.2. Přínos architektury klient/server a třívrstvé architektury... 5 10.3. Podpora pro rozdělení zátěže v architektuře

Více

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName

Informační systémy 2008/2009. Radim Farana. Obsah. Skripty a dávky. Nastavení aktuální databáze. USE DatabaseName 8 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah MS SQL Server 2005, Jazyk Transact-SQL, syntaxe, proměnné, struktury,

Více

Databáze I. Přednáška 4

Databáze I. Přednáška 4 Databáze I Přednáška 4 Definice dat v SQL Definice tabulek CREATE TABLE jméno_tab (jm_atributu typ [integr. omez.], jm_atributu typ [integr. omez.], ); integritní omezení lze dodefinovat později Definice

Více

Jazyk PL/SQL Úvod, blok

Jazyk PL/SQL Úvod, blok Jazyk PL/SQL Úvod, blok 1 Bc. Tomáš Romanovský Procedural Language for Structured Query Language Součást systému Oracle, rozšíření SQL o procedurální rysy Prostředky pro vytváření a spouštění programových

Více

VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA FAKULTA STROJNÍ DATABÁZOVÉ SYSTÉMY ARCHITEKTURA DATABÁZOVÝCH SYSTÉMŮ. Ing. Lukáš OTTE, Ph.D.

VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA FAKULTA STROJNÍ DATABÁZOVÉ SYSTÉMY ARCHITEKTURA DATABÁZOVÝCH SYSTÉMŮ. Ing. Lukáš OTTE, Ph.D. VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA FAKULTA STROJNÍ DATABÁZOVÉ SYSTÉMY ARCHITEKTURA DATABÁZOVÝCH SYSTÉMŮ Ing. Lukáš OTTE, Ph.D. Ostrava 2013 Tento studijní materiál vznikl za finanční podpory

Více

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů Kritéria hodnocení praktické maturitní zkoušky z databázových systémů Otázka č. 1 Datový model 1. Správně navržený ERD model dle zadání max. 40 bodů teoretické znalosti konceptuálního modelování správné

Více

Databázové systémy trocha teorie

Databázové systémy trocha teorie Databázové systémy trocha teorie Základní pojmy Historie vývoje zpracování dat: 50. Léta vše v programu nevýhody poměrně jasné Aplikace1 alg.1 Aplikace2 alg.2 typy1 data1 typy2 data2 vytvoření systémů

Více

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi.

Databázový systém označuje soubor programových prostředků, které umožňují přístup k datům uloženým v databázi. Databáze Základní pojmy Pojem databáze označuje obecně souhrn informací, údajů, dat o nějakých objektech. Úkolem databáze je hlídat dodržení všech omezení a dále poskytovat data při operacích. Objekty

Více

SQL - trigger, Databázové modelování

SQL - trigger, Databázové modelování 6. přednáška z předmětu Datové struktury a databáze (DSD) Ústav nových technologií a aplikované informatiky Fakulta mechatroniky, informatiky a mezioborových studií Technická univerzita v Liberci jan.lisal@tul.cz

Více

Úvod do databázových systémů

Úvod do databázových systémů Vysoká škola báňská Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Úvod do databázových systémů Cvičení 5 Ing. Petr Lukáš petr.lukas@vsb.cz Ostrava, 2014 Opakování K čemu se používají

Více

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška Databázové systémy Datová integrita + základy relační algebry 4.přednáška Datová integrita Datová integrita = popisuje pravidla, pomocí nichž hotový db. systém zajistí, že skutečná fyzická data v něm uložená

Více

Profilová část maturitní zkoušky 2017/2018

Profilová část maturitní zkoušky 2017/2018 Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2017/2018 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA

Více

SPŠS Č.Budějovice Obor Geodézie a Katastr nemovitostí 3.ročník ATRIBUTY ZÁKLADN POJMY VÝBĚR PRVKŮ DLE ATRIBUTŮ

SPŠS Č.Budějovice Obor Geodézie a Katastr nemovitostí 3.ročník ATRIBUTY ZÁKLADN POJMY VÝBĚR PRVKŮ DLE ATRIBUTŮ SPŠS Č.Budějovice Obor Geodézie a Katastr nemovitostí 3.ročník ATRIBUTY ZÁKLADN POJMY VÝBĚR PRVKŮ DLE ATRIBUTŮ GIS jako obraz reálného světa Reálný svět je pozorován pozorovatelem. Ten vytváří na základě

Více

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT

SQL SQL-SELECT. Informační a znalostní systémy. Informační a znalostní systémy SQL- SELECT -SELECT Informační a znalostní systémy 1 - Structured Query Language norma pro dotazování nad relačními databáze díky přenositelnosti- rozmach relačních databází zahrnuje jak dotazování na data, tak změny

Více

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports , Marek Rychlý Vysoké učení technické v Brně Fakulta informačních technologií Ústav informačních systémů Demo-cvičení pro IDS 9. dubna 2014 Marek Rychlý Stored Procedures & Database Triggers, Demo-cvičení

Více

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Autor: Číslo: Anotace: Inovace a zkvalitnění výuky prostřednictvím ICT Databáze Základní seznámení s MySQL

Více

Ukládání a vyhledávání XML dat

Ukládání a vyhledávání XML dat XML teorie a praxe značkovacích jazyků (4IZ238) Jirka Kosek Poslední modifikace: $Date: 2014/12/04 19:41:24 $ Obsah Ukládání XML dokumentů... 3 Ukládání XML do souborů... 4 Nativní XML databáze... 5 Ukládání

Více

Vladimír Mach. @vladimirmach 2. 1. 2013

Vladimír Mach. @vladimirmach 2. 1. 2013 Vladimír Mach @vladimirmach 2. 1. 2013 SQL Server Compact Edition Jednoduchá relační databáze Použití i v malých zařízeních s omezenými zdroji Dříve pod názvem SQL Server Mobile Časté využití při programování

Více

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23

Obsah. Kapitola 1. Kapitola 2. Kapitola 3. Kapitola 4. Úvod 11. Stručný úvod do relačních databází 13. Platforma 10g 23 Stručný obsah 1. Stručný úvod do relačních databází 13 2. Platforma 10g 23 3. Instalace, první přihlášení, start a zastavení databázového serveru 33 4. Nástroje pro administraci a práci s daty 69 5. Úvod

Více

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Základy informatiky. 08 Databázové systémy. Daniela Szturcová Základy informatiky 08 Databázové systémy Daniela Szturcová Problém zpracování dat Důvodem je potřeba zpracovat velké množství dat - evidovat údaje o nějaké skutečnosti. o skupině lidí (zaměstnanců, studentů,

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Autor: Číslo: Anotace: Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní

Více

4. blok část A Logické operátory

4. blok část A Logické operátory 4. blok část A Logické operátory Studijní cíl Tento blok je věnován představení logických operátorů AND, OR, NOT v jazyce SQL a práce s nimi. Doba nutná k nastudování 1-2 hodiny Průvodce studiem Při studiu

Více

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava Šablona 32 VY_32_INOVACE_038.ICT.34 Tvorba webových stránek SQL stručné minimum OA a JŠ Jihlava, VY_32_INOVACE_038.ICT.34 Číslo

Více

4. lekce Přístup k databázi z vyššího programovacího jazyka

4. lekce Přístup k databázi z vyššího programovacího jazyka 4. lekce Přístup k databázi z vyššího programovacího jazyka Studijní cíl Tento blok popisuje základní principy přístupu k databázi z vyššího programovacího jazyka. Doba nutná k nastudování 2-3 hodiny Průvodce

Více

6. SQL složitější dotazy, QBE

6. SQL složitější dotazy, QBE 6. SQL složitější dotazy, QBE Příklady : Veškeré příklady budou dotazy nad databází KONTAKTY nebo KNIHOVNA nebo FIRMA Databáze KONTAKTY OSOBA (Id_osoba, Příjmení, Jméno, Narození, Město, Ulice, PSČ) EMAIL

Více

1 Webový server, instalace PHP a MySQL 13

1 Webový server, instalace PHP a MySQL 13 Úvod 11 1 Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského

Více

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou MySQL Typy tabulek Storage Engines MyISAM defaultní, neumí transakce, umí fulltext InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) MEMORY (HEAP) v paměti; neumí transakce ARCHIVE velké množství

Více

Databázové systémy Cvičení 5.2

Databázové systémy Cvičení 5.2 Databázové systémy Cvičení 5.2 SQL jako jazyk pro definici dat Detaily zápisu integritních omezení tabulek Integritní omezení tabulek kromě integritních omezení sloupců lze zadat integritní omezení jako

Více

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů

Kritéria hodnocení praktické maturitní zkoušky z databázových systémů Kritéria hodnocení praktické maturitní zkoušky z databázových systémů Otázka č. 1 Datový model 1. Správně navržený ERD model dle zadání max. 40 bodů teoretické znalosti konceptuálního modelování správné

Více

Databáze II. 1. přednáška. Helena Palovská palovska@vse.cz

Databáze II. 1. přednáška. Helena Palovská palovska@vse.cz Databáze II 1. přednáška Helena Palovská palovska@vse.cz Program přednášky Úvod Třívrstvá architektura a O-R mapování Zabezpečení dat Role a přístupová práva Úvod Co je databáze Mnoho dat Organizovaných

Více

C# - Databáze úvod, ADO.NET. Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí

C# - Databáze úvod, ADO.NET. Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí C# - Databáze úvod, ADO.NET Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí Co je to databáze? Databáze je určitá uspořádaná množina informací

Více

5. blok Souhrnné a skupinové dotazy

5. blok Souhrnné a skupinové dotazy 5. blok Souhrnné a skupinové dotazy Studijní cíl Tento blok je věnován základům při vytváření souhrnných a skupinových dotazů s využitím agregačních funkcí SUM(), AVG(), MIN(), MAX() a COUNT() a klauzulí

Více

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4. Základy programování 4 - C# - 9. cvičení Radek Janoštík Univerzita Palackého v Olomouci 10.4.2017 Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.2017 1 / 13 Reakce na

Více

Profilová část maturitní zkoušky 2013/2014

Profilová část maturitní zkoušky 2013/2014 Střední průmyslová škola, Přerov, Havlíčkova 2 751 52 Přerov Profilová část maturitní zkoušky 2013/2014 TEMATICKÉ OKRUHY A HODNOTÍCÍ KRITÉRIA Studijní obor: 78-42-M/01 Technické lyceum Předmět: TECHNIKA

Více

Úvod do databázových systémů

Úvod do databázových systémů Vysoká škola báňská Technická univerzita Ostrava Fakulta elektrotechniky a informatiky Úvod do databázových systémů Cvičení 4 Ing. Petr Lukáš petr.lukas@vsb.cz Ostrava, 2014 Opakování Klauzule příkazu

Více

POKROČILÉ POUŽITÍ DATABÁZÍ

POKROČILÉ POUŽITÍ DATABÁZÍ POKROČILÉ POUŽITÍ DATABÁZÍ Barbora Tesařová Cíle kurzu Po ukončení tohoto kurzu budete schopni pochopit podstatu koncepce databází, navrhnout relační databázi s využitím pokročilých metod, navrhovat a

Více

Microsoft Access. Typy objektů databáze: Vytvoření a návrh nové tabulky. Vytvoření tabulky v návrhovém zobrazení

Microsoft Access. Typy objektů databáze: Vytvoření a návrh nové tabulky. Vytvoření tabulky v návrhovém zobrazení Microsoft Access Databáze je seskupení většího množství údajů, které mají určitou logiku a lze je určitým způsobem vyhodnocovat, zpracovávat a analyzovat Access je jedním z programů určených pro zpracování

Více

Databáze I. Přednáška 7

Databáze I. Přednáška 7 Databáze I Přednáška 7 Objektové rozšíření SQL Objektově relační databáze SQL:1999 objektové rozšíření SQL vztahuje se k objektově relačním databázovým systémům ukládají objekty do relační databáze umožňují

Více

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace. Popis ovládání 1. Úvod Tento popis má za úkol seznámit uživatele se základními principy ovládání aplikace. Ovládání je možné pomocí myši, ale všechny činnosti jsou dosažitelné také pomocí klávesnice. 2.

Více

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ

VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ VZOROVÝ STIPENDIJNÍ TEST Z INFORMAČNÍCH TECHNOLOGIÍ 1. Dědičnost v OOP umožňuje: a) dědit vlastnosti od jiných tříd a dále je rozšiřovat b) dědit vlastnosti od jiných tříd, rozšiřovat lze jen atributy

Více

Vstupní požadavky, doporučení a metodické pokyny

Vstupní požadavky, doporučení a metodické pokyny Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem

Více

Programování v jazyku C# II. 5.kapitola

Programování v jazyku C# II. 5.kapitola Programování v jazyku C# II. 5.kapitola Obsah O ADO.NET Spojení s DB Příkazy Jednoduché čtení DataSet 2/28 ADO.NET ADO - ActiveX Data Object Orientováno na webové aplikace neexistence stavu v HTTP Obecný

Více

Maturitní témata Školní rok: 2015/2016

Maturitní témata Školní rok: 2015/2016 Maturitní témata Školní rok: 2015/2016 Ředitel školy: Předmětová komise: Předseda předmětové komise: Předmět: PhDr. Karel Goš Informatika a výpočetní technika Mgr. Ivan Studnička Informatika a výpočetní

Více

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307

Stručný obsah. část III Aktualizace dat Kapitola 10: Aktualizace databáze 257 Kapitola 11: Integrita dat 275 Kapitola 12: Zpracování transakcí 307 Stručný obsah část I Přehled jazyka SQL Kapitola 1: Úvod 27 Kapitola 2: Stručný úvod do jazyka SQL 37 Kapitola 3: Jazyk SQL z širšího pohledu 45 Kapitola 4: Relační databáze 69 Část II Získávání dat Kapitola

Více

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata Databáze Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu Bedřich Košata K čemu jsou databáze Ukládání dat ve strukturované podobě Možnost ukládat velké množství dat

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

Dotazovací jazyky I. Datová krychle. Soběslav Benda

Dotazovací jazyky I. Datová krychle. Soběslav Benda Dotazovací jazyky I Datová krychle Soběslav Benda Obsah Úvod do problematiky Varianty přístupu uživatelů ke zdrojům dat OLTP vs. OLAP Datová analýza Motivace Vytvoření křížové tabulky Datová krychle Teorie

Více

Distanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D.

Distanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D. Distanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Motivace 2 Základy syntaxe 3 Procedury a Funkce 4 Kurzory 5 Výjimky Studijní

Více

KIV/ZIS cvičení 6. Tomáš Potužák

KIV/ZIS cvičení 6. Tomáš Potužák KIV/ZIS cvičení 6 Tomáš Potužák Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Slučování záznamů do skupin (1) Chceme zjistit informace obsažené ve více záznamech najednou Klauzule GROUP

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS 7. Integrita a bezpečnost dat v DBS 7.1. Implementace integritních omezení... 2 7.1.1. Databázové triggery... 5 7.2. Zajištění bezpečnosti dat... 12 7.2.1. Bezpečnostní mechanismy poskytované SŘBD... 13

Více

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS 7. Integrita a bezpečnost dat v DBS 7.1. Implementace integritních omezení... 2 7.1.1. Databázové triggery... 5 7.2. Zajištění bezpečnosti dat... 12 7.2.1. Bezpečnostní mechanismy poskytované SŘBD... 13

Více

Databázové systémy I

Databázové systémy I 2015 Databázové systémy I PROJEKT 2 ČÁST MIROSLAV POKORNÝ Stránka 0 z 21 Zadání Implementujte datový model vytvořený v první části projektu do relační databáze a vytvořte pohledy a uloženou proceduru dle

Více

DATABÁZE MS ACCESS 2010

DATABÁZE MS ACCESS 2010 DATABÁZE MS ACCESS 2010 KAPITOLA 5 PRAKTICKÁ ČÁST TABULKY POPIS PROSTŘEDÍ Spuštění MS Access nadefinovat název databáze a cestu k uložení databáze POPIS PROSTŘEDÍ Nahoře záložky: Soubor (k uložení souboru,

Více

Jazyk SQL databáze SQLite. připravil ing. petr polách

Jazyk SQL databáze SQLite. připravil ing. petr polách Jazyk SQL databáze SQLite připravil ing. petr polách SQL - úvod Structured Query Language (strukturovaný dotazovací jazyk 70. léta min. století) Standardizovaný dotazovací jazyk používaný pro práci s daty

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

Informační systémy 2008/2009. Radim Farana. Obsah. Obsah předmětu. Požadavky kreditového systému. Relační datový model, Architektury databází

Informační systémy 2008/2009. Radim Farana. Obsah. Obsah předmětu. Požadavky kreditového systému. Relační datový model, Architektury databází 1 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah Požadavky kreditového systému. Relační datový model, relace, atributy,

Více