Databáze a Delphi – to je skoro nerozlučná dvojice. Tvrzení, že v Delphi se databázím nadmíru daří, určitě není přehnané. Podpora databází v tomto vývojovém nástroji je velmi silná a s postupným příchodem nových verzí Delphi se stále rychleji rozšiřuje.
V předchozích dílech seriálu jsme se naučili pracovat s nejrůznějšími komponentami a vytvářet jednoduché aplikace mající elegantní uživatelské rozhraní. Zvládneme vytvořit textový a grafický editor, umíme pracovat se soubory. Dosud ale nic nevíme o způsobu, jak jednoduše spravovat velké balíky dat. Jakým způsobem budeme ukládat a zpřístupňovat evidenci zákazníků firmy s celosvětovou působností?
Jistě – je možné „ručně“ naprogramovat systém suplující mnohé funkce databáze (např. vkládání, třídění, vyhledávání a zobrazování údajů). To by však bylo velmi pracné a vcelku zbytečné. Můžeme totiž použít databázi.
Rostoucí podpora databází v Delphi je logickým důsledkem trendu poslední doby. Význam databází nesmírně rychle roste. Každým dnem se rozrůstá počet firem, institucí i jednotlivých uživatelů, jež přesouvají určitou část své agendy, ať již papírové nebo elektronické „nedatabázové“, právě do databáze.
Problematika databází se zdá být poměrně rozsáhlá a mnozí odborníci vám určitě budou tvrdit, že k zvládnutí databází potřebujete několik let intenzivního studia. Nemají tak docela pravdu. Jistě, komplexní pochopení práce s databázemi, jejich vytváření a správy v nejrůznějších databázových systémech vyžaduje dost času. Nicméně, „dělat databáze“ lze i bez hlubokých znalostí tohoto oboru. Pokud je možné zákazníkův požadavek vyjádřit větou typu: „Potřebuji vytvořit databázi zákazníků, abych se konečně zbavil těch deseti šanonů ve skříni,“ můžete s klidným svědomím slíbit, že to zvládnete. Tedy – po přečtení tohoto dílu.
Databáze v Delphi – Borland Database Engine (BDE)
Přes
BDE má programátor možnost přistupovat k celé řadě databází. Koncepce
BDE spočívá v univerzálním databázovém jádru. Pomocí tohoto jádra může programátor přistupovat k mnoha typům databází, a to zcela jednotně, stejným způsobem a naprosto jednoduše. Ovladače
BDE „převedou“ databázovou operaci na správnou realizaci pro konkrétní databázový systém.
Systém BDE je velmi snadno rozšiřitelný – například pomocí ovladačů ODBC (Microsoft Open Database Connectivity). Kompletní popis konfigurace BDE a práce s ním ovšem přesahuje rámec našeho seriálu a pro získání těchto informací je nutné prostudovat například některý titul odborné literatury.
Abychom mohli v Delphi používat „databázový stroj“ BDE, musíme vytvořit tzv. Alias. Alias je jakási „přezdívka“ databáze, jejíž pomocí přistupujeme do databáze v Delphi. V závěru tohoto dílu je detailně popsán způsob vytvoření nového Aliasu pro vývoj databázové aplikace v Delphi. Spuštěný BDE ukazuje následující obrázek (v levé části je seznam existujících databázových Aliasů, v pravé části se zobrazují podrobnosti o vybraném aliasu):
Databázový systém Database Desktop
S
Delphi je standardně dodáván velmi jednoduchý databázový systém
Database Desktop. Jeho cílem je umožnit vytváření, prohlížení, třídění, modifikace a dotazy nad tabulkami v několika formátech (
Paradox, dBASE, SQL formáty, a to s možností rozšíření).
Pomocí systému Database Desktop je možné vytvářet, ukládat a znovu otvírat tabulky, dotazy a SQL příkazy, dále pracovat s daty v tabulkách (přidávat, mazat, kopírovat…), chránit data hesly, třídit tabulky apod.
Database Desktop samozřejmě pracuje přes BDE. Využívá Aliasů (umožňuje i jednoduchou správu Aliasů, takže při práci s Database Desktop ani nemusíte spouštět BDE).
Programátor tedy se zakoupením Delphi získává možnost vytvářet kompletní databázové aplikace, aniž k tomu potřebuje další nástroje. V příštím díle seriálu si ukážeme celý proces vývoje nové databáze a databázové aplikace, včetně vytvoření struktury databáze pomocí Database Desktop. Spuštěný BDE s otevřenou tabulkou ukazuje následující obrázek:
Paleta
Data Access obsahuje komponenty určené pro přístup k databázím pomocí
BDE. Ve verzi
Delphi 5 Enterprise obsahuje paleta 9 komponent (většina je jich však dostupná i v ostatních verzích). Většinu z nich popisuje následující přehled:
Komponenta: Data Source
Funguje jako „spojení“ mezi komponentami pro přístup do databáze (Table) a komponentami pro uživatelské rozhraní (DBGrid).
Komponenta: Table
Získává data z (fyzické) databázové tabulky pomocí BDE a zpřístupňuje je komponentě DataSource (stejně tak i naopak – data získaná z komponenty posílá do fyzické tabulky).
Komponenta: Query
Má podobnou funkci jako komponenta Table, s tím rozdílem, že získává data z tabulky pomocí příkazů jazyka SQL.
Komponenta: StoredProc
Umožňuje aplikaci spouštět (využívat) procedury uložené na databázovém serveru.
Komponenta: Database
Slouží k inicializaci trvalého spojení s databází, zvláště u vzdálených databází (kde zabezpečuje zadání uživatelského jména, hesla…).
Komponenta: BatchMove
Provádí kopii tabulky nebo jejích dat. Může být použito i ke kopírování z jednoho databázového formátu do jiného.
V následujících podkapitolách se stručně podíváme na tři nejdůležitější komponenty, které nám budou bohatě stačit k vytvoření jednoduché databázové aplikace.
DataSource (datový zdroj) se vyskytuje v každé databázové aplikaci. Funguje jako „spojení“ mezi komponentami pro přístup do databáze (např.
Table) a komponentami pro uživatelské rozhraní (např.
DBGrid).
Podívejme se na vlastnosti komponenty DataSource (viz následující tabulka):
Vlastnost |
Význam |
AutoEdit |
Nastavuje, má-li být databáze automaticky v editačním režimu. Pokud AutoEdit = True, při každé editaci ze strany uživatele je volána metoda Edit, v opačném případě je uživateli zabráněno měnit hodnoty. |
DatSet |
Specifikuje komponentu, která přímo přistupuje k databázi (např. Table) a pro kterou DataSource slouží jako „spojení“. |
Enabled |
Nastavení na False vypne spojení na komponentu zobrazující data (v té pak nejsou zobrazeny žádné údaje). |
State |
Přečte (vrátí) aktuální stav komponenty DataSet asociované s touto komponentou DataSource (je-li DataSet zavřen, právě otvírán apod.). |
Události jsou pouze tři:
- OnDataCange (při změně dat) se vyskytne, když aktuální záznam byl editován, při přechodu na jiný záznam apod.
- OnStateChange (při změně stavu) se vyskytne, změní-li se stav komponenty DataSet (např. přechod do editačního režimu apod.)
- OnUpdateData (při aktualizaci dat) se vyskytne při změně aktuálního záznamu.
Table zapouzdřuje databázovou tabulku. Zpřístupňuje z ní data a dává je k dispozici dalším komponentám prostřednictvím komponenty
DataSource. Kromě toho
Table dokáže i přijmout data z komponenty (např. změnil-li uživatel záznam) a zapsat je do tabulky. To vše provádí prostřednictvím
BDE.
Nejdůležitější vlastnosti komponenty Table shrnuje následující tabulka:
Vlastnost |
Význam |
Active |
Udává, je-li tabulka „otevřena“ – je-li možné z ní načítat a do ní zapisovat data. Při správném propojení komponent se povolení této vlastnosti projeví naplněním vizuálních komponent daty již v návrhové fázi. |
CanModify |
Říká, může-li aplikace měnit data v tabulce. |
DatabaseName |
Specifikuje jméno databáze asociované s touto komponentou (lze použít i alias vytvořený v BDE). |
Exists |
Říká, existuje-li tabulka (na kterou se odkazuje). |
TableName |
Udává jméno tabulky, kterou zapouzdřuje. |
TableType |
Udává typ tabulky (ttParadiox, ttFoxPro,…). Nastavení na ttDefault způsobí „automatickou detekci“ typu založenou na příponě souboru. |
Komponenta Table má velké množství událostí, které se dělí na události „po“ a události „před“. Příklad – před uzavřením tabulky (BeforeClose) a po uzavření tabulky (AfterClose). Díky tomu je možné mnohým akcím ještě včas zabránit.
Důležité jsou také metody komponenty Table. Pomocí nich je možné provádět operace s vlastní tabulkou a s jejími daty. Stručný popis nejdůležitějších metod přináší následující tabulka:
Metoda |
Význam |
CreateTable |
Vytvoření nové tabulky |
Append, AppendRecord |
Přidání řádky do tabulky |
Close |
Uzavření tabulky |
Delete |
Smazání řádky z tabulky |
Edit |
Editace řádky |
FieldByName |
Přístup k hodnotám polí dle jmen |
First |
Přechod na první záznam v tabulce |
GetBookmark |
Nastavení záložky |
GelFieldNames |
Zjištění jmen polí |
Insert, InsertRecord |
Vložení řádky do tabulky |
Last |
Přechod na poslední záznam v tabulce |
MoveBy |
Posun o daný počet záznamů |
Next |
Posun na další záznam |
Open |
Otevření tabulky |
Post |
Uložení změn do databáze |
Prior |
Přechod na předchozí záznam |
Komponenta
Query je funkčně podobná komponentě
Table, s tím rozdílem, že k přístupu do databázové tabulky používá jazyk
SQL. Pomocí tohoto jazyka definujeme podmínky, za kterých se má ta která operace uskutečnit. Není nezbytně nutné přistupovat pomocí komponenty
Query jen do
SQL databází. Pomocí
SQL dotazů můžeme získávat data i z jiných databází přístupných před
BDE. To je velkou výhodou
Delphi.
Dotazy jazyka SQL můžeme rozdělit do dvou typů:
- dotazy, které pouze vracejí množinu záznamů. Základním příkazem je SELECT.
- dotazy, které provádějí změnu v tabulce. Používají se příkazy INSERT, DELETE, UPDATE, CREATE a další.
Vlastnosti, události a metody jsou velmi podobné komponentě Table, až na několik odlišností, které nyní popíšeme.
Nejdůležitější vlastností komponenty Query je SQL, která je typu TStrings. Do ní se zapisuje text SQL příkazu, který se má vykonat. Popis jazyka SQL přesahuje rámec tohoto seriálu, nicméně sehnat knihu (nebo www stránku) určenou pro seznámení se SQL není dnes jistě problém – zkuste např. seriál o SQL zde na Živě.cz. Jednoduché příklady SQL dotazů budou také uvedeny v příštím díle u „databázového“ příkladu.
S vlastností SQL souvisí rovněž vlastnost Params, která obsahuje parametry pro SQL příkaz daného dotazu.
Události jsou stejné jako u komponenty Table a shoduje se i většina metod. Pro Query jsou jedinečné pouze metody ExecSQL (používá se k provedení jiného příkazu než SELECT, pro ten se používá metoda Open), Prepare (pošle dotaz BDE a ten se postará o jeho optimalizaci), UnPrepare (odpřipraví již provedený dotaz, tj. uvolní použité zdroje) a ParamByName (pro nastavení parametrů za běhu).
Příště – komponenty Data Controls a kompletní databázový příklad
Pokud byste rádi viděli, jak prakticky vytvořit databázovou aplikaci v Delphi (včetně vytvoření Aliasu v BDE, databázové tabulky v nástroji Database Desktop), určitě si nenechte ujít příští díl seriálu, ve kterém si to krok za krokem předvedeme. Ještě předtím se však podíváme na několik komponent z palety Data Controls.