Přednáška 2, 3

Základní rysy práce s databázemi v Delphi. Vysvětlení pojmů: BDE, ODBC, souborové databáze, SQL, alias, ADO, komponenty TTable, TQuery, TDataSource a TDBGrid. Prostředek pro vytvoření a editaci tabulek Database Desktop. Indexy. Propojení tabulek.

Základní pojmy

Jedním z nejsilnějších rysů Delphi je jejich schopnost spolupracovat s mnoha databázovými stroji různých výrobců. Protože terminologie různých databázových firem je zcela rozdílná, je nutno nejprve vymezit obsah pojmů tak, jak se používají v Delphi.

V databázích jsou data uspořádána ve formě (obvykle dvoudimenzionálních) tabulek. Sloupce tabulek se nazývají pole (fields). Řádky tabulek jsou záznamy (recordy). Na rozdíl např. od tabulkových kalkulátorů typu Excel, není v databázích počet recordů pevný, ale dynamicky se mění podle potřeby.

Tabulky, spolu s dalšími podpůrnými informacemi (indexy, triggery, omezení-constraints atd.) dohromady tvoří databázi.

Access (MS), InterBase (Borland) a většina SQL serverů používá jeden velký soubor obsahující celou databázi.

Databázové systémy Paradox, DBase, FoxPro a podobné, mají každou tabulku v jednom souboru. V takovém případě Delphi vyžadují, aby všechny soubory patřící k jedné databázi byly v tomtéž adresáři, který má význam "databáze".

BDE

Delphi obsahují řadu komponent pro práci s daty v databázích. Tyto komponenty však nemohou k databázím přistupovat přímo, ale přistupují k nim prostřednictvím Borland Database Engine, BDE. BDE je interface, který rozdílnou filosofii a rozdílné vlastnosti různých databázových strojů přizpůsobuje "na společného jmenovatele" tak, aby s nimi komponenty mohly pracovat jednotně. BDE je zvláštní program, který má charakter serveru: na každém počítači, který má pracovat s databázemi, musí být tento program spuštěn; je však spuštěn v jediné kopii bez ohledu na to, kolik aplikací současně s databázemi pracuje. Každé jednotlivé napojení na databázi se jmenuje session, sezení. O spuštění a ukončení BDE se programátor nemusí starat, Delphi se o to postarají samy. Programátor ale naopak musí zařídit, aby BDE byl na počítači nainstalován. To zejména znamená, že BDE musí být součástí instalačního programu! Nepříjemným důsledkem je, že databázovou aplikaci napsanou v Delphi nelze jen nakopírovat na disk, ale vždy musí proběhnout proces instalace. (výjimkou jsou případy, kdy se nepracuje s BDE, viz dále.)

BDE dokáže pracovat se dvěma zásadními skupinami databází: se souborovými databázemi a se SQL databázemi.

Souborové databáze

Souborové databáze mají data rozdělena do tabulek. V těchto tabulkách se můžeme pohybovat (říká se tomu navigace) naprosto intuitivním způsobem: v tabulce "jsme" na určitém recordu, tzn. na tento record ukazuje ukazatel, cursor. Record, na který ukazuje cursor, se nazývá aktuální. Kursorem můžeme pohybovat nahoru a dolů, tzn. můžeme kursor přemísťovat v tabulce dopředu a dozadu. Můžeme vyhledat record s určitou vlastností. Recordy můžeme různě přeskupovat, např. seřadit je podle nějaké vlastnosti apod. Každý aktuální record je možno editovat, tzn. změnit datové hodnoty v něm obsažené.

Typickou souborovou databází je FoxPro, resp. Visual FoxPro. Delphi defaultně používají jako souborovou databázi Paradox, což je databázový systém původně vyvinutý firmou Borland. (Později byl prodán firmě Corel, což v důsledku znamenalo konec podpory v Delphi.)

SQL databáze

SQL databáze fungují na zcela odlišném principu. V SQL databázi nikdy nemůžeme mluvit o aktuálním recordu; programátor nemá možnost zjistit (a ovlivnit) pořadí, v jakém jsou recordy zapsány - dokonce ani není jisté, zda data vůbec jsou zapsána ve formě recordů! Uložení dat si obhospodařuje SQL server a programátor k nim přistupuje pouze prostřednictvím příkazů, které se nazývají SQL dotazy. Výhodou je, že jeden SQL příkaz může změnit data v mnoha recordech najednou. SQL přístup je typický pro velké databázové systémy.

Delphi samozřejmě mohou pracovat i se SQL. Jednak Paradox podporuje (omezeně) základní SQL příkazy. Jednak firma Borland dodává svůj databázový systém InterBase, který je plnohodnotným (dosti kvalitním) SQL serverem. Jednouživatelská verze InterBase je standardní součástí Delphi. Paradox nebo jednouživatelská InterBase se obvykle používají k ladění algoritmů a aplikací. Po odladění se provede tzv. up-sizing, to znamená přechod na "velký" SQL server. Delphi jsou schopny pracovat s naprostou většinou SQL serverů.

Ovladače - drivery

K tomu, aby se BDE dal propojit s nějakým databázovým systémem (bez ohledu na to, zda souborovým nebo SQL), potřebujeme mít příslušné ovladače (drivery). Ovladače mohou být buď nativní, nebo ODBC. Přirozené (nativní) ovladače jsou ovladače, které jsou napsané "na míru" pro určitý databázový systém. Jejich výhodou je rychlost a úspornost a také to, že využívají všechny možnosti daného systému. Nevýhodou je, že jsou k dispozici jen pro některé databázové systémy, pro ty nejčastější. Delphi standardně přichází s nativními drivery pro Paradox, FoxPro, DBase a MS Access. Další nativní drivery je možno dokoupit od výrobců databázových systémů; tak existují nativní drivery pro Oracle, Informix, DB2, SyBASE, MySQL a pro mnoho dalších. Obvykle ovšem jsou dosti drahé.

ODBC drivery jsou drivery, které komunikují ve standardizovaném rozhraní. Jejich nevýhodou je, že veškerá data se předávají ve formě stringů, a proto jsou mnohem pomalejší než srovnatelné nativní drivery. Jejich výhodou naopak je, že skoro každý databázový systém umí pracovat s rozhraním ODBC, a proto se jejich prostřednictvím dá k Delphi připojit skoro každá databáze. Součástí Delphi jsou ODBC drivery, které jsou optimalizované pro databázové systémy MS Access, FoxPro, dBASE, Paradox, ORACLE, Excel soubory (!) a textové databáze.

Alias

Připojení jakéhokoliv databázového systému k BDE je dosti složité, protože je potřeba správně nastavit velké množství parametrů. Aby nebylo nutno složité nastavování opakovat pro každé spojení s databází (session), byl zaveden pojem alias. Alias je souhrnné označení pro všechny údaje potřebné pro připojení k dané databázi. Zahrnuje název databáze, údaje o jazyku připojení a kódování znaků, velikostech bufferů, bezpečnostních charakteristikách (heslo) a podobně. Alias se zpravidla nastavuje jen jednou, a to v programu BDE Administrator, který je součástí Delphi. Příklady práce s aliasy jsou ve cvičení.

 

Základní komponenty Delphi pro práci s databázemi

Mějme nějakou databázi a v ní nějakou, pro nás zajímavou, tabulku. První, co musíme učinit, je rozhodnutí - zda k ní budeme přistupovat jako k tabulce (record po recordu), nebo zda k ní budeme přistupovat pomocí SQL dotazů. Toto rozhodnutí je primární, protože oba přístupy, žel, nelze kombinovat.

Pokud chceme přistupovat jako k tabulce, umístíme na formulář komponentu TTable, v případě přístupu přes SQL bychom umístili komponentu TQuery. Tyto komponenty se nastaví (podrobnosti jsou ve cvičení) a zaktivují, takže na formulář přinesou napojení na diskový soubor s tabulkou.

Poté na formulář přidáme komponentu TDataSource, což je komponenta tvořící interface mezi TTable/TQuery a všemi ostatními komponentami pro práci s databází. Komponenta DataSource1, což je instance třídy TDataSource, se musí napojit na Table1 a poté zaktivovat. Podrobněji je postup popsán u cvičení. Od tohoto okamžiku mohou všechny komponenty přes DataSource1 číst a zapisovat data z databáze.

Jako jeden z mnoha příkladů komponent, které pracují s databázovou tabulkou, je komponenta TDBGrid. Umístíme ji na formulář (název její instance bude DBGrid) a jakmile ji napojíme na DataSource1, zobrazí se nám obsah tabulky. V podrobnostech opět odkazuji na cvičení.

ADO

Přestože byl BDE velmi užitečnou a ve své době revoluční technologií, nevyhnul se řadě chyb. Dnes sílí řady kritiků, kteří zdůrazňují jeho nedostatky a volají po jeho odstranění. Jedna z cest, která umožňuje obejít BDE, a tak se úplně vyhnout jeho používání, je technologie Active Data Objects, ADO. Tato technologie je variantou OLE2 pro datové objekty a byla vyvinuta firmou Microsoft. Nové verze Delphi (od verze 5, Enterprise edition) už obsahují komponenty pro připojení databází prostřednictvím ADO. Rovněž na našem trhu lze koupit kvalitní komponenty pro práci s ADO technologií.

Database Desktop

Tabulku snadno vytvoříte nebo zeditujete v programu Database Desktop, ve kterém zvolíte menu File-New-Table-Paradox 7. Objeví se návrhový formulář, ve kterém se zadávají názvy polí (sloupců), jejich datový typ (stiskněte mezerník pro rozvinutí seznamu možností) a tam, kde je to nutné, zadá se též délka v počtu bytů.

Sloupec Key slouží k definování tzv. primárního klíče. Paradox může mít libovolný počet indexů, přičemž jeden z nich musí být hlavní - primární klíč. Primární klíč může být složen z jednoho nebo více polí; v takovém případě však tato pole, která tvoří klíč, musejí být na začátku tabulky. Do sloupce Key zadejte cokoliv (zobrazí se hvězdička) na znamení, že toto pole patří k primárnímu klíči. Pole, která jsou součástí primárního klíče, jsou povinná, tzn. nesmějí být prázdná. Hodnota v celém primárním klíči musí být jednoznačná.

Vlevo nahoře na návrhovém formuláři najdete combo Table properties. Pokud je v něm zvoleno Validity Checks, je na levé straně formuláře několik políček, kde je možno zadat formální požadavky na data. Tak zaškrtnutím Reqired Field můžeme požadovat, aby právě vytvářené pole datového recordu nesmělo být prázdné. Minimum, Maximum a Default po řadě znamená minimální, maximální a defaultní hodnotu pole (platí pro číselná pole). Picture dovoluje zadat formát, ve kterém se má číslo očekávat (s návrhem formátu nám pomůže tlačítko Assist).

Combo Table properties je ovšem cestou i k dalším důležitým nastavením tabulky:

Indexy tabulek

Jak už bylo výše uvedeno, každá tabulka může být doplněna indexem. Index může být buď primární (pak mluvíme o primárním klíči), nebo sekundární. V obou případech může klíč zahrnovat jedno nebo několik polí. U primárního klíče musejí být pole, přes které je primární klíč proveden, těsně vedle sebe (tzn. nesmějí mezi nimi být pole, která do klíče nepatří), musejí být na začátku recordu a primární klíč musí být jednoznačný. U sekundárního klíče nic takového neplatí. Hlavní výhodou klíčů je, že dovolují rychle uspořádat (setřídit) data v tabulce podle rostoucí hodnoty příslušného klíče.

 

Jednoduché propojení tabulek

Případ, že potřebujeme prohlížet jen jednu tabulku, je spíše výjimečný. Obvyklejší je případ, kdy potřebujeme propojit dvě (nebo více) tabulek. Jako příklad může sloužit případ faktury, kdy k číslu faktury (v jedné tabulce) potřebujeme najít všechny položky-řádky faktury, které se jí týkají. Tomuto způsobu propojení se obvykle říká relace 1:N nebo master-slave.

Jednoduché propojení tabulek se v Delphi realizuje mimořádně jednoduše. Podmínkou ovšem je, že podřízená tabulka (slave) musí

Nejprve se vytvoří dvě cesty, pro každou tabulku jedna. To znamená, že se na formulář umístí 2 komponeny TTable, 2 TDataSource a 2 TDBGrid. Odpovídající komponenty se propojí, takže každá cesta zobrazuje jednu tabulku.

Pak nastane vlastní propojení. V slave tabulce nastavíme property MasterSource tak, aby ukazovala na DataSource od master tabulky. Poté u property MasterFields klepneme na tlačítko s trojicí teček […], čímž se otevře editační okno. V tomto editačním okně nejprve v combu Available Indexes vybereme správný index tabulky slave (může být primární i sekundární). Pak v seznamech Detail Fields a Master Fields vybereme dvojici polí, která si navzájem odpovídají, a stiskneme tlačítko Add. V seznamu Joined Fields se objeví propojení. Podobných propojení je případně možno zadat více.

Celé propojení je tím ukončeno.

 

Otázky ke zkoušce

  1. Vysvětlete, jak se vytvoří prohlížeč tabulky, která obsahuje MEMO a obrázky.
  2. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 2 sloupce: evidenční číslo osoby a jméno s příjmením. V této tabulce vytvořte primární klíč (a) přes číslo, (b) přes jméno, (c) přes číslo a jméno.
  3. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 2 sloupce: evidenční číslo osoby a jméno s příjmením. Zadejte, aby číslo muselo být mezi 1 a 1000 včetně, aby obsahovalo výlučně číslice a aby defaultní hodnota byla 20. Řešení je zde.
  4. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. Vedle toho vytvořte tabulku skupin. Zařiďte, aby do tabulky LIDI.DB do pole Skupina nešlo zadat žádný název skupiny, který není uveden v tabulce skupin. Řešení je zde.
  5. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. K tabulce vytvořte index přes jméno a index přes skupinu (řešení je zde). V prohlížeči ukažte, jak se data setřídí podle jména, podle skupiny a podle evidenčního čísla.
  6. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. Vedle toho vytvořte tabulku skupin. Nastavte referenční integritu tak, aby nebylo možno vymazat či změnit ty řádky z tabulky skupin, na které se odkazuje některý record v tabulce LIDI.DB. Zde je řešení.
  7. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. Její jazykový driver nastavte na "dBASE CSY cp852". Řešení je zde.
  8. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. Vedle toho vytvořte tabulku skupin. Nastavte referenční integritu tak, aby nebylo možno vymazat či změnit ty řádky z tabulky skupin, na které se odkazuje některý record v tabulce LIDI.DB. Ukažte, jak se dá zjistit, které tabulky jsou závislé na tabulce skupin.
  9. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 2 sloupce: evidenční číslo osoby a jméno s příjmením. V této tabulce vytvořte primární klíč (a) přes číslo, (b) přes jméno. Nyní ukažte, jak se v jednoduchém prohlížeči dají data přetřídit podle čísla a podle jména. Zde je řešení. Povšimněte si v něm, že písmeno "Č" se řadí nesprávně - to je dáno špatnou volbou jazykového driveru.
  10. Ukažte, jak se pro Paradox7 vytvoří tabulka LIDI.DB, která bude mít 3 sloupce: evidenční číslo osoby, jméno a skupinu. Vedle toho vytvořte tabulku skupin. Nastavte propojení obou tabulek tak, aby uživatel zvolil jeden řádek v tabulce skupin a podle toho se zobrazily všechny osoby, které do té skupiny patří. Zde je řešení.