• Nie Znaleziono Wyników

transformaci a obnovu dat v relační Tool for Backup, Transformation and Restoration of Data in Relational Databases

N/A
N/A
Protected

Academic year: 2022

Share "transformaci a obnovu dat v relační Tool for Backup, Transformation and Restoration of Data in Relational Databases"

Copied!
38
0
0

Pełen tekst

(1)

Fakulta elektrotechniky a informatiky Katedra informatiky

N ´astroj pro z ´alohov ´an´ı,

transformaci a obnovu dat v rela ˇcn´ı datab ´azi

Tool for Backup, Transformation and Restoration of Data in

Relational Databases

2013 Martin Buˇcek

(2)
(3)
(4)
(5)
(6)

C´ılem bakal´aˇrsk´e pr´ace je vytvoˇrit n´astroj, kter ´y umoˇzn´ı uˇzivateli z´alohovat data z relaˇcn´ı datab´aze do zvolen´eho textov´eho form´atu a obnovit data zpˇet do datab´aze. N´astroj je rozˇs´ıˇren o moˇznost transformace k oˇsetˇren´ı situac´ı, pokud sloupec ubyl nebo pˇribyl.

Z´arove ˇn je n´astroj naimplementov´an s ohledem na rozˇsiˇritelnost o dalˇs´ı datab´azov´e stroje.

V tomto textu jsou diskutov´any vhodn´e textov´e form´aty pro dalˇs´ı implementaci, trans- formace relaˇcn´ı datab´aze a n´azorn ´y pˇr´ıklad pouˇzit´ı.

Kl´ıˇcov ´a slova: bakal´aˇrsk´a pr´ace, z´alohov´an´ı, obnova, transformace, datab´azov´e syst´emy

Abstract

The objective of thesis is to create tool, which allows the user to backup data from rela- tional database to the chosen text format and restore data back to this database. The tool is extended to transformation for situation when column was added or deleted. Simulta- neously this tool is implemented with regard for extension of other database engines. In this text are discussed suitable text formats for further implementation, transformation of relational database and an sample example for usage.

Keywords: thesis, backup, restoration, transformation, database systems

(7)

AJAX – Asynchronous JavaScript and XML ANSI – American National Standards Institute

CLI – Command Line Interface

DLL – Dynamic Link Library

DTD – Document Type Definition

HTML – Hyper Text Markup Language

IBM – International Business Machines

INGRES – Interactive Graphics and Retrieval System ISO – International Organization for Standardization

JSON – JavaScript Object Notation

PDF – Portable Document Format

QMF – Query Management Facility

SGML – Standard Generalized Markup Language

SOAP – Simple Object Access Protocol

SQL – Structured Query Language

S ˇRBD – Syst´em ˇr´ızen´ı b´aze dat

W3C – World Wide Web Consortium

XML – eXtensible Markup Language

YAML – YAML Ain’t Markup Language

(8)

Obsah

1 Uvod´ 5

2 Textov´e serializaˇcn´ı form´aty 6

2.1 XML . . . 6

2.1.1 P ˚uvod . . . 6

2.1.2 V ´yhody a nev ´yhody . . . 6

2.1.3 Z´aklady syntaxe . . . 7

2.1.4 Spr´avnˇe strukturovan ´y dokument . . . 8

2.1.5 Pˇr´ıklad dokumentu . . . 9

2.2 JSON . . . 10

2.2.1 Z´aklady syntaxe . . . 11

2.2.2 V ´yhody a nev ´yhody . . . 11

2.2.3 Pˇr´ıklad dokumentu . . . 11

2.3 YAML . . . 12

2.3.1 V ´yhody a nev ´yhody . . . 12

2.3.2 Z´aklady syntaxe . . . 13

2.3.3 Pˇr´ıklad dokumentu . . . 13

2.4 SQL . . . 15

2.4.1 P ˚uvod . . . 15

2.4.2 Pˇr´ıklad dokumentu . . . 15

3 Uk´azkov ´y pˇr´ıklad pouˇzit´ı 17 3.1 Uvod do aplikace . . . .´ 17

3.2 Pr´ace s pˇr´ıkazov ´ym ˇr´adkem . . . 17

3.3 Vytvoˇren´ı datab´aze . . . 18

3.4 Nahr´an´ı inicializaˇcn´ıho skriptu . . . 18

3.5 Z´alohov´an´ı datab´aze . . . 19

3.6 Uprava struktury datab´aze . . . .´ 22

3.7 Obnova dat . . . 22

4 Transformace datab´aze 25 4.1 Naˇcten´ı sch´emat tabulek . . . 25

4.2 Porovn´an´ı sch´emat ˚u . . . 26

4.2.1 Sloupec ubyl . . . 27

4.2.2 Sloupec pˇribyl . . . 27

5 Z´avˇer 29

6 Reference 30

Pˇr´ılohy 30

A Elektronick´e pˇr´ılohy na CD 31

(9)

Seznam tabulek

1 SQL tabulka uˇzivatel . . . 9 2 Pˇr´ıklad tabulky se sch´ematem . . . 25

(10)

Seznam obr ´azk ˚ u

1 Znaˇckovac´ı jazyky vych´azej´ıc´ı z SGML . . . 6

2 Kolekce n´azev-hodnota . . . 11

3 Syntaxe SQL . . . 15

4 CLI rozhran´ı . . . 17

5 Vytvoˇren´ı datab´aze . . . 18

6 ER Diagram . . . 19

7 Z´alohov´an´ı . . . 20

8 ER Diagram po ´upravˇe . . . 22

9 Obnova dat . . . 23

(11)

Seznam v ´ypis ˚ u zdrojov ´eho k ´ odu

1 XML dokument . . . 9

2 Serializace do XML form´atu . . . 9

3 JSON dokument . . . 11

4 Serializace do JSON form´atu . . . 12

5 YAML dokument . . . 13

6 Serializace do YAML form´atu . . . 14

7 SQL form´at . . . 15

8 Uk´azkov ´y XML dokument . . . 20

9 Naˇcten´ı XML sch´ematu . . . 26

10 Vytvoˇren´ı tabulky . . . 27

11 Vytvoˇren´ı tabulky . . . 27

12 Nastaven´ı v ´ychoz´ı hodnoty . . . 28

(12)

1 Uvod ´

Bakal´aˇrsk´a pr´ace je rozdˇelena do tˇr´ı hlavn´ıch kapitol. V prvn´ı kapitole je vysvˇetlen v ´ybˇer textov´eho form´atu pro serializaci. Postupnˇe jsou vysvˇetleny v ´yhody a nev ´yhody jednot- liv ´ych textov ´ych form´at ˚u a ke kaˇzd´emu z nich je pro lepˇs´ı pochopen´ı uveden pˇr´ıklad dan´eho dokumentu v diskutovan´em form´atu a jeho syntaxe. Druh´a kapitola je zamˇeˇrena na praktiˇctˇejˇs´ı ˇc´ast. Krok po kroku je zde vysvˇetlena pr´ace s n´astrojem, kterou si m ˚uˇze ˇcten´aˇr vyzkouˇset s´am na uk´azkov´e datab´azi. V posledn´ı kapitole bude ˇcten´aˇr detailnˇeji obezn´amen s pouˇzitou transformac´ı v uk´azkov´em pˇr´ıkladˇe.

(13)

2 Textov ´e serializa ˇcn´ı form ´aty

C´ılem t´eto kapitoly je zhodnotit v ´yhody a nev ´yhody textov ´ych form´at ˚u z hlediska dosaˇzen´ı c´ıl ˚u bakal´aˇrsk´e pr´ace a vybrat jeden vhodn ´y pro serializaci. Jako potencion´aln´ı kan- did´ati byly vybr´any form´aty XML, JSON a YAML. Tyto form´aty byly vybr´any na z´akladˇe ˇcetnosti jejich vyuˇzit´ı pro serializaci. Minim´aln´ı poˇzadavek pro v ´ybˇer form´at ˚u byl fakt, aby dan ´y form´at byl textov ´y a ne bin´arn´ı. To z d ˚uvodu, aby byl soubor upraviteln ´y v libovoln´em textov´em editoru.

2.1 XML 2.1.1 P ˚uvod

XML byl vytvoˇren skupinou XML working group a standartizov´an pod z´aˇstitem konsor- cia W3C 10.ledna 1998 ve verzi 1.0. XML byl vyd´an celkem ve dvou verz´ıch. Druh´a verze 1.1 byla vyd´ana v 4. ´unora 2004. Z´asadn´ı rozd´ıl oproti starˇs´ı verzi 1.0 tkv´ı v poˇzadavc´ıch na korektn´ı n´azvy element ˚u a atribut ˚u. ˇC´asteˇcnˇe se t´ımto probl´emem detailnˇeji zab ´yv´a jedna z dalˇs´ıch podkapitol.

XML byl navrˇzen k ˇreˇsen´ı probl´em ˚u elektronick´eho publikov´an´ı a v souˇcasnosti hraje velice d ˚uleˇzitou roli pˇri v ´ymˇenˇe nejr ˚uznˇejˇs´ıch ´udaj ˚u na webu i jinde. V dneˇsn´ı dobˇe je z´akladem velmi popul´arn´ıch webov ´ych sluˇzeb, SOAP protokolu a tak´e slouˇz´ı pro ukl´ad´an´ı informac´ı datab´azov´eho typu.

XML vych´az´ı ze znaˇckovac´ıho jazyka SGML. Z´akladn´ı rozd´ıl mezi SGML a XML spoˇc´ıv´a ve zpracov´an´ı dan´eho dokumentu.XML pouze specifikuje, co se nach´az´ı v do- kumentu. Oproti HTML neˇr´ık´a nic o tom, jak m´a dan ´y dokument vypadat. Nicm´enˇe, tyto znaˇckovac´ı jazyky spolu ´uzce souvis´ı.

Obr´azek 1: Znaˇckovac´ı jazyky vych´azej´ıc´ı z SGML

2.1.2 V ´yhody a nev ´yhody

Z velk´e ˇc´asti byla n´apln´ı m´e bakal´aˇrsk´e pr´ace manipulace s daty v textov´em form´atu.

Tento fakt hr´al kl´ıˇcovou roli ve v ´ybˇeru textov´eho form´atu pro iplementaci. XML m´a

(14)

mnoho v ´yhod, nicm´enˇe j´a zde budu popisovat pouze ty v ´yhody, kter´e byly d ˚uleˇzit´e pro dosaˇzen´ı c´ıle bakal´aˇrsk´e pr´ace.

XML je velice rozˇs´ıˇren´e s ˇsirokou podporou v mnoha programovac´ıch jazyc´ıch a v ´yvojov ´ych prostˇred´ıch. V ´yhodou je moˇznost pouˇzit´ı tˇr´ıdy XmlTextWriter, kter ´y je souˇc´ast´ı .NET frameworku uˇz od verze 1.0. XmlTextWriter pˇredstavuje tˇr´ıdu k rychl´emu zapi- sov´an´ı dat do XML form´atu. Bˇehem z´apisu se data neukl´ad´aj´ı do pamˇeti, coˇz dˇel´a zapi- sov´an´ı rychl´e. Dalˇs´ı v ´yhodou, kter´a mˇe pˇresvˇedˇcila k v ´ybˇeru toho form´atu k dalˇs´ı iple- mentaci, je moˇznost vytvoˇren´ı si vlastn´ıch tag ˚u.

Nutno podotknout, ˇze XML m´a i stinn´e str´anky. Mezi jeho nev ´yhody z hlediska t´eto pr´ace patˇr´ı zejm´ena nˇekolikan´asobnˇe vˇetˇs´ı velikost neˇz u ostatn´ıch form´at ˚u.

2.1.3 Z ´aklady syntaxe

Pˇri otevˇren´ı XML dokumentu se m ˚uˇzeme potkat s r ˚uzn ´ymi prvky. XML dokument m ˚uˇze zaˇc´ınat prologem. Prolog specifikuje verzi XML a pouˇzit´e k ´odov´an´ı. Nicm´enˇe pˇr´ıtomnost prologu v dokumentu nen´ı nutn´a.

<?xml version="1.0" encoding="UTF-8" ?>

Z´akladn´ım stavebn´ım prvkem kaˇzd´eho XML dokumentu jsou tagy. Rozezn´av´ame nˇekolik druh ˚u.

• Poˇc´ateˇcn´ı tag:

<Jmeno>

• Koncov ´y tag:

</Jmeno>

• Pr´azdn ´y tag:

<Jmeno />

Mezi poˇc´ateˇcn´ım a koncov ´ym tagem se nach´az´ı obsah. Dohromady tyto 3 ˇc´asti tvoˇr´ı ele- ment. Ovˇsem element je tak´e pr´azdn ´y tag s´am o sobˇe. Elementy se mohou vnoˇrovat i do jin ´ych element ˚u a t´ım m ˚uˇze vzniknout pomˇernˇe rozs´ahl ´y dokument. Uk´azku podobn´e struktury dokumentu m ˚uˇzete vidˇet v dalˇs´ıch podkapitol´ach t´eto pr´ace.

Dalˇs´ım prvkem XML jsou atributy. Atributy slouˇz´ı pro oddˇelen´ı dat. Atributy se za- pisuj´ı do poˇc´ateˇcn´ıch nebo pr´azdn ´ych tag ˚u. V jednom tagu jich m ˚uˇze b ´yt i v´ıce za sebou.

Obvykle se pouˇz´ıv´aj´ı pro uloˇzen´ı informac´ı, kter´e nejsou pro ˇcten´aˇre aˇz tak d ˚uleˇzit´e.

Nutno podotknout, ˇze pˇri implementaci nebyly atributy v t´eto bakal´aˇrsk´e pr´aci pouˇzity.

Pˇr´ıkladem atributu m ˚uˇze b ´yt tˇreba nˇejak´e identifikaˇcn´ı ˇc´ıslo.

<Jmeno id="buc0022">Martin</Jmeno>

(15)

<Jmeno id="buc0022" />

Posledn´ım prvkem syntaxe XML dokumentu jsou koment´aˇre. Koment´aˇre se mohou ob- jevit kdekoliv v dokumentu mimo tagy. Tak´e nesm´ı b ´yt pˇred XML prologem.

<!-- Toto je nov´y koment´aˇr -->

2.1.4 Spr ´avn ˇe strukturovan ´y dokument

Znalost jednotliv ´ych konstrukˇcn´ıch prvk ˚u ´uplnˇe nestaˇc´ı. XML dokument mus´ı spl ˇnovat nˇekolik pravidel, aby se dal oznaˇcit na spr´avnˇe strukturovan ´y nebo-li

”well-formed“ do- kument. Spr´avnˇe strukturovan ´y dokument znamen´a, ˇze spl ˇnuje vˇsechny poˇzadavky kla- den´e na syntaxi, kter´e jsou definov´any ve specifikaci XML 1.0.

• XML dokument mus´ı obsahovat pr´avˇe jeden koˇrenov ´y element, do kter´eho jsou vnoˇreny vˇsechny ostatn´ı elementy.

• Kaˇzd ´y zaˇc´ınaj´ıc´ı tag mus´ı m´ıt odpov´ıdaj´ıc´ı koncov ´y tag.

• Elementy se nesm´ı kˇr´ıˇzit. Typick ´y pˇr´ıklad kˇr´ıˇzen´ı m ˚uˇze b ´yt tˇreba tento:

<Jmeno><Prijmeni></Jmeno></Prijmeni>

• Hodnoty vˇsech atribut ˚u mus´ı b ´yt uzavˇreny v ´uvozovk´ach.

• Vˇsechny znaky, kter´e se v dokumentu vyskytuj´ı mus´ı podl´ehat ˇr´adn´emu Unicode k ´odov´an´ı.

XML nab´ız´ı moˇznost vytvoˇren´ı vlastn´ıch tag ˚u. Nicm´enˇe je d ˚uleˇzit´e zn´at p´ar pravidel pro vytvoˇren´ı korektn´ıho elementu. N´azev elementu nesm´ı obsahovat ˇz´adn´e mezery a tak´e r ˚uzn´e speci´aln´ı znaky. N´azvy element ˚u jsou tak´e case-sensitive. To znamen´a, ˇze ro- zezn´av´a mal´a a velk´a p´ısmena. Napˇr´ıklad n´asleduj´ıc´ı z´apis by vy ´ustil v chybu.

<Jmeno>Martin</jmeno>

Spr´avn ´y z´apis tˇechto element ˚u bude vypadat n´asledovnˇe.

<Jmeno>Martin</Jmeno>

Ruˇcn´ı kontrola validace m´enˇe rozs´ahl´eho XML dokumentu nemus´ı b ´yt nˇejak zdlouh´av´a.

Ovˇsem u vˇetˇs´ıch dokument ˚u uˇz by to mohl b ´yt probl´em. Pro tyto situace existuj´ı r ˚uzn´e online n´astroje. Odkaz na jeden z nich najdete v pouˇzit´e literatuˇre na konci t´eto ba- kal´aˇrsk´e pr´ace.

(16)

login jm´eno pˇr´ıjmen´ı email

buc0022 Martin Buˇcek martinbucek@seznam.cz

nov0011 Jan Nov´ak jannovak@gmail.com

Tabulka 1: SQL tabulka uˇzivatel

2.1.5 Pˇr´ıklad dokumentu

Uvaˇzme pro tento pˇr´ıklad tuto jednoduchou tabulku uˇzivatel ˚u, kter´a se nach´az´ı v relaˇcn´ı datab´azi na Microsoft SQL Serveru. Pro serializaci pouˇzijeme jiˇz v ´yˇse zm´ınˇen ´y XmlTex- tWriter.

Na v ´ystupu dostaneme tento XML dokument. M ˚uˇzeme si vˇsimnout lehce upraven´e struktury dokumentu. Do cel´e struktury dokumentu jsou pˇrid´any jeˇstˇe ´urovnˇe pro oddˇelen´ı jednotliv ´ych z´aznam ˚u v tabulce, ˇcehoˇz pozdˇeji vyuˇzijeme u obnovy dat. Nav´ıc vˇsechny poˇzadovan´e data urˇcen´e k z´alohov´an´ı jsou uvnitˇr koˇrenov´eho elementu s n´azvem Data- baze. To spl ˇnuje jeden z poˇzadavk ˚u na korektnˇe vytvoˇren ´y XML dokument.

V pˇredeˇsl´e podkapitole je zm´ı ˇnka o online n´astroj´ıch urˇcen´e k validaci XML doku- ment ˚u. M ˚uˇzete si zkusit zkop´ırovat tento XML dokument a pouˇz´ıt ho jako demonstraˇcn´ı pˇr´ıklad k ovˇeˇren´ı. Pouze chci upozornit, ˇze pˇri kop´ırov´an´ı z PDF to vynech´av´a podtrˇz´ıtka v n´azvech element ˚u id uˇzivatele. Proto je nutn´e je dopsat ruˇcnˇe.

1 <Databaze>

2 <Uzivatel>

3 <Radek>

4 <id uzivatele>buc0022</id uzivatele>

5 <jmeno>Martin</jmeno>

6 <prijmeni>Buˇcek</prijmeni>

7 <email>martinbucek@seznam.cz</email>

8 </Radek>

9 <Radek>

10 <id uzivatele>nov0011</id uzivatele>

11 <jmeno>Jan</jmeno>

12 <prijmeni>Nov ´ak</prijmeni>

13 <email>jannovak@gmail.com</email>

14 </Radek>

15 </Uzivatel>

16 </Databaze>

V ´ypis 1: XML dokument Funkce pro serializaci do XML form´atu vypad´a n´asledovnˇe.

1 using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8))

2 {

3 writer .Formatting = System.Xml.Formatting.Indented;

4 writer .WriteStartElement(”Databaze”);

5 command = new SqlCommand();

6 foreach ( string tableName in list )

7 {

8 command = new SqlCommand(”Select ∗ from ”+tableName, connection);

9 adapter = new SqlDataAdapter(command);

(17)

10 DataTable tableOfContents = new DataTable();

11 adapter. Fill (tableOfContents);

12 string tableName2 = tableName.Replace(” ”, ”−−”);

13 writer .WriteStartElement(tableName2);

14 foreach (DataRow row in tableOfContents.Rows)

15 {

16 writer .WriteStartElement(”Radek”);

17 foreach (DataColumn column in tableOfContents.Columns)

18 {

19 writer .WriteStartElement(column.ColumnName);

20 writer .WriteString(row[column].ToString().Trim() ) ;

21 writer .WriteEndElement();

22 }

23 writer .WriteEndElement();

24 }

25 writer .WriteEndElement();

26 }

27 writer .WriteEndElement();

28 writer .Close();

29 }

V ´ypis 2: Serializace do XML form´atu

K z´apisu pouˇzijeme v ´yˇse zm´ınˇen ´y XmlTextWriter, kter ´y jako parametr pˇr´ıj´ım´a FileStream ke specifikaci cesty k souboru. Standartnˇe je v ´ystup XmlTextWriteru nezform´atovan ´y.

Vˇsechny elementy se zapisuj´ı za sebe do jednoho ˇr´adku, coˇz nep ˚usob´ı v ˚ubec pˇeknˇe a u vˇetˇs´ıch XML soubor ˚u je to dosti nepˇrehledn´e. K pˇredejit´ı t´eto situace m´a XmlTextWriter vlastnost Formatting, kterou pouˇzijeme na ˇr´adku 3 v ´ypisu zdrojov´eho k ´odu.

Funkce z´alohuje v cyklu vˇsechny tabulky z relaˇcn´ı datab´aze. To znamen´a, ˇze koˇrenov ´y element se mus´ı zapsat jeˇstˇe pˇred t´ımto cyklem. Jinak by se zapsal pˇri z´apisu kaˇzd´e ta- bulky z relaˇcn´ı datab´aze a v ´ysledn ´y XML dokument by nebyl validn´ı. Toto oˇsetˇren´ı lze vidˇet na ˇr´adku 4. Pot´e se zap´ıˇsou veˇsker´e poˇzadovan´e data. K z´apisu elementu pouˇzijeme funkci WriteStartElement() a WriteEndElement(). T´ımto oˇsetˇr´ıme pouze z´apis zaˇc´ınaj´ıc´ıch a koncov ´ych tag ˚u, ale nikoliv samotn ´ych dat. K tomuto ´uˇcelu slouˇz´ı funkce WriteString().

Pokud je dan´a bu ˇnka tabulky pr´azdn´a, zap´ıˇse se pouze pr´azdn ´y element.

2.2 JSON

JSON byl vytvoˇren a popularizov´an americk ´ym program´atorem a z´arove ˇn podnikatelem Douglasem Crockfordem. JSON je podmnoˇzinou JavaScriptu. Byl poprv´e pouˇzit v roce 2001 ve spoleˇcnosti State Software, kterou spoluzaloˇzil pr´avˇe Douglas Crockford. ˇCasto b ´yv´a naz ´yv´an odlehˇcenou formou a alternativou XML. Je pops´an a standardizov´an ve Standardu ECMA-262 3rd Edition - December 1999.

JSON se ˇc´asteˇcnˇe pouˇz´ıv´a v technologii Ajax, kter´a slouˇz´ı pro komunikaci se ser- very. Jako pˇr´ıklad m ˚uˇzeme uv´est situaci, kdyˇz uˇzivatel p´ıˇse poˇzadavek do nˇejak´eho vy- hled´avaˇce. Ajax postupnˇe naˇsept´av´a moˇzn´e odpovˇedi ze serveru, kter´e alespo ˇn z ˇc´asti odpov´ıdaj´ı hledan´emu v ´yrazu. Pro tyto aktualizace mezi serverem a klientem pouˇz´ıvaj´ı prohl´ıˇzeˇce standardnˇe XML, ale uˇz se pro tento ´uˇcel zaˇcal pouˇz´ıvat i JSON.

(18)

2.2.1 Z ´aklady syntaxe

JSON m´a podobnou strukturu jako XML. Lze pouˇz´ıt kolekci typu n´azev-hodnota s t´ım rozd´ılem, ˇze JSON nem´a koncov´e tagy jako XML. Ta v r ˚uzn ´ych jazyc´ıch b ´yv´a realizov´ana jako objekt.

Obr´azek 2: Kolekce n´azev-hodnota

2.2.2 V ´yhody a nev ´yhody

Oproti jin ´ym form´at ˚um m´a JSON nˇekolik´asobnˇe menˇs´ı velikost. Je jednoduˇse ˇciteln ´y i zapisovateln ´y ˇclovˇekem a snadno analyzovateln ´y i generovateln ´y strojovˇe.

Co se t ´yˇce nev ´yhod z hlediska bakal´aˇrsk´e pr´ace, JSON nen´ı tak rozˇs´ıˇren jako XML.

Hlavnˇe co se t ´yˇce podpory v .NET frameworku.

2.2.3 Pˇr´ıklad dokumentu

Opˇet uvaˇzme stejnou tabulku uˇzivatel ˚u z pˇredeˇsl´eho pˇr´ıkladu. Serializace dos´ahneme tˇr´ıdou JsonWriter, kter ´y je souˇc´ast´ı extern´ı knihovny Json.NET. Moˇznost´ı je v´ıc, z´aleˇz´ı na pouˇzit´e knihovnˇe. V ´ysledn ´y JSON dokument bude vypadat n´asledovnˇe.

1 new Uzivatel(

2 new Radek(

3 ” id uzivatele ” : ”buc0022”,

4 ”jmeno”: ”Martin”,

5 ” prijmeni ” : ”Bucek”,

6 ”email”: ”martinbucek@seznam.cz”

7 ) ,

8 new Radek(

9 ” id uzivatele ” : ”nov0011”,

10 ”jmeno”: ”Jan”,

11 ” prijmeni ” : ”Novak”,

12 ”email”: ”jannovak@gmail.com”

13 ) )

V ´ypis 3: JSON dokument

Zde m ˚uˇzeme vidˇet, ˇze pˇr´ıklad tohoto dokumentu zcela neodpov´ıd´a pouˇz´ıt´ı kolekci n´azev- hodnota z obr´azku 2 v ´yˇse. Zm´ınil jsem nedostateˇcnou podporu JSONu v .NET frameworku.

Abych mohl v ˚ubec uskuteˇcnit serializaci do JSON form´atu, musel jsem st´ahnout nˇejakou extern´ı DLL knihovnu. Pouˇzil jsem knihovnu JSON.NET a jako jedinou alternativu k

(19)

objektu kolekce n´azev-hodnota jsem naˇsel tzv. konstruktory. Proto je dokument trochu odliˇsn ´y.

N´asledn´a funkce pro serializaci vypad´a n´asledovnˇe.

1 using (FileStream fs = new FileStream(” ../../ Zalohy/Json.json”, FileMode.Create))

2 using (StreamWriter sw = new StreamWriter(fs))

3 using (JsonWriter jw = new JsonTextWriter(sw))

4 {

5 jw.Formatting = Newtonsoft.Json.Formatting.Indented;

6 jw.WriteStartConstructor(tableName);

7 foreach (DataRow row in tableOfContents.Rows)

8 {

9 jw.WriteStartConstructor(”Radek”);

10 foreach (DataColumn column in tableOfContents.Columns)

11 {

12 jw.WriteRawValue(new JsonStringValue(column.ColumnName.ToString(), row[

column].ToString().Trim()).ToString());

13 }

14 jw.WriteEndConstructor();

15 }

16 jw.WriteEndConstructor();

17 }

V ´ypis 4: Serializace do JSON form´atu

Funkce pouˇz´ıv´a k z´apisu JsonWriter, kter ´y jako parametr pˇrij´ım´a jak ´ykoliv TextWri- ter. Na ˇr´adc´ıch 6 a 9 ve v ´ypisu zdrojov´eho k ´odu se pr´avˇe pouˇz´ıv´a z´apis v ´yˇse zm´ınˇen ´ych konstruktor ˚u. Uvnitˇr konstuktor ˚u jsou p´ary n´azev-hodnota, kter´e se zapisuj´ı pomoc´ı me- tody JsonStringValue() na ˇr´adku 12, kter´a jako parametry pˇrij´ım´a pr´avˇe n´azev a hodnotu.

N´azev reprezentuje n´azev sloupce a hodnota reprezentuje obsah bu ˇnky v dan´em ˇr´adku tabulky. M ˚uˇzeme vidˇet urˇcitou podobnost pouˇzit´ı metody JsonStringValue() ve v ´ypisu zdrojov´eho k ´odu a pˇr´ıkladem kolekce z obr´azku 2. Nicm´enˇe pˇri bliˇzˇs´ım pohledu se liˇs´ı v syntaxi. M´ısto sloˇzen ´ych z´avorek jsou pouˇzit´e klasick´e z´avorky a pˇred kaˇzd ´ym kon- struktorem se nach´az´ı slovo new pro oznaˇcen´ı zaˇc´atku nov´e ˇc´asti dokumentu.

2.3 YAML

YAML navrhnuli spoleˇcnˇe v roce 2001 Clark Evans, Ingy d ¨ot Net a Oren Ben-Kiki. Jedn´a se o textov ´y form´at, kter ´y se pouˇz´ıv´a pro uloˇzen´ı dat datab´azov´eho typu. Je do jist´e m´ıry podobn ´y JSONu.

2.3.1 V ´yhody a nev ´yhody

YAML m´a nˇekolikan´asobnˇe mˇenˇs´ı velikost neˇz ostatn´ı textov´e form´aty a nav´ıc je jed- noduˇse ˇciteln ´y i zapisovateln ´y ˇclovˇekem a snadno analyzovateln ´y i generovateln ´y stro- jovˇe. V syntaxi pouˇz´ıv´a tzv. sekvence, mapy a scalary. Lze je libovolnˇe skl´adat do sloˇzitˇejˇs´ıch celk ˚u jako tˇreba sekvence sekvenc´ı a do kaˇzd´e t´eto sekvence pˇridat mapu. V koneˇcn´em v ´ysledku je dokument vcelku ˇcitelnˇejˇs´ı neˇz ostatn´ı form´aty.

Co se t ´yˇce podpory v .NET frameworku, je na tom stejnˇe jako JSON.

(20)

2.3.2 Z ´aklady syntaxe

Syntakticky je YAML urˇcitˇe bl´ıˇze JSONu neˇz XML. To z d ˚uvodu absence koncov ´ych a pr´azdn ´ych tag ˚u. YAML dokument m ˚uˇze zaˇc´ınat deklarac´ı. Je to odboba prologu u XML.

Ovˇsem z´apis vypad´a uplnˇe jinak.

%YAML 1.2 ---

Za deklarac´ı m ˚uˇzeme vidˇet jak´esi oznaˇcen´ı pro zaˇc´atek nov´eho dokumentu ve formˇe tˇr´ı pomlˇcek. Konec dokumentu je pro zmˇenu oznaˇcen tˇremi teˇckami.

Uˇz v ´yˇse jsou ˇc´asteˇcnˇe zm´ınˇeny z´akladn´ı prvky syntaxe YAML. Pojd’me se na nˇe pod´ıvat detailnˇeji. Z´akladn´ım prvkem YAML dokumentu je tzv. scalar. Nen´ı to nic jin´eho neˇz pouh´a promˇenn´a typu string. V dokumentu m ˚uˇze b ´yt ohraniˇcena ´uvozovkami, ale nen´ı to podm´ınka.

Dalˇs´ım prvkem dokumentu je sekvence. Pozn´ame jej tak, ˇze zaˇc´ın´a vˇzdy pomlˇckou.

Sekvence m ˚uˇzeme skl´adat dohromady s dalˇs´ımi sekvencemi a vytvoˇrit tak sloˇzitˇejˇs´ı struk- turu. Pˇr´ıklad takov ´ych sekvenc´ı je vysvˇetlen v dalˇs´ı podkapitole. Posledn´ı d ˚uleˇzit ´y prvek syntaxe je mapa. Je to klasick´a konstrukce kl´ıˇc-hodnota, kter´e zn´ame z r ˚uzn ´ych progra- movac´ıch jazyk ˚u jako slovn´ık nebo asociativn´ı pole.

Jm´eno: Martin Pˇr´ıjmen´ı: Buˇcek

YAML toho nab´ız´ı co se t ´yˇce syntaxe jeˇstˇe v´ıce, ale pro ´uvod bude tohle staˇcit. V dalˇs´ıch podkapitol´ach nejsou jin´e prvky pouˇz´ıv´any.

2.3.3 Pˇr´ıklad dokumentu

Pouˇzijeme opˇet stejnou tabulku uˇzivatel ˚u. Jelikoˇz YAML nen´ı standardnˇe podporov´an v .NET frameworku, mus´ıme pouˇz´ıt opˇet nˇejakou extern´ı DLL knihovnu.V naˇsem pˇr´ıpadˇe to bude knihovna sn´azevm YamlSerializer. K v ´ysledn´e serializaci pouˇzijeme YamlWriter.

Na v ´ystupu dostaneme tento YAML dokument.

1 −−−

2 − Uzivatel

3 − − id uzivatele: buc0022

4 − − − jmeno: Martin

5 − − − prijmeni: Bucek

6 − − − email: martinbucek@seznam.cz

7 − − id uzivatele: nov0011

8 − − − jmeno: Jan

9 − − − prijmeni: Novak

10 − − − email: jannovak@gmail.com

11 ...

V ´ypis 5: YAML dokument

(21)

V tomto dokumentu lze vidˇet pouˇzit´ı v ´yˇse uveden ´ych konstrukˇcn´ıch prvk ˚u, kter´e YAML nab´ız´ı. N´azev tabulky Uzivatel na druh´em ˇr´adku je scalar, ale tak´e z´arove ˇn sek- vence. Tedy zbytek dokumentu patˇr´ı pod tuto sekvenci, coˇz vytvoˇr´ı ve v ´ysledku vcelku pˇrehlednou hierachii. N´ıˇze v dokumentu je pouˇzita konstrukce sekvence sekvenc´ı a mapy.

Mapy jsou velice podobn´e kolekci n´azev-hodnota jako u JSONu.

Funkce pro serializaci do YAML form´atu vypad´a takto.

1 foreach ( string tableName in list )

2 {

3 command = new SqlCommand(”Select ∗ from ” + tableName + ”;”, connection);

4 adapter = new SqlDataAdapter(command);

5 DataTable tableOfContents = new DataTable();

6 adapter. Fill (tableOfContents);

7 var yaml = new YamlSequence();

8 YamlScalar scalar = new YamlScalar(tableName);

9 yaml.Add(scalar);

10 int i = 0;

11 foreach (DataRow row in tableOfContents.Rows)

12 {

13 i = 0;

14 foreach (DataColumn column in tableOfContents.Columns)

15 {

16 if ( i == 0)

17 {

18 yaml.Add(new YamlSequence(new YamlMapping(column.ColumnName.

ToString(), row[column].ToString().Trim())));

19 }

20 else

21 yaml.Add(new YamlSequence(new YamlSequence(new YamlMapping(column.

ColumnName.ToString(), row[column].ToString().Trim()))));

22 i ++;

23 }

24 }

25 yaml.ToYamlFile(” ../../ Zalohy/” + tableName + ”.yaml”);

26 }

V ´ypis 6: Serializace do YAML form´atu

Tato serializace funguje odliˇsnˇeji neˇz u pˇredeˇsl ´ych form´at ˚u. Veˇsker´e poˇzadovan´e data ze serveru se nejprve mus´ı nahr´at do libovoln´e pomocn´e promˇenn´e typu var a pot´e se pomoc´ı funkce ToYamlFile() serializuj´ı do YAML souboru. M ˚uˇzeme si vˇsimnout na ˇr´adku 7 v ´ypisu zdrojov´eho k ´odu, ˇze promˇenn´a je deklarov´ana pˇr´ımo jako sekvence. D´ıky tomu je cel ´y dokument uloˇzen jako jedna velk´a sekvence. Pot´e se postupnˇe do pomocn´e promˇenn´e pˇrid´avaj´ı jednotliv´e data.

M ˚uˇzeme vidˇet tak´e n´azornou uk´azku v ´yˇse zm´ınˇen´eho skl´ad´an´ı jednotliv ´ych kon- strukˇcn´ıch prvk ˚u YAML. Na ˇr´adku 8 je pˇrid´an scalar jako n´azev tabulky. Do dokumentu se zap´ıˇse jako sekvence, protoˇze je to prvn´ı prvek v dokumentu a cel ´y dokument je jedna vˇetˇs´ı sekvence. Pˇri bliˇzˇs´ım pohledu tato konstrukce pˇripom´ın´a koˇrenov ´y element v XML.

D´ale na ˇr´adc´ıch 16 aˇz 18 se spojuje sekvence s mapou. Z´arove ˇn je takto ˇreˇseno oddˇelen´ı jednotliv ´ych z´aznam ˚u tabulky pomoc´ı jednoduch´eho ˇc´ıtaˇce. A na zb ´yvaj´ıc´ıch ˇr´adc´ıch se skl´ad´a sekvence se sekvenc´ı a mapou. Teoreticky by tento zp ˚usob serializace nemusel

(22)

b ´yt pro vˇetˇs´ı datab´aze zrovna nejrychlejˇs´ı kv ˚uli nahr´av´an´ı veˇsker ´ych dat do pomocn´e promˇenn´e.

2.4 SQL 2.4.1 P ˚uvod

SQL je zcela jednoznaˇcnˇe nejstarˇs´ı ze vˇsech v ´yˇse zm´ınˇen ´ych form´at ˚u. Prakticky se jedn´a o dotazovac´ı jazyk, ale lze jej pojmout tak´e jako textov ´y form´at. Jeho historie se datuje aˇz do 70.let minul´eho stolet´ı. SQL byl vyvinut ve spoleˇcnosti IBM p´any Donaldem D.

Chamberlinem a Raymondem F. Boycem. Prvn´ı verze mˇela n´azev SEQUEL. Byl pouˇz´ıv´an v R Syst´emech.

Osmdes´at´a l´eta lze povaˇzovat za poˇc´atek zlat´eho vˇeku relaˇcn´ıch datab´az´ı. V roce 1987 ISO a ANSI publikuj´ı poˇc´ateˇcn´ı standard SQL, v roce 1989 ISO publikuje dodatek Inte- grity Enhancement Feature a zaˇc´ın´a se hovoˇrit o SQL89. V roce 1992 doch´az´ı k prvn´ı upravˇe tohoto ISO standardu, kter ´y je pak zn´am jako SQL2 nebo SQL92.

Prvn´ı v ´yznamˇejˇs´ı produkty, kde byl jazyk SQL zabudov´an, byly od IBM: DB2, SQL/DS (oba vych´azej´ı ze Syst´emu R) a QMF. S n´astupem poˇc´ıtaˇc ˚u tˇr´ıdy PC zaˇcaly i ostatn´ı v ´yrobci v´ıce uvaˇzovat o SQL. Asi nejzn´amˇejˇs´ı je firma Ashton-Tate se svou dBASE IV (i kdyˇz implementace SQL nebyla ´upln´a). Jako dalˇs´ı jmenujme INFORMIX-SQL, INGRES pro PC, ORACLE, SQLBase, XDB II, XQL. Postupem ˇcasu se zaˇcal jazyk SQL pˇren´aˇset i na syst´em UNIX a od jednouˇzivatelsk ´ych ´uloh se pˇrech´azelo k server ˚um zaloˇzen ´ych na SQL. Jmenujme aspo ˇn S ˇRBD ORACLE, INFORMIX, PROGRESS a INGRES. D´ale napˇr.

SQL Server od firmy Sybase ˇci Microsoft.

U tohoto form´atu nebude detailnˇe popisov´ana syntaxe jako u pˇredeˇsl ´ych form´at ˚u, protoˇze syntaxe SQL je rozˇs´ıˇrena a zn´ama.

Obr´azek 3: Syntaxe SQL

2.4.2 Pˇr´ıklad dokumentu

1 INSERT INTO Uzivatel(login, jmeno, prijmeni, email) values(’buc0022’,’Martin’ , ’ Buˇcek’,’

martinbuck@seznam.cz’);

2 INSERT INTO Uzivatel(login, jmeno, prijmeni, email) values(’nov0011’,’Jan’, ’ Nov ´ak’,’

jannovak@gmail.com’);

V ´ypis 7: SQL form´at

(23)

Jednotliv´e z´aznamy jsou uloˇzeny v podobˇe klasick ´ych insert ˚u. Ovˇsem SQL nen´ı pˇr´ıliˇs vhodn ´y form´at pro tuto bakal´aˇrskou pr´aci. Pˇri nˇekolika tis´ıci z´aznamech by mnoˇzstv´ı insert ˚u bylo obrovsk´e a proces serializace by nebyl zrovna nejefektivnˇejˇs´ı zejm´ena kv ˚uli velmi redundantn´ı syntaxi SQL.

(24)

3 Uk ´azkov ´y pˇr´ıklad pouˇzit´ı

C´ılem t´eto kapitoly je ˇcten´aˇre sezn´amit s uk´azkov ´ym pˇr´ıkladem pouˇzit´ı vytvoˇren´eho n´astroje. V t´eto kapitole bude prob´ır´an ´uˇcel n´astroje a tak´e krok po kroku n´avod k jeho pouˇzit´ı. Budou tak´e vysvˇetleny okrajov´e situace, kter´e mohou v uk´azkov´em pˇr´ıkladu nastat. Cel´a tato sekce pracuje se smyˇslenou datab´az´ı, kter´a je z´amˇernˇe trivi´aln´ı kv ˚uli pˇrehlednosti. Po pˇreˇcten´ı t´eto kapitoly by ˇcten´aˇr mˇel b ´yt schopen n´astroj bez probl´emu spustit a pouˇz´ıvat.

3.1 Uvod do aplikace´

N´astroj je naimplementov´an jako CLI aplikace v jazyce C#. Tud´ıˇz jeho spuˇstˇen´ı je moˇzn´e realizovat pouze pˇres pˇr´ıkazov ´y ˇr´adek v operaˇcn´ım syst´emu. U uˇzivatele se pˇredpokl´ad´a alespo ˇn z´akladn´ı znalost pr´ace v pˇr´ıkazov´em ˇr´adku pomoc´ı jednoduch ´ych pˇr´ıkaz ˚u. Pro implementaci bylo vybr´ano v ´yvojov´e prostˇred´ı Visual Studio 2010 od Microsoftu.

Obr´azek 4: CLI rozhran´ı

Jelikoˇz c´ılem n´astroje je z´alohov´an´ı a obnovat dat z libovoln´eho datab´azov´eho ser- veru, uˇzivatel mus´ı m´ıt pˇred spuˇstˇen´ım potˇrebn´e ´udaje k ´uspˇeˇsn´emu pˇripojen´ı na tento server. Po konzultaci s vedouc´ım bakal´aˇrsk´e pr´ace byl vybr´an Microsoft SQL Server.

Uˇzivatel se tedy bude muset omezit pouze na pr´aci s t´ımto typem serveru. N´astroj bude schopen plnˇe fungovat jedinˇe pˇri ´uspˇeˇsn´em pˇripojen´ı uˇzivatele na server.

3.2 Pr ´ace s pˇr´ıkazov ´ym ˇr ´adkem

Abychom mohli aplikaci spustit pˇres pˇr´ıkazov ´y ˇr´adek, mus´ıme vˇedˇet kde se ona apli- kace nach´az´ı. Pro jednoduchost tohoto uk´azkov´eho pˇr´ıkladu uvaˇzujme, ˇze je sloˇzka s aplikac´ı uloˇzena v koˇrenov´em adres´aˇri na disku C:\. Pro pˇresunut´ı do sloˇzky aplikace v pˇr´ıkazov´em ˇr´adku pouˇzijeme n´asleduj´ıc´ı pˇr´ıkaz:

cd cesta

(25)

Tento pˇr´ıkaz pˇrij´ım´a jako parametr cestu k souboru. Proto je lepˇs´ı si naj´ıt nejprve klasicky v operaˇcn´ım syst´emu danou sloˇzku a zkop´ırovat cestu pˇr´ımo do pˇr´ıkazov´eho ˇr´adku jako parametr k pˇr´ıkazu.

Je moˇzn´e, ˇze pˇred samotn ´ym spuˇstˇen´ım se budete v pˇr´ıkazov´em ˇr´adku nach´azet na jin´em disku neˇz je C. V tom pˇr´ıpadˇe v´am nebude v ´yˇse uveden ´y pˇr´ıkaz fungovat. Mus´ıte se pˇresunout na dan ´y disk. Pro pˇrechod na tento disk staˇc´ı napsat n´asleduj´ıc´ı pˇr´ıkaz a potvrdit kl´avesou Enter:

C:

3.3 Vytvoˇren´ı datab ´aze

N´astroj funguje t´ım zp ˚usobem, ˇze z´alohuje vˇsechny tabulky z dan´e datab´aze. Pˇrihlaˇste se tedy na sv ˚uj ´uˇcet na libovoln´em Microsoft SQL serveru 2008 nebo vyˇsˇs´ım a vytvoˇrte pr´azdnou datab´azi. Nutno podotknout, ˇze k vytvoˇren´ı nov´e datab´aze mus´ıte m´ıt pˇr´ıstupov´a pr´ava. V opaˇcn´em pˇr´ıpadˇe datab´azi nevytvoˇr´ıte. D´ale stoj´ı za zm´ınku se pˇripojit do virtu´aln´ı priv´atn´ı s´ıtˇe, pokud je to nutn´e.

Obr´azek 5: Vytvoˇren´ı datab´aze

3.4 Nahr ´an´ı inicializa ˇcn´ıho skriptu

Nyn´ı kdyˇz m´ame vytvoˇrenou pr´azdnou datab´azi mˇeli bychom ji naplnit nˇejak ´ymi tabul- kami, aby mˇel n´astroj s ˇc´ım pracovat. V pˇr´ıloh´ach t´eto pr´ace najdete sloˇzku s SQL skripty.

V tomto kroce n´as bude zaj´ımat pouze skript s n´azvem z´aklad.sql. Tento skript vy- tvoˇr´ı velice jednoduchou datab´azi. Tato datab´aze m´a pouze tˇri tabulky. Reprezentuje jed- noduch ´y rezervaˇcn´ı syst´em nˇejak´eho fiktivn´ıho divadla. Navazuje ˇc´asteˇcnˇe na tabulku uˇzivatel ˚u z pˇredchoz´ı kapitoly, kter´a se zab ´yvala textov ´ymi form´aty. Uˇzivatel´e si mohou rezervovat m´ısta na dan´e pˇredstaven´ı. Libovoln ´y poˇcet uˇzivatel ˚u si m ˚uˇze zarezervovat

(26)

libovoln ´y poˇcet pˇredstaven´ı. Z toho vypl ´yv´a, ˇze mezi tabulkami uˇzivatele a pˇredstaven´ı bude M:N vazba a tabulka rezervace je vazebn´ı tabulka.

Obr´azek 6: ER Diagram

Prohl´ednˇete si ER Diagram dan´e datab´aze. Zejm´ena kv ˚uli porovn´an´ı s pozdˇejˇs´ım v ´ystupem aplikace. Tento skript tak´e dan´e tabulky napln´ı. V pˇr´ıpadˇe probl´em ˚u lze vyuˇz´ıt skript pro smaz´an´ı vˇsech tabulek z relaˇcn´ı datab´aze a nahr´at vˇse znova.

3.5 Z ´alohov ´an´ı datab ´aze

Nyn´ı se koneˇcnˇe dost´av´ame k vyuˇzit´ı dan´eho n´astroje. Pro z´alohov´an´ı pouˇzijeme d´avkov ´y soubor zaloha.bat, kter ´y se nach´az´ı ve sloˇzce s aplikac´ı. Tento soubor pˇrij´ım´a 4 parametry, kter´e jsou nutn´e k ´uspˇeˇsn´emu pˇrihl´aˇsen´ı na v´aˇs server. Pˇr´ıkaz pro spuˇstˇen´ı d´avkov´eho souboru bude vypadat n´asledovnˇe.

zaloha nazev serveru nazev databaze login heslo

Za parametry dosad´ıme ´udaje o serveru, kter ´y chceme z´alohovat. Po zad´an´ı tˇechto

´udaj ˚u se v pˇr´ıpadˇe ´uspˇeˇsn´eho pˇripojen´ı objev´ı informativn´ı zpr´ava o ´uspˇeˇsn´em pˇripojen´ı na v´as server a dostanete se do prostˇred´ı n´astroje. Pot´e budete vyzv´ani k naps´an´ı n´azvu z´aloˇzn´ıho XML souboru, kter ´y bude obsahovat data z vaˇseho serveru.

M ˚uˇze nastat takov´a situace, ˇze zad´ate n´azev jiˇz existuj´ıc´ıho n´azvu XML dokumentu.

V tom pˇr´ıpadˇe v´am n´astroj nab´ıdne moˇznost pˇreps´an´ı cel´eho souboru anebo m ˚uˇzete za- dat n´azev znova. Cel´e se to dˇeje v cyklu, tud´ıˇz m ˚uˇzete zadat i v´ıcekr´at za sebou ˇspatn ´y n´azev a nic se nedˇeje. Po potvrzen´ı dostanete informativn´ı zpr´avu o ´uspˇeˇsn´em vytvoˇren´ı z´aloˇzn´ıho souboru a aplikace se vypne.

(27)

Obr´azek 7: Z´alohov´an´ı

Obr´azek demostruje bˇeh aplikace bˇehem procesu z´alohov´an´ı.

XML dokument se ukl´ad´a do sloˇzky Z´alohy ve sloˇzce s aplikac´ı. Zkuste si jej otevˇr´ıt a zkontrolovat s daty z vaˇs´ı relaˇcn´ı datab´aze. Z´arove ˇn v t´eto sloˇzce m ˚uˇzete naleznete k dan´emu XML dokumentu i dalˇs´ı XML dokument se sch´ematem cel´e datab´aze. Tyto soubory patˇr´ı vˇzdy k sobˇe. Pozn´ate jej podle sufixu Schema, kter ´y je pˇrid´an k p ˚uvodn´ımu n´azvu souboru. V ´ystupn´ı XML dokument bude vypadat n´asledovnˇe.

1 <Databaze>

2 <Predstaveni>

3 <Radek>

4 <id predstaveni>p1</id predstaveni>

5 <nazev>Prodan ´a nev ˇesta</nazev>

6 <zanr>Opera</zanr>

7 <datum a cas konani>22.2.2013 15:55:00</datum a cas konani>

8 <pocet listku />

9 </Radek>

10 <Radek>

11 <id predstaveni>p2</id predstaveni>

12 <nazev>Braniboˇri v ˇCech ´ach</nazev>

13 <zanr>Opera</zanr>

14 <datum a cas konani>22.4.2013 17:00:00</datum a cas konani>

15 <pocet listku />

16 </Radek>

17 <Radek>

18 <id predstaveni>p3</id predstaveni>

19 <nazev>Sluha dvou p ´an ˚u</nazev>

20 <zanr>Komedie</zanr>

21 <datum a cas konani>22.7.2013 14:15:00</datum a cas konani>

22 <pocet listku />

23 </Radek>

24 <Radek>

25 <id predstaveni>p4</id predstaveni>

(28)

26 <nazev>Lakomec</nazev>

27 <zanr>Komedie</zanr>

28 <datum a cas konani>22.1.2013 18:00:00</datum a cas konani>

29 <pocet listku />

30 </Radek>

31 </Predstaveni>

32 <Rezervace>

33 <Radek>

34 <id uzivatele>buc0022</id uzivatele>

35 <id predstaveni>p1</id predstaveni>

36 <cena>500</cena>

37 <datum splatnosti>21.2.2013 15:55:00</datum splatnosti>

38 </Radek>

39 <Radek>

40 <id uzivatele>buc0022</id uzivatele>

41 <id predstaveni>p2</id predstaveni>

42 <cena>750</cena>

43 <datum splatnosti>21.4.2013 17:00:00</datum splatnosti>

44 </Radek>

45 <Radek>

46 <id uzivatele>mic0109</id uzivatele>

47 <id predstaveni>p4</id predstaveni>

48 <cena>500</cena>

49 <datum splatnosti>11.6.2013 13:30:00</datum splatnosti>

50 </Radek>

51 <Radek>

52 <id uzivatele>nov0011</id uzivatele>

53 <id predstaveni>p3</id predstaveni>

54 <cena>1000</cena>

55 <datum splatnosti>21.7.2013 14:15:00</datum splatnosti>

56 </Radek>

57 </Rezervace>

58 <Uzivatel>

59 <Radek>

60 <id uzivatele>buc0022</id uzivatele>

61 <jmeno>Martin</jmeno>

62 <prijmeni>Bucek</prijmeni>

63 <email>martinbuck@seznam.cz</email>

64 </Radek>

65 <Radek>

66 <id uzivatele>mic0109</id uzivatele>

67 <jmeno>Miroslav</jmeno>

68 <prijmeni>Mikus</prijmeni>

69 <email>miroslavmikus@seznam.cz</email>

70 </Radek>

71 <Radek>

72 <id uzivatele>mik0103</id uzivatele>

73 <jmeno>Pavel</jmeno>

74 <prijmeni>Mich ´alek</prijmeni>

75 <email>pavelmichalek@email.cz</email>

76 </Radek>

77 <Radek>

78 <id uzivatele>nov0011</id uzivatele>

79 <jmeno>Jan</jmeno>

(29)

80 <prijmeni>Novak</prijmeni>

81 <email>jannovak@gmail.cz</email>

82 </Radek>

83 </Uzivatel>

84 </Databaze>

V ´ypis 8: Uk´azkov ´y XML dokument

XML form´at je detailnˇe pops´an v prvn´ı kapitole t´eto bakal´aˇrsk´e pr´ace. Proto se tato sekce nebude d´ale zab ´yvat rozborem tohoto XML dokumentu.

3.6 Uprava struktury datab ´aze´

V t´eto f´azi m´ame z´alohu v XML form´atu a tak´e vytvoˇrenou datab´azi na serveru. Prak- ticky n´am nic nebr´an´ı v pouˇzit´ı dalˇs´ı funkce n´astroje, obnovy dat. Nicm´enˇe n´astroj je rozˇs´ıˇren tak´e o moˇznost transformace datab´aze. T´e se vyuˇz´ıv´a v situaci, pokud oproti p ˚uvodn´ımu sch´ematu datab´aze sloupec ubyl nebo pˇribyl. Pro ovˇeˇren´ı tohoto rozˇs´ıˇren´ı n´astroje se opˇet pod´ıvejte do sloˇzky se skripty. Zde naleznete skript uprava.sql.

Pˇri bliˇzˇs´ım prozkoum´an´ı tohoto skriptu zjist´ıte, ˇze maˇze data a upravuje samotn´e sch´ema uk´azkov´e datab´aze. Nˇekter ´ym tabulk´am pˇrid´av´a sloupce a nˇekter ´ym zase sloupce ub´ır´a. V ´yslednou ´upravu m ˚uˇzeme vidˇet v ER Diagramu. V t´eto chv´ıli je d ˚uleˇzit´e, aby jste nespustili znovu proces z´alohov´an´ı. T´ım by byl myˇslen ´y pˇr´ıklad ztracen, protoˇze apli- kace by si uloˇzila nov´e sch´ema a transformace by neprobˇehla.

Obr´azek 8: ER Diagram po ´upravˇe

V ER Diagramu m ˚uˇzeme vidˇet v kaˇzd´e tabulce zmˇenu. V tabulce uˇzivatel ˚u pˇribyl sloupec adresa. D´ale v tabulce rezervac´ı pˇribyl sloupec ˇc´ıslo sedadla a v posledn´ı tabulce ubyl sloupec poˇcet l´ıstk ˚u.

3.7 Obnova dat

Transformace je za n´ama a nyn´ı se m ˚uˇzeme pustit do obnovy dat zpˇet na server. V pˇr´ıkazov´em ˇr´adku se pˇremistˇete opˇet do sloˇzky s aplikac´ı a najdˇete d´avkov ´y soubor ob- nova.dat. Opˇet jej spust’te stejn ´ym zp ˚usobem jako v pˇredeˇsl´em pˇr´ıpadˇe pˇri spouˇstˇen´ı d´avkov´eho souboru zaloha.dat. Pˇr´ıkaz tedy bude vypadat velice podobnˇe.

obnova nazev serveru nazev databaze login heslo

(30)

V tomto bodˇe m ˚uˇze nastat nˇekolik situac´ı. V pˇr´ıpadˇe zad´an´ı ˇspatn ´ych ´udaj ˚u v´as apli- kace informuje o ne ´uspˇechu pˇripojen´ı na server a vypne se. M ˚uˇze tak´e nastat takov´a situace, ˇze se ´uspˇeˇsnˇe pˇrihl´as´ıte na sv ˚uj server, ale z nˇejak´eho d ˚uvodu nen´ı jeˇstˇe vy- tvoˇren ´y ˇz´adn ´y z´aloˇzn´ı XML dokument. Aplikace by nemˇela s ˇc´ım pracovat a cel ´y proces by skonˇcil chybou a spadnut´ım cel´e aplikace. K oˇsetˇren´ı tohoto pˇr´ıpadu v´as aplikace in- formuje o t´eto situaci a mus´ıte nejprve vytvoˇrit z´alohu.

V pˇr´ıpadˇe ´uspˇeˇsn´eho pˇripojen´ı na server a existence z´alohy v´as aplikace informuje o

´uspˇechu a ihned v´as vyzve k zad´an´ı n´azvu souboru k obnovˇe dat. Po spr´avn´em zad´an´ı n´azvu souboru v´as syst´em informuje o tabulk´ach, kter´e byly obnoveny. Zde se projev´ı v ´yˇse zm´ınˇen´a transformace datab´aze naˇseho uk´azkov´eho pˇr´ıkladu.

Je dobr´e se pod´ıvat tak´e na sch´ema datab´aze k lepˇs´ımu porozumˇen´ı. V pˇredstaven´ı ubyl sloupec poˇcet l´ıstk ˚u. S t´ım si dok´aˇze n´astroj poradit. Pˇri ˇcten´ı XML dokumentu bude tento sloupec ignorov´an ve vˇsech z´aznamech t´eto tabulky. Sloupec ˇc´ıslo sedadla, kter ´y pˇribyl v tabulce rezervace podporuje NULL hodnoty. Tento sloupec n´astroj ˇreˇsit nemus´ı.

Ovˇsem v tabulce uˇzivatel ˚u pˇribyl sloupec adresa, kter ´y nepodporuje NULL hodnoty. U tˇechto sloupc ˚u mus´ıme rozliˇsovat, zda m´a nebo nem´a nastavenou v ´ychoz´ı hodnotu. V prvn´ım pˇr´ıpadˇe se n´astroj zachov´a stejnˇe jako u sloupce s NULL hodnotami. Pˇri obnovˇe dat se automaticky dopln´ı jeho nastaven´a v ´ychoz´ı hodnota do vˇsech novˇe vloˇzen ´ych z´aznam ˚u dan´e tabulky. T´ım se pˇredejde chyb´am a n´astroj tento sloupec nemus´ı ˇreˇsit.

Ovˇsem v druh´em pˇr´ıpadˇe S ˇRBD pˇri obnovˇe nezn´a v ´ychoz´ı hodnotu dan´eho sloupce.

Vyˇreˇs´ı to t´ım zp ˚usobem, ˇze pˇri obnovˇe vloˇz´ı do vˇsech novˇe vloˇzen ´ych z´aznam ˚u dan´e tabulky NULL hodnotu, coˇz automaticky vy ´ust´ı v chybu a obnova se neprovede.

Avˇsak n´astroj tuto situaci dok´aˇze oˇsetˇrit. V takov´eto situaci v´as pˇred obnovou n´astroj vyzve k zad´an´ı v ´ychoz´ı hodnoty. Informativnˇe je v z´avork´ach uveden i datov ´y typ dan´eho sloupce, kter ´y m´a b ´yt zad´an. Pot´e po zad´an´ı v ´ychoz´ı hodnoty sloupce n´astroj pozmˇen´ı sch´ema datab´aze a nic uˇz nebr´an´ı kompletn´ı obnovˇe dat.

Obr´azek 9: Obnova dat

(31)

Obr´azek demonstruje bˇeh n´astroje bˇehem obnovy. M ˚uˇzeme vidˇet informativn´ı zpr´avy o ´uspˇeˇsnˇe obnoven ´ych tabulk´ach a hlavnˇe v ´yzvu k zad´an´ı v ´ychoz´ı hodnoty pro sloupec adresa v tabulce uˇzivatel ˚u. Po potvrzen´ı se objev´ı zpr´ava o ´uspˇeˇsn´e obnovˇe dat tabulky uˇzivatel ˚u a aplikace se vypne. T´ımto je obnova kompletn´ı.

Pro kontrolu funkˇcnosti n´astroje se m ˚uˇzete pˇrihl´asit na v´aˇs server a zkontrolovat data v tabulk´ach. V tabulce uˇzivatel ˚u ve vˇsech z´aznamech ve sloupci adresa by mˇela b ´yt v´ami zadan´a v ´ychoz´ı hodnota. Ve sloupci ˇc´ıslo sedadla v tabulce rezervac´ı by mˇela b ´yt ve vˇsech z´aznamech NULL hodnota.

Pro udrˇzen´ı konzistence z´alohy a dat na serveru se po procesu obnovy spust´ı znova z´alohov´an´ı cel´e datab´aze i jej´ıho sch´ematu. Uˇzivatel to bˇeˇznˇe nepozn´a, protoˇze n´astroj o tom nijak neinformuje. Pot´e pˇri dalˇs´ı obnovˇe by cel ´y proces probˇehl bez transformace plnˇe automaticky. M ˚uˇzete si opˇet zkontrolovat v ´ystupn´ı XML soubor a pod´ıvat se na zmˇeny vznikl´e transformac´ı.

Datab´aze byla pro tento uk´azkov ´y pˇr´ıklad vybr´ana z´amˇernˇe trivi´aln´ı. Aplikace je schopna pracovat s mnohem vˇetˇs´ı a robustnˇejˇs´ı datab´az´ı s nˇekolika tis´ıci z´aznamy v po- rovn´an´ı s datab´az´ı v tomto textu.

Pokud by jste spustili d´avkov´e soubory pro z´alohov´an´ı a obnovu znova, probˇehlo by to automatizovanˇe bez zad´av´an´ı v ´ychoz´ıch hodnot. V tomto bodˇe by uk´azkov ´y pˇr´ıklad probˇehl bez zam ´yˇslen´e transformace, protoˇze aplikace m´a v t´eto f´azi uloˇzen´e nov´e sch´ema datab´aze vznikl´e transformac´ı. Pro spuˇstˇen´ı cel´eho procesu znova spust’te nejprve skript pro smaz´an´ı tabulek smazat.sql a pak vˇse opakujte podle jednotliv ´ych krok ˚u znova.

(32)

4 Transformace datab ´aze

C´ılem t´eto kapitoly je detailnˇejˇs´ı rozbor transformace datab´aze, kter´a byla zm´ınˇena v pˇredchoz´ı kapitole. ˇCten´aˇr by mˇel po pˇreˇcten´ı t´eto kapitoly plnˇe porozumˇet transformaci i jej´ı realizaci ve zdrojov´em k ´odu.

4.1 Na ˇcten´ı sch ´emat tabulek

Nejprve by bylo dobr´e porozumˇet celkov´emu ˇreˇsen´ı transformace ve zdrojov´em k ´odu aplikace a potom se m ˚uˇzeme pustit do ˇreˇsen´ı jednotliv ´ych situac´ı ubyt´ı a pˇrid´an´ı sloupce.

Reˇsen´ı tranformace ve zdrojov´em k ´odu stoj´ı na funkci porovn´av´an´ı struktury. Nejprveˇ vˇsak mus´ı b ´yt nˇeco k porovn´an´ı.

Z´akladn´ım kamenem je funkce SchemaRestore, kter´a pˇri obnovˇe dat naˇc´ıt´a sch´ema datab´aze z XML dokumentu. Funkce nejprve naˇcte z dokumentu n´azvy tabulek. Pot´e podle pˇr´ıˇsluˇsn´eho n´azvu z´alohov´an´e tabulky z´arove ˇn tato funkce vytvoˇr´ı sch´ema t´eto tabulky i z SQL serveru a tyto dvˇe vytvoˇren´e tabulky pˇred´a jako 2 parametry funkci SchemaComparison, kter´a tyto dvˇe tabulky porovn´av´a.

COLUMN NAME IS NULLABLE COLUMN DEFAULT DATA TYPE

login NO varchar

jmeno YES varchar

prijmeni YES varchar

email NO (’seznam@cz’) varchar

Tabulka 2: Pˇr´ıklad tabulky se sch´ematem

Tato tabulka je kl´ıˇcov´a pro uskuteˇcnˇen´ı transformace. Pro jej´ı uloˇzen´ı pouˇzijeme v k ´odu tˇr´ıdu DataTable, kter´a je souˇc´ast´ı ADO.NET. Jako sloupce obsahuje pouze nutn´e atributy, kter´e jsou potˇrebn´e k realizaci transformace. Kompletn´ı sch´ema datab´aze je mnohem vˇetˇs´ı, ale pro n´aˇs pˇr´ıpad bude staˇcit pouze tohle. V podstatˇe tato tabulka ob- sahuje metadata o tabulce v datab´azi.

Tabulky se sch´ematem datab´aze se v aplikaci vytv´aˇrej´ı vˇzdy pro jednu tabulku v jed- nom pr ˚ubˇehu cyklu. Pot´e probˇehne porovn´an´ı ve funkci SchemaComparison. Pot´e na z´akladˇe porovn´an´ı obou tabulek probˇehnou nebo neprobˇehnou urˇcit´e operace, kter´e si pop´ıˇsem pozdˇeji a pot´e se zase vytvoˇr´ı nov´a tabulka se sch´ematem. K naˇcten´ı t´eto tabulky z XML dokumentu byl pouˇzit XmlTextReader. XmlTextReader je standardnˇe podporov´an v .NET frameworku. Je odvozen od abstraktn´ı tˇr´ıdy XmlReader. Pˇredstavuje dopˇredn ´y pˇr´ıstup k proudu dat XML. Jedn´a se o velice rychl ´y zp ˚usob ˇcten´ı dat z XML dokumentu.

Zp ˚usob ˚u ˇcten´ı dokumentu je v´ıce.

M ˚uˇzeme napˇr´ıklad pouˇz´ıt tˇr´ıdu XmlDocument a pot´e pouˇz´ıt selekci v podobˇe zad´an´ı XPath v ´yraz ˚u pro v ´ybˇer dat. Ovˇsem v tomto ohledu nemus´ı b ´yt tento zp ˚usob pˇr´ıliˇs efek- tivn´ı, protoˇze dokument se mus´ı naˇc´ıst do pamˇeti a pot´e s n´ım lze pracovat. Naˇc´ıt´an´ı do pamˇeti u tohoto zp ˚usobu je nutn´e, protoˇze je potˇreba zn´at stromovou strukturu XML do- kumentu k pouˇzit´ı XPath v ´yraz ˚u. XmlTextReader funguje opaˇcnˇe. Nemus´ı nic naˇc´ıtat do

(33)

pamˇeti a to jej dˇel´a velice rychl ´ym. Pouze se posouv´a od jednoho elementu k druh´emu a postupnˇe vˇsechny ˇcte.

1 while ( r .Read() && r.LocalName != tableName)

2 {

3 if ( r .LocalName.Equals(”Column”))

4 {

5 DataRow row = table.NewRow();

6 while ( r .Read() && r.LocalName != ”Column”)

7 {

8 if ( r .NodeType.Equals(XmlNodeType.Element))

9 {

10 if (! r .IsEmptyElement)

11 row[r .LocalName] = r.ReadString();

12 else

13 row[r .LocalName] = ””;

14 }

15 }

16 table .Rows.Add(row);

17 }

18 }

V ´ypis 9: Naˇcten´ı XML sch´ematu

M ˚uˇzeme vidˇet pouze fragment z k ´odu naˇc´ıt´an´ı sch´ematu. Cel´a funkce je mnohem delˇs´ı.

XmlTextReader realizuje sv ˚uj dopˇredn ´y pˇr´ıstup metodou Read. Respektive se d´ıky t´eto metodˇe posouv´a od jednoho elementu k druh´emu. Pro vytvoˇren´ı v ´yˇse uveden´e tabulky vytvoˇr´ıme nov ´y pr´azdn ´y ˇr´adek tabulky a pot´e vloˇz´ıme vˇsechny hodnoty element ˚u, kter´e se nach´az´ı ohraniˇceny elementem s n´azvem Column. Tento element slouˇz´ı pro oddˇelen´ı jednotliv ´ych z´aznam ˚u. Je to podobn´a struktura XML dokumentu jako u pˇredchoz´ıch v ´ypis ˚u.

Jeˇstˇe zb ´yv´a naˇc´ıst sch´ema tabulky ze serveru. Samozˇrejmˇe druh´a tabulka bude m´ıt naprosto totoˇznou strukturu, co se sloupc ˚u t ´yˇce. V poˇctu a obsahu ˇr´adk ˚u uˇz se mohou liˇsit. Tabulku ze serveru z´ısk´ame jednoduch ´ym SQL dotazem. Pouˇzijeme syst´emov ´y ka- talog.

SELECT COLUMN_NAME,IS_NULLABLE,COLUMN_DEFAULT,DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ’@tableName’;

Za @tableName dosad´ıme jako parametr n´azev tabulky, jej´ıˇz sch´ema chceme naˇc´ıst ze serveru.

4.2 Porovn ´an´ı sch ´emat ˚u

Nyn´ı m´ame vytvoˇren´e tabulky sch´emat a n´astroj uˇz m´a co porovnat. V t´eto kapitole se pod´ıv´ame bl´ıˇze na funkci, kter´a porovn´av´a obˇe tabulky se sch´ematem. Ta je j´adrem cel´e transformace. Nejprve se porovn´a poˇcet ˇr´adk ˚u v obou tabulk´ach. Tak se jednoduˇse zjist´ı zda sloupec ubyl nebo pˇribyl. V pˇr´ıpadˇe stejn´eho poˇctu ˇr´adk ˚u se zavol´a funkce pro ob- novu dan´e tabulky a transformace neprobˇehne.

(34)

4.2.1 Sloupec ubyl

M ˚uˇze nastat situace, ˇze sloupec oproti p ˚uvodn´ımu sch´ematu ubyl. To znamen´a, ˇze v tabulce naˇcten´e z XML dokumentu je o ˇr´adek v´ıce neˇz v tabulce naˇcten´e ze serveru. V tom pˇr´ıpadˇe se vytvoˇr´ı dalˇs´ı tabulka, kter´a bude obsahovat rozd´ıln´e ˇr´adky, kter´e jsou v jedn´e tabulce a z´arove ˇn nejsou v tabulce naˇcten´e ze serveru. N´aslednˇe se z t´eto tabulky naˇctou pouze n´azvy sloupc ˚u do pˇredem pˇripraven´e glob´aln´ı generick´e kolekce. Pot´e je zavol´ana funkce pro obnovu dat. Pˇri obnovˇe se budou ignorovat vˇsechny n´azvy sloupc ˚u, kter´e jsou obsaˇzeny v generick´e kolekci.

1 var diff = xmlTable.AsEnumerable().Where(r => !sqlTable.AsEnumerable().Select(x => x[”

COLUMN NAME”]).ToList().Contains(r[”COLUMN NAME”])).ToList();

2 DataTable result = diff .CopyToDataTable();

V ´ypis 10: Vytvoˇren´ı tabulky

V ´ypis demonstruje vytvoˇren´ı tabulky s n´azvem result s rozd´ıln ´ymi ˇr´adky ze dvou p ˚uvodn´ıch tabulek. Jak uˇz n´azev vypov´ıd´a, XmlTable je tabulka naˇc´ıt´ana z XML souboru a SqlTable je tabulka naˇc´ıt´ana ze serveru. Jin ´ymi slovy tento k ´od vybere vˇsechny ˇr´adky z Xml- Table, kter´e nejsou obsaˇzen´e v tabulce SqlTable. Struktura tabulky bude opˇet stejn´a jako v pˇredeˇsl´em pˇr´ıpadˇe u naˇc´ıt´an´ı sch´emat. Pouˇzijeme promˇennou typu var, do kter´e nahra- jeme potˇrebn´e z´aznamy. A pot´e pˇres funkci CopyToDataTable nahrajeme data do tabulky result.

4.2.2 Sloupec pˇribyl

Logicky m ˚uˇze tak´e nastat situace, ˇze sloupec oproti p ˚uvodn´ımu sch´ematu pˇribyl. V tomto pˇr´ıpadˇe opˇet vytvoˇr´ıme velice podobn ´ym zp ˚usobem tabulku s n´azvem result jako v si- tuaci s ubyt´ım sloupce.

1 var diff = sqlTable.AsEnumerable().Where(r => !xmlTable.AsEnumerable().Select(x => x[”

COLUMN NAME”]).ToList().Contains(r[”COLUMN NAME”])).ToList();

2 DataTable result = diff .CopyToDataTable();

V ´ypis 11: Vytvoˇren´ı tabulky

M ˚uˇzeme vidˇet, ˇze k ´od je na prvn´ı pohled prakticky totoˇzn ´y v pˇredeˇsl ´ym. Pˇri bliˇzˇs´ım po- hledu si lze vˇsimnout z´amˇeny XmlTable za SqlTable. Tento k ´od vybere ˇr´adky z SqlTable, kter´e se neshoduj´ı s ˇr´adky v XmlTable. Takto zaj´ıst´ıme, ˇze dan´a tabulka bude obsahovat pouze sloupce, kter´e pˇribyly oproti p ˚uvodn´ımu sch´ematu.

Ovˇsem v t´eto f´azi mus´ı n´astroj jednotliv´e ˇr´adky tabulky result zanalyzovat detailnˇeji.

Pro tento pˇr´ıpad n´astroj pouˇz´ıv´a dalˇs´ı funkci, kter´a ˇreˇs´ı pr´avˇe tuto problematiku. Proch´az´ı jednotliv´e ˇr´adky t´eto tabulky a u kaˇzd´eho z nich vyhodnocuje zda podporuje ˇci nepod- poruje NULL hodnoty. Tento fakt je kl´ıˇcov ´y pro cel ´y proces transformace.

Pokud sloupec podporuje NULL hodnoty, tedy hodnota sloupce IS NULLABLE v ˇr´adku je YES, nic se nedˇeje. V tom pˇr´ıpadˇe aplikace nemus´ı nic ˇreˇsit, protoˇze se na- stav´ı implicitn´ı hodnota sloupce jako NULL a nenastane ˇz´adn´a chyba. To byl pouze jeden

(35)

pˇr´ıklad. N´astroj m ˚uˇze pˇri pr ˚uchodu tabulkou result narazit na sloupec, kter ´y nepodpo- ruje NULL hodnoty. V tom pˇr´ıpadˇe se posuneme d´al a nyn´ı mus´ıme rozliˇsovat, zda m´a sloupec nastavenou v ´ychoz´ı hodnotu.

Jestliˇze sloupec m´a nastavenou v ´ychoz´ı hodnotu, n´astroj to opˇet nemus´ı ˇreˇsit jako v pˇredeˇsl´em pˇr´ıpadˇe. Pˇri obnovˇe se nastav´ı implicitn´ı hodnota a nenastane chyba. Ovˇsem n´as zaj´ım´a posledn´ı moˇznost, kdyˇz sloupec nem´a nastavenou v ´ychoz´ı hodnotu. Norm´alnˇe by se pˇri obnovˇe nastavila implicitn´ı NULL hodnota a vˇse by vy ´ustilo v chybu, protoˇze sloupec samozˇrejmˇe nepodporuje NULL hodnoty. N´astroj ˇreˇs´ı tuto situaci pr´avˇe n´astaven´ım uˇzivatelem zadan´e v ´ychoz´ı hodnoty dan´eho sloupce. Po zad´an´ı v ´ychoz´ı hodnoty se jeˇstˇe samo o sobˇe nic nestane ani nevyˇreˇs´ı. Tato hodnota se mus´ı jeˇstˇe nastavit v datab´azi. Toho dos´ahneme n´asleduj´ıc´ım SQL dotazem.

1 command=new SqlCommand(”Alter table @tableName add constraint default value @column name default ”’@defaultValue’” for @column name’, connection);

2 command.ExecuteNonQuery();

V ´ypis 12: Nastaven´ı v ´ychoz´ı hodnoty

Pouˇzijeme SqlCommand, kter ´y inicializujeme SQL pˇr´ıkazem. Pomoc´ı alter table zmˇen´ıme n´ami poˇzadovanou v ´ychoz´ı hodnotu. Pˇrid´ame nov ´y constraint s n´azvem default value a n´azvem sloupce. Promˇenn´a defaultValue je v ´ychoz´ı hodnota, kterou zad´a uˇzivatel do konzole. Dan ´y pˇr´ıkaz spust´ıme pomoc´ı funkce ExecuteNonQuery. Tento proces opaku- jeme pro kaˇzd ´y dalˇs´ı sloupec, kter ´y nem´a nastavenou v ´ychoz´ı hodnotu.

(36)

5 Z ´av ˇer

Hlavn´ım c´ılem bakal´aˇrsk´e pr´ace bylo vytvoˇrit n´astroj k z´alohov´an´ı a obnovˇe dat. N´astroj dok´aˇze pracovat s libovoln ´ym Microsoft SQL serverem a plnit bez probl´em ˚u zadan´e c´ıle bakal´aˇrsk´e pr´ace. Vhodn´e textov´e form´aty pro dalˇs´ı implementaci jsme probrali v prvn´ı kapitole Rovnˇeˇz je n´astroj rozˇs´ıˇren o moˇznost transformace. V ´yhodou n´astroje je oˇsetˇren´ı i situac´ı, kdy ubylo nebo pˇribylo v´ıce sloupc ˚u najednou. S detailnˇejˇs´ım rozborem trans- formace jsme byli sezn´ameni v uk´azkov´em pˇr´ıkladˇe a tak´e v posledn´ı kapitole. Dalˇs´ı v ´yhodou n´astroje je plnˇe automatizovan´e pˇrihl´aˇsen´ı na server. U aplikace je tak´e oˇsetˇren vstup uˇzivatele.

Nab´ız´ı se r ˚uzn´e moˇznosti rozˇs´ıˇren´ı n´astroje. Napˇr´ıklad by mohl b ´yt v budoucnu rozˇs´ıˇren o moˇznosti rozs´ahlejˇs´ı manipulace se sch´ematem libovoln´e datab´aze.

(37)

6 Reference

[1] Esposito, Dino, XML: efektivn´ı programov´an´ı pro .NET. Grada Publishing, 2004. ISBN 80-247-0775-6

[2] XML specifikace, http://www.w3.org/XML/

[3] XML validace, http://www.w3schools.com/xml/xml validator.asp [4] XmlTextWriter, http://msdn.microsoft.com/cs-cz/library/

system.xml.xmltextwriter.aspx

[5] YAML, http://www.zdrojak.cz/clanky/

yaml-serializacni-format-pro-ukladani-dat/

[6] YAML syntaxe, http://en.wikipedia.org/wiki/YAML [7] JSON, http://www.json.org/json-cz.html

[8] JSON syntaxe, http://json.org/example.html

(38)

A Elektronick ´e pˇr´ılohy na CD

Zde je uvedena adres´aˇrov´a struktura a d ˚uleˇzit´e soubory pˇrikl´adan´eho CD.

• Bakal´aˇrsk´a pr´ace

backup xml - sloˇzka s aplikac´ı

- Z´alohy - sloˇzka pro XML soubory - Skripty - sloˇzka s SQL skripty

- obnova.bat, zaloha.bat - d´avkov´e soubory pro uk´azkov ´y pˇr´ıklad BP.pdf - tiˇstˇen´a verze v elektronick´e podobˇe

Cytaty

Powiązane dokumenty

I pr ´avn´ı principy – v ˚udˇc´ı z ´asady, na kter´ych stoj´ı pr ´avn´ı syst ´em jako celek nebo jednotliv ´a pr ´avn´ı odv ˇetv´ı; jsou vyˇsˇs´ı m´ıry obecnosti,

• V roce 1900 vypracoval seznam 23 Hilbertov´ ych probl´ em˚ u, tehdy nejvˇ etˇs´ı nevyˇreˇsen´ e matematick´ e probl´ emy.. • Ilustroval nepˇrirozen´e chov´ an´ı

b) ustala się minimalny procentowy udział powierzchni biologicznie czynnej dla terenu - c) wyznacza się rejony lokalizowania co najmniej jednego szpaleru drzew w pasie 5%,..

uˇcen´ı je potˇrebn´e pro nezn´am´e prostˇred´ı (a l´ın´e analytiky ,) uˇc´ıc´ı se agent – v´ykonnostn´ı komponenta a komponenta uˇcen´ı metoda uˇcen´ı

Nejd˚ uleˇ zi- tˇ ejˇs´ım v´ ystupem pˇredkl´ adan´ e disertaˇ cn´ı pr´ ace jsou n´ avrhy postupu stanoven´ı oborov´ eho kalkulaˇ cn´ıho vzorce pro stavebn´ı pr´ ace

Vnitˇrn´ı mechanismus agenta m˚ uˇze b´yt implementov´an mnoha zp˚ usoby. ”Kaˇzd´y mechanismus m´ a stejnou kostru: na vstupu berou data ze senzor˚ u a na v´ ystupu

Pˇri numerick ´em ˇreˇsen´ı diferenci ´aln´ı rovnice se v kaˇzd ´em kroku dopouˇst´ıme lok ´aln´ı diskretizaˇcn´ı chyby.. Glob ´aln´ı diskretizaˇcn´ı chyba

• Zamˇeˇren´ı na velk ´e odbˇeratele – ceny procesor ˚u nejsou volnˇe dostupn ´e. • Nˇekteˇr´ı v´yrobci ani nereaguj´ı na obyˇcejn