Umíme to s Delphi: 77. díl – databáze v Delphi, jaké máme možnosti?

Dnes si nejprve uvedeme příklady několika rozsáhlejších dotazů nad více tabulkami, a pak podrobně rozebereme, jaké možnosti má programátor toužící psát databázové aplikace v Delphi. Máte zmatek v pojmech ADO, Interbase, BDE, dbExpress, ODBC? Není vám jasné, kam zapisovat SQL dotazy? Zajímá vás, co musíme dodat zákazníkovi společně s databázovou aplikací v Delphi? Dnešní díl vám dá na tyto otázky odpovědi.
V minulém dílu seriálu jsme si řekli, co to vlastně databáze je a zaměřili jsme se na způsob, jakým jsou data v databázi uspořádána. Vysvětlili jsme si řadu důležitých databázových pojmů, rozumíme relacím a dokážeme si také poradit s nepříjemnou relací typu M:N. Naučili jsme se dokonce navrhnout svou vlastní databázi. Dnes se k tématu minulého čísla ještě vrátíme: začneme několika příklady rozsáhlejších databázových dotazů.

Příklady dotazů nad více tabulkami

Když nyní již orientačně známe návrh databáze s více tabulkami, předvedeme si několik databázových dotazů týkajících se většího počtu tabulek. Vyjdeme z minule uvedené situace týkající se kuchařů a jídel (místo mezer v názvech uvádíme podtržítka; nyní je lhostejné, zda ID kuchaře označíme „id_kuchare“ nebo „idkuchare“ nebo „id kuchare“ – jde nám pouze o výuku dotazů a jejich tvarů).

Dotaz:

SELECT jmeno FROM KUCHARI, JIDLA, UMI_VARIT WHERE jídlo=rizoto AND UMI_VARIT.ID_kuchaře = KUCHARI.ID_kuchaře AND UMI_VARIT.ID_jídla = JIDLA.ID_jídla;

Význam: vrátí jména všech kuchařů, kteří umí vařit rizoto

Výsledek:

Franta

Dotaz: SELECT jídlo FROM KUCHARI, JIDLA, UMI_VARIT WHERE jméno=Franta AND UMI_VARIT.ID_kuchaře = KUCHARI.ID_kuchaře AND UMI_VARIT.ID_jídla = JIDLA.ID_jídla;

Význam: vrátí všechna jídla, která umí vařit Franta

Výsledek:

svíčková
řízky
rizoto

Dotaz:

SELECT jmeno FROM KUCHARI, JIDLA, UMI_VARIT WHERE plat > 10000 AND cena < 50 AND UMI_VARIT.ID_kuchaře = KUCHARI.ID_kuchaře AND UMI_VARIT.ID_jídla = JIDLA.ID_jídla;

Význam: vrátí jména všech kuchařů, kteří berou více než 10000 a umí vařit jídla levnější naž 50 Kč

Výsledek:

Franta
Josef

Dotaz:

SELECT avg(plat) FROM KUCHARI, JIDLA, UMI_VARIT WHERE jídlo = kuřecí_prso AND UMI_VARIT.ID_kuchaře = KUCHARI.ID_kuchaře AND UMI_VARIT.ID_jídla = JIDLA.ID_jídla;

Význam: vrátí průměrnou mzdu kuchařů, kteří umí připravit kuřecí prso

Výsledek:

12500

Důležitá poznámka pro pokročilé databázisty: rád bych předešel protestům ze strany znalců jazyka SQL. Uvědomuji si, že dotaz

SELECT * FROM kuchari, umi_varit WHERE kuchari.id_kuchare = umi_varit.id_kuchare AND kuchari.jmeno = Franta;

se má podle nových doporučení zapisovat takto

SELECT * FROM kuchari JOIN umi_varit ON kuchari.id_kuchare = umi_varit.id_kuchare WHERE kuchari.jmeno = Franta;

(jinak řečeno – spojení tabulek by se mělo vyjadřovat explicitně pomocí klauzule JOIN, nikoliv implicitně výčtem v klauzuli FROM), ale pro začátečníky může být tento zápis zbytečně nepřehledný a nerad bych je zatěžovat popisem další klauzule, zejména pak s ohledem na nutnost popsat rozdíly mezi levým, pravým, vnějším a vnitřním spojením (LEFT, RIGHT, INNER, OUTER apod.).

Kam zapisovat SQL dotazy?

Typickým problémem databázového začátečníka není ani tak naučit se jazyk SQL (ostatně jedná se v podstatě o přirozený anglický jazyk), jako spíše pochopit, kam může dotazy SQL zapisovat.

Na tuto otázku neexistuje jednoznačná odpověď. Chtělo by se říci: všude možně. Skutečně, ať používáte libovolnou databázovou platformu (schopnou přístupu k datům pomocí SQL), máte k dispozici nástroj, do něhož lze zapisovat dotazy SQL a získávat tak výsledky z databáze.

Vzhledem k tomu, že se zabýváme Delphi, řekneme si, kam zapisovat SQL dotazy v Delphi. Pro zvolenou databázovou platformu existuje vždy komponenta (obvykle má ve svém názvu slůvko Query), která umožňuje zadávání dotazů SQL. Protože taková komponenta je obvykle součástí vrstvy DataSet, můžete ji používat namísto komponent Table. Jedna z vlastností této komponenty je pak obvykle typu TStrings a umožňuje zadání řetězce, který je oním SQL dotazem. Všechno si ukážeme později prakticky.

Pokud pracujeme s danou databázovou platformou jinak než pomocí Delphi, zapisujeme obvykle dotazy pomocí některého programu (utility), který je s danou platformou dodáván a který slouží k přístupu k databázi pomocí SQL dotazů. Praktický příklad: pracujeme-li s platformou Interbase nebo Firebird, je standardně dodávána utilita příkazové řádky ISQL, která po svém spuštění umožňuje formulovat dotazy a rovnou vypisuje jejich výsledky. Kromě ISQL je k dispozici i řada dalších (grafických, okenních) nástrojů, které obsahují volbu „Enter SQL Statement“ nebo „Enter SQL Query“ (příkladem budiž třeba nástroj IB Expert). Používáme-li například platformu Oracle, existuje pro ni opět hned několik nástrojů umožňujících formulovat SQL dotazy a získávat jejich výsledky.

Chci pracovat s databázemi v Delphi. Jaké mám možnosti?

Rozhodnete-li se napsat databázovou aplikaci v Delphi, máte několik možností. Důležité je vždy zvolit tu, která vyhovuje nejen nyní, ale bude vyhovovat i do budoucna (s ohledem na případné budoucí změny apod.). V podstatě máme na výběr z následujících možností:

  • BDE (Borland Database Engine). Tato databázová „klasika“ je sice už řadu let předmětem pochybovačných poznámek týkajících se kvality a výkonu, stále má v Delphi silnou pozici. A to i přesto, že byl oficiálně ohlášen konec podpory BDE, takže se již nedočkáme žádných inovací a vylepšení. BDE je však stále výhodným řešením pro ty, kteří potřebují pracovat s lokálními databázemi, neboť má přímý přístup k databázovým souborů Paradoxu, Accesu a dalších (pravda, starších) systémů řízení báze dat. BDE obsahuje snad nejširší paletu podpůrných nástrojů a funkcí pro práci s nejrůznějšími databázemi. Pokud nám nestačí možnosti, které obsahuje přímo BDE, je možné využít propojení s databázemi prostřednictvím ODBC, čímž sice ztratíme na výkonu, na druhou stranu však získáme možnost pracovat snad se všemi databázemi. Používání BDE je relativně jednoduché, ovšem na druhou stranu je trochu obtížnější šíření a instalace aplikací postavených na BDE: zákazníkův počítač musí obsahovat správně nakonfigurované BDE. Komponenty pro BDE se v Delphi vyskytují na stránce „BDE“ palety komponent.
  • Další možný přístup k datům se skrývá pod názvem ADO (ActiveX Data Objects). Funguje na principu sady objektů COM, které přistupují do databáze prostřednictvím rozhraní OLEDB (případně také ODBC). Také v případě ADO existuje celá řada ovladačů pro nejrůznější databázové platformy. Chceme-li úspěšně provozovat aplikaci postavenou na principu ADO, je zapotřebí Microsoft ADO 2.1 (ADO je technologií společnosti Microsoft), rozhraní OLEDB (příp. ovladač ODBC), pro databázové servery postavené na SQL příslušné klientské vybavení, a samozřejmě především databázi. Komponenty pro práci s ADO naleznete na stránce „ADO“ palety komponent.
  • dbExpress. Tato technologie je nejnovější a v určitém směru také nejvíce doporučovanou technologií (či spíše mechanismem, neboť dbExpress není řádným databázovým strojem, ale pouze mechanismem přístupu k více druhům databází). Její ohromnou výhodou je rychlost a efektivita. Ta je způsobena především tím, že pracuje pouze s jednosměrnými datovými sadami, dále neukládá záznamy do vyrovnávací paměti, negeneruje žádné interní dotazy apod. Na druhou stranu není přímo možné pracovat s komponentami pro editaci databázových údajů, neboť dbExpress (vzhledem k uvedeným vlastnostem) např. neumožňuje přejít na předchozí záznam. Hodí se tak nejvíce, když potřebujete získat data z databáze, ale nepotřebujete je modifikovat (např. do HTML reportu). Ale i v ostatních případech je možné si „vypomoci“ použitím dalších komponent, které vytvoří mechanismus pro „normální“ práci s daty (např. komponenta ClientDataSet). Použití dbExpress nevyžaduje (na rozdíl od BDE) žádné dodatečné instalace u zákazníka a navíc umožňuje přenositelnost na Linux, neboť dbExpress je k dispozici i v Kylixu. Příslušné komponenty jsou k nalezení v paletě komponent na stránce dbExpress. Použití dbExpress je v současnosti asi nejdoporučovanější ze všech možností, které v Delphi máme.
  • InterBase. Delphi obsahuje velmi propracovanou podporu databází InterBase (samozřejmě především proto, že tuto databázi donedávna firma sama vyvíjela). Prostřednictvím komponent z palety Interbase můžete pracovat s databází InterBase skoro stejně efektivně, jako kdybyste si otevřeli přímo klienta tohoto databázového stroje. Interbase je v současnosti poměrně progresivní variantou, neboť Borland uvolnil zdrojové kódy, čehož se okamžitě chopila open-source komunita a (při zachování kompatibility) vytvořila databázovou platformu Firebird (www.firebirdsql.com), která je velmi zajímavou (a též bezplatnou) alternativou k databázím typu MySQL pro vývoj webových aplikací, neboť na rozdíl od MySQL disponuje pokročilými možnostmi jako např. vnořené dotazy SQL nebo podpora transakčního zpracování. A kromě toho je výborně podporována v Delphi :-)

Tolik k hrubému popisu současných databázových možností v Delphi. Doufám, že jsem žádnou důležitou neopomněl.

Co musíme instalovat?

Od čtenářů občas dostávám dotazy typu „co všechno musím instalovat zákazníkovi, pokud mu dodávám aplikaci pracující s databází přes BDE?“ Proto se pokusím vyprodukovat nějakou obecnou odpověď. Předpokládejme opět lokální běh celého systému: aplikace, databáze i zákazník sdílí tentýž počítač.

Za prvé: ať už se rozhodneme pro jakýkoliv přístup (InterBase, BDE, dbExpress), budeme muset vždy instalovat kromě naší aplikace ještě něco navíc. Aby se aplikace mohla domlouvat s databází, musí někde běžet nějaký systém řízení báze dat, který umožní aplikaci se k databázi připojit a který jí pak bude poskytovat data. Pokud zákazník na počítači žádný SŘBD nemá, musíme mu jej tam dodat. Výjimku tvoří situace, v nichž je přístup k databázím zajištěn prostřednictvím různých nástrojů třetích stran, například pokud vám zákazník řekne, že k datům se bude přistupovat pomocí ODBC a ukáže vám příslušný ODBC zdroj, nemusíte s starat o to, kde ovladače ODBC svá data získají a jak je dodají a vesele můžete dodat pouze aplikaci předpokládající, že data (přes ODBC) prostě má.

Další výjimka nastává v případě, kdy použijeme BDE. V takovém případě sice musíme vždy dodat také BDE, ale někdy se můžeme vyhnout instalaci SŘBD jako takového. Pokud v rámci BDE budeme pracovat např. s databází Paradox, nemusíme Paradox fyzicky instalovat, protože BDE má k jeho databázovým (datovým) souborům přímý přístup, stejně jako k databázovým souborů dBase, FoxPro nebo Access.

Rozhodneme-li se použít třeba InterBase, nemusíme instalovat BDE, ale je nezbytně nutné dodat zákazníkovi databázový server Interbase nebo Firebird. Databázový server Interbase je, stejně jako BDE součástí instalačních CD Delphi (kromě toho je možné stáhnout jej z webu).

Co bude potřeba k vytvoření databázové aplikace?

Nyní již opravdu známe všechny teoretické základy, které jsou nutné pro vývoj databázové aplikace. Můžeme se proto pustit do díla.

Drobná potíž ovšem spočívá v tom, že si tentokráte nevystačíme „pouze“ s Delphi. Abychom mohli vytvořit databázovou aplikaci, je nutné provozovat nějakou databázovou platformu (nezabýváme se teď případem, že databáze je umístěná na vzdáleném serveru, k němuž se lze připojit prostřednictvím sítě – těmito variantami se budeme zabývat později).

Co tedy musíme učinit, abychom na svém překrásném domácím počítači mohli vytvářet a ladit databázové aplikace?

Především se musíme rozhodnout, kterou databázovou platformu zvolíme. Tento výběr za nás v praxi občas udělá zákazník (který už nějakou databázi používá a potřebuje nějaký doplňující program, který se s ní „dorozumí“). Z pozice tohoto seriálu máme tu výhodu, že si můžeme vybrat sami.

V několika následující dílech seriálu se postupně budeme zabývat tvorbou databázových aplikací pro jednotlivé (výše uvedené) platformy. Protože nejjednodušší je zřejmě použití BDE, začneme za týden právě s ním.

Protože tvorbou databází v BDE jsme se zabývali v 17. a 18. dílu seriálu, a tedy také víme, jak registrovat databázový alias a jak vytvořit jednoduchou databázi pomocí klientského programu Database Desktop, nebudeme tuto činnost opakovat. Jen společně vytvoříme novou databázi, která bude obsahovat více tabulek. Pak si ukážeme, jak vytvořit databázovou aplikaci nad touto databází.

Na závěr

Věřím, že jste dnes získali dobrý základ pro praktickou tvorbu databázových aplikací v Delphi. Kromě toho, že jste získali lehký přehled o dotazech v jazyce SQL, se orientujete i ve způsobech, jimiž můžeme přistupovat k databázovým aplikacím v Delphi.

Věřím, že jsem též zodpověděl dvě časté a důležité otázky začátečníků: kam se zapisují SQL dotazy a co je nutné instalovat na zákazníkův počítač, pokud pro něho vytvořím a dodám databázovou aplikaci.

Diskuze (4) Další článek: NVidia: Chceme prodat 1,5 miliónu NV30

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,