Umíme to s Delphi: 96. díl – databáze Interbase: komponenta IBDatabase

Komponenta IBDatabase je jedním z nejdůležitějších stavebních prvků aplikace, po níž požadujeme spolupráci s databází Interbase. Tato komponenta reprezentuje spojení s fyzickou Interbase databází (s databázovým serverem) a zapouzdřuje databázi jako celek. V závěru článku společně vytvoříme aplikaci, která vypíše seznam tabulek databáze a přehled jejich položek (sloupců).
V minulém dílu našeho seriálu jsme dokončili téma uložených procedur – velmi důležitých databázových konceptů. Připomeňme, že v poslední době se zabýváme především databázovými platformami Interbase/Firebird, které jsou v Delphi přímo přístupné prostřednictvím komponent ze záložky Interbase na paletě.

V 92. dílu tohoto seriálu jsme začali systematicky popisovat a vysvětlovat komponenty z této záložky – zabývali jsme se především komponentou IBTable a podrobně jsem se naučili získávat výsledky databázových dotazů pomocí komponenty IBQuery. 93. díl byl poté věnován komponentě IBStoredProc. Tato komponenta se pro nás stala odrazovým můstkem ke zmíněnému tématu „uložené procedury“, jimž byly věnováno několik následných článků.

V dnešním dílu se vrátíme k popisu komponent přesně na tom místě, na kterém jsme v 93. části skončili. Na záložce Interbase následuje za komponentou IBStoredProc komponenta IBDatabase – a právě ta se stane středem našeho zájmu v několika příštích odstavcích.

Komponenta IBDatabase

O této komponentě jsme se již stručně zmínili v 92. dílu seriálu a kromě toho jsme ji používali ve všech aplikacích Interbase, které jsme společně vytvářeli. Proto již asi všichni intuitivně tušíme, že se jedná o komponentu zapouzdřující databázi Interbase.

Vskutku – komponenta IBDatabase reprezentuje spojení s Interbase databází. Používáme ji v aplikacích prcujících s databázemi Interbase nebo Firebird a jejím hlavním účelem je správa, ovládání a kontrola databázového spojení a všech databázových transakcí, bez ohledu na to, jedná-li se o místní (lokální) databázi nebo o vzdálený server.

Podívejme se na nejdůležitější vlastnosti komponenty IBDatabase.

Vlastnost Connected

Logická vlastnost indikující, je-li databázové připojení aktivní (je-li databáze připojena). Vlastnost není jen pro čtení, proto jejím nastavením na True provedeme v podstatě připojení k databázi (a analogicky nastavení na False způsobí odpojení od databáze).

Vlastnost DatabaseName

DatabaseName je jedna z nejdůležitějších vlastností – udává jméno databáze na databázovém serveru, k níž se hodláme připojovat (a tedy kterou má komponenta zapouzdřovat). Pokud pracujeme s lokálními databázemi (jinak řečeno – máme-li na lokálním počítači instalován databázový server a na lokálním disku uloženy databáze), je název databáze totožný se jménem souboru na disku. Tento případ byl pro nás aktuální ve všech předchozích aplikacích, kdy jsme pracovali normálně s diskovým souborem platy.gdb.

Pokud se chceme připojit k databázovému serveru umístěném na vzdáleném počítači, závisí obsah vlastnosti DatabaseName na protokolu, pomocí kterého chceme se serverem komunikovat. Používáme-li (nejčastěji) TCP/IP, použijeme označení v následujícím formátu:

<jmeno_serveru>:<jmeno_souboru>

Pokud místo TCP/IP použijeme NetBEUI, syntaxe je následující:

\\<jmeno_serveru>\<jmeno_souboru>

Ukážeme si ještě jednu možnost – připojení za použití SPX. V tom případě je syntaxe následující:

<jmeno_serveru>@<jmeno_souboru>

Vlastnost DBSQLDialect

Zajímavá vlastnost (určená pouze pro čtení), která vrátí celočíselný údaj odpovídající SQL dialekt používaný v dané databázi.

Vlastnost DefaultTransaction

Vlastnost DefaultTransaction používáme k přečtení/nastavení default databázové transakce. V našem seriálu jsme se dosud transakcemi nezabývali, proto jen stručně poznamenejme, že transakční zpracování je jednou z nejsilnějších výhod moderních databázových systémů a že právě podpora paralelního zpracovávání transakcí činí databáze mnohem využitelnější než běžné formy ukládání dat (například souborový přístup k datům a podobně).

Transakcemi se budeme zabývat v některém z příštích dílů seriálu, až se dostaneme k popisu příslušné Interbase komponenty (konkrétně IBTransaction). Uvidíte sami, že na transakcích není nic příliš obtížného, avšak jedná se o velmi důležitou a silnou zbraň.

Na tomto místě si pouze zapamatujte, že hodnotou vlastnosti DefaultTransaction je název komponenty zapouzdřující přednastavenou (tj. základní) databázovou transakci, v níž probíhají všechny databázové akce, jimž explicitně neurčíme transakci jinou. Jinak řečeno – do každé Interbase aplikace bychom měli vložit alespoň jednu komponentu IBTransaction a používat ji jako „default“, tedy vložit její jméno do vlastnosti DefaultTransaction komponenty IBDatabase (avšak nejen tam, neboť i jiné komponenty Interbase vyžadují zadání default transakce).

Vlastnost IdleTimer

Zajímavá celočíselná vlastnost, s jejíž pomocí můžeme určit dobu nečinnosti, po kterou má zůstat databáze připojená. Po uplynutí stanovené doby se provede automatické odpojení aplikace od databázového serveru.

Vlastnost Params

S vlastností Params jsme se již setkali například v minulé části seriálu, ovšem pozor, jednalo se o vlastnost Params komponenty IBStoredProc, přičemž její použití je trochu jiné než použití vlastnosti Params komponenty IBDatabase. U komponenty IBDatabase slouží tato vlastnost k uchovávání parametrů, které chceme poslat (předat) na databázový server.

Parametry uložené ve vlastnost Params komponenty IBDatabase budou předány databázovému serveru v okamžiku, kdy se k příslušnému serveru připojíme. Toho lze využít např. k tomu, aby se nezobrazoval přihlašovací dialog požadující zadání uživatelského jména a hesla (viz předchozí díl seriálu). Pokud vložíme uživatelské jméno a heslo do vlastnosti Params, budou tyto parametry poslány serveru při připojování a ten je využije k získání požadovaných informací o uživateli. Nevyžádá si tedy již zobrazení přihlašovacího dialogu. Podobně můžeme serveru poslat i jiné údaje, například o znakové sadě apod. Příklad možného nastavení vlastnosti Params:

user_name=sysdba
password=masterkey
sql_role_name=finance
lc_ctype=WIN1252

U tohoto příkladu bych rád upozornil na parametr lc_ctype, který slouží k zadání znakové sady. Problematika znakových sad u databází Interbase (stejně jako kdekoliv jinde) je poměrně rozsáhlá a vzhledem k problémům, které znakové sady dokáží vygenerovat, stojí za to udělat malý cimrmanovský úkrok stranou a zabývat se znakovými sadami (a jejich vztahem k platformě Interbase) podrobněji. Tento úkrok učiníme za týden: příští díl seriálu bude celý věnován znakovým sadám.

Vlastnost TransactionCount

Vlastnost TransactionCount je jen pro čtení a vrací počet transakcí, které jsou asociovány s příslušnou komponentou IBDatabase. Tato vlastnost úzce souvisí s vlastností Transactions, viz dále.

Vlastnost Transactions

Pomocí (indexované) vlastnosti Transactions můžeme získat informace o jednotlivých transakcích asociovaných s příslušnou komponentou IBDatabase. Tato vlastnost, stejně jako předchozí vlastnost (TransactionCount), je obvykle používána pouze interně (Delphi) ke směrování zpráv, v programu je obvykle nepoužíváme.

Vlastnost LoginPrompt

Vlastnost LoginPrompt sice není přímo členem třídy TIBDatabase (komponenta IBDatabase ji zdědila od třídyTCustomConnection), ale protože se při práci s touto komponentou občas používá, uvedeme ji v našem přehledu též. V našem seriálu jsme se s ní již setkali, když jsme si v předchozím dílu prakticky ukazovali, jak zabránit zobrazení přihlašovacího dialogu při připojování k databázi.

Vlastnost LoginPrompt souvisí se dvěma úkoly: se vznikem události OnLogin a se zobrazením zmíněného přihlašovacího dialogu.

V případě databází Interbase (a tedy komponenty IBDatabase) platí, že přihlašovací dialog se zobrazí po vygenerování události BeforeConnect a před vznikem události AfterConnect. Pokud ovšem ošetříme událost OnLogin, generuje se tato událost namísto zobrazení přihlašovacího dialogu. Pokud se tedy rozhodneme ošetřit událost OnLogin, máme plnou zodpovědnost za předání uživatelského jména a hesla databázovému serveru, neboť standardní přihlašovací dialog nebude zobrazen. Nepředáme-li serveru správné přihlašovací údaje, spojení nebude navázáno.

Shrňme tedy ještě jednou situaci, která je možná poněkud nepřehledná:

  • Pokud nastavíme LoginPrompt na True, znamená to, že musíme ručně zajistit odeslání přihlašovacích údajů databázovému serveru. To můžeme provést dvěma způsoby:
    • neošetřit událost OnLogin komponenty IBDatabase. V tom případě se při startu aplikace zobrazí přihlašovací dialog, v němž je nutné vyplnit přihlašovací údaje.
    • ošetřit událost OnLogin komponenty IBDatabase. V tom případě se při startu aplikace neobjeví nic a přihlašovací údaje musíme správně nastavit v obsluze události OnLogin.

  • Pokud nastavíme LoginPrompt na False, budou přihlašovací údaje hledány ve vlastnosti Params. Pokud se v této vlastnosti správné údaje nevyskytují, nedojde k připojení k databázi (a vůbec nezáležé na případném ošetření události OnLogin).

V předchozí dílu seriálu jsme si ukázali možnost LoginPrompt=False (a hodnoty přihlašovacích údajů nastaveny v Params) a zdůraznili jsme varování, že uchovávání uživatelského jména a hesla ve vlastnosti Params je velmi nebezpečné (protože tyto údaje lze velmi snadno přečíst v souboru EXE). Dnes toto varování rozšíříme – uchovávání uživatelského jména a hesla v obsluze události OnLogin není o nic bezpečnější.

Nyní si ukážeme příklad na obsluhu události OnLogin, v níž nastavíme uživatelské jméno a heslo. Připomeňme tedy, že v tomto příkladu:

  • vlastnost LoginPrompt je nastavena na True,
  • na obsahu vlastnosti Params nezáleží.

procedure TForm1.IBDatabase1Login(Database: TIBDatabase;
  LoginParams: TStrings);
begin
  LoginParams.Add(`user_name=SYSD2BA`);
  LoginParams.Add(`password=masterkey`);
end;

Je patrné, že v obsluze události OnLogin máme k dispozici parametr LoginParams typu TStrings, do níž nastavíme požadované údaje prostřednictvím známé metody Add.

Tolik k popisu nejdůležitějších vlastností komponenty IBDatabase. Protože tato komponenta obsahuje dále mnoho zajímavých metod, budeme pokračovat jejich popisem.

Metoda CheckActive

Otestuje, je-li aktivní databázové připojení (je-li aplikace připojena k databázovému serveru).

Metoda CheckDatabaseName

Otestuje, není-li náhodou prázdná vlastnost DatabaseName. Pokud je prázdná, znamená to, že pro správnou činnost komponenty (pro připojení k serveru) je nutné jméno databáze vložit do vlastnosti DatabaseName.

Metoda CreateDatabase

Pomocí této metody lze programově vytvořit novou databázi (nikoliv datovou tabulku, ale celou databázi). Aby byla databáze správně vytvořena, je nutné před zavoláním CreateDatabase správně nastavit vlastnost Params, která musí obsahovat všechny potřebné parametry pro vytvoření databáze. Tyto parametry musí být stejné, jaké bychom použili v příkazu CREATE TABLE.

Chceme-li tedy vytvořit databázi pomocí této metody, je nutné:

  • Nastavit jméno databáze (DatabaseName) na nějaký (dosud neexistující) diskový soubor.
  • Nastavit vlastnost Params. Do této vlastnosti je třeba vložit všechny potřebné parametry pro vytváření databáze, viz příklad níže.
  • Nastavit použitý SQL dialekt (SQLDialect).
  • Zavolat metodu CreateDatabase.

Příklad obsahu vlastnosti Params pro vytváření databáze pomocí metody CreateDatabase:

USER "SYSDBA"
PASSWORD "masterkey"
PAGE_SIZE 4096
CHARACTER SET WIN1250

Metoda DropDatabase

Tato metoda slouží ke zrušení (odebrání) databáze – odebere ze serveru příslušný databázový soubor.

Metoda GetFieldNames

Pomocí metody GetFieldNames můžeme získat jména položek (sloupců) v zadané tabulce, viz ukázková aplikace níže.

Metoda GetTableNames

Pomocí metody GetTableNames lze získat jména všech tabulek v zadané databázi, viz ukázková aplikace níže.

Metoda Open

Otevře databázové připojení (připojí se k databázi) a nastaví vlastnost Connected na True.

Metoda Close

Uzavře aktivní databázové spojení – odpojí se od databáze. Metoda dále nastaví vlastnost Connected na False.

Ukázková aplikace – seznam tabulek a jejich sloupců v databázi

Vytvoříme společně aplikaci, která vypíše seznam tabulek v databázi PLATY a která dále vypíše pro každou tabulku přehled jejích sloupců.

1. Vytvořte novou aplikaci, na formulář vložte komponenty potřebné pro vytvoření Interbase databázové aplikace (tj. IBDatabase, IBTransaction, třeba IBTable, DataSource) a dále dva seznamy ListBox a tlačítko Button.

2. Nastavte správně potřebné vlastnosti všech databázových komponent, např.

  • pro komponentu IBDatabase nastavte vlastnost DatabaseName na c:\!\platy.gdb, vlastnost DefaultTransaction na IBTransaction1 a vlastnost Connected na True;
  • pro komponentu IBTransaction nastavte vlastnost DefaultDatabase na IBDatabase1 a vlastnost Active na True;
  • pro komponentu IBQuery nastavte vlastnost Database na IBDatabase1 a vlastnost Active ponechte na False;
  • pro komponentu DataSource nastavte vlastnost DataSet na IBQuery1;
  • pro komponentu DBGrid nastavte vlastnost DataSource na DataSource1.

3. Ošetřete událost OnClick tlačítka Button1. V této obsluze zobrazíme v seznamu ListBox1 seznam tabulek aktuální databáze (databáze nastavené ve vlastnosti DatabaseName komponenty IBDatatabase, v našem případě tedy databáze Platy.gdb). Ke zjištění tabulek použijeme metodu IBDatabase1.GetTableNames:

procedure TForm1.Button1Click(Sender: TObject);
begin
  IBDatabase1.GetTableNames(ListBox1.Items);
end;

4. Ošetřete událost OnClick seznamu ListBox1. V této obsluze vypíšeme seznam všech položek (tedy sloupců) tabulky označené v seznamu ListBox1. Ke zjištění sloupců dané tabulky použijeme metodu IBDatabase1.GetFieldNames:

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  IBDatabase1.GetFieldNames(ListBox1.Items[ListBox1.ItemIndex], ListBox2.Items);
end;

Aplikace je hotova, zkuste ji přeložit, spustit a klepněte na tlačítko Button1, viz obrázek. V levém seznamu najdete seznam tabulek zadané databáze (databázi jsme zadali v Object Inspectoru při nastavování vlastností komponenty IBDatabase – c:\!\platy.gdb). Po klepnutí na některou tabulku se v pravém seznamu vypíše přehled jejích polí (sloupců).

Klepněte pro větší obrázek

Na závěr

Dnešní článek se věnoval jedné z nejdůležitějších komponent ze záložky Interbase – komponentě IBDatabase zapouzdřující připojení k databázi a databázi samotnou. Popsali jsme si její důležité vlastnosti a metody. Komponentu IBDatabase používáme v kterékoliv aplikaci pracující s platformou Interbase, proto stojí za to věnovat jí náležitou pozornost. V příštím dílu, jak jsme se zmínili v předchozím textu, se budeme zabývat znakovými sadami a jejich vztahem k databázím Interbase.

Diskuze (1) Další článek: Uživatelé broadbandu o placené služby nestojí

Témata článku: Software, Programování, Ukázkový příklad, Důležitý údaj, Díl, Důležitý soubor, Sloupec, Transakce, Masterkey, Důležitá událost, Password, Odrazový můstek, Potřebná aplikace, Automatické odpojení, Dialog, Toto, Důležitý sloupec, Uživatelské jméno, Dnešní přehled, Zajímavá vlastnost, Zajímavé jméno, Zajímavý obsah, Tito, Databáze, Komponenta


Určitě si přečtěte

Pojďme programovat elektroniku: Když už vás ten chumel součástek prostě nebaví

Pojďme programovat elektroniku: Když už vás ten chumel součástek prostě nebaví

** Levné cetky z Asie stojí dolar ** Postavíte s nimi skoro vše od teploměru po spínač zavlažování ** Má to ale jeden háček. Bude to ošklivé a povětšinou nekvalitní

Jakub Čížek | 22

Porno insider: Jak virtuální realita vstupuje do filmů pro dospělé

Porno insider: Jak virtuální realita vstupuje do filmů pro dospělé

** Pornografie údajně představuje třetinu internetové obsahu a je technologický tahounem ** Do erotického obsahu postupně zasahuje i virtuální realita ** Kromě vizuálního vjemu se pracuje také na virtuálním uspokojení toho hmatového

Jan Dudek | 29

Nová americká jaderná puma změní strategii boje

Nová americká jaderná puma změní strategii boje

** Bombardér Northrop Grumman B-2 Spirit amerického letectva nedávno svrhl jadernou pumu ** Šlo o test nové varianty pumy B61-12 ** Ta by měla mít hlavice schopné explodovat se silou 0,3 až 50 kilotun

Stanislav Mihulka | 63

Musk pošle lidi na oblet Měsíce. Japonský podnikatel Maezawa vezme na cestu až osm umělců

Musk pošle lidi na oblet Měsíce. Japonský podnikatel Maezawa vezme na cestu až osm umělců

** SpaceX chce nejdříve v roce 2023 vyslat lidi na oblet Měsíce ** Hlavním pasažérem bude japonský podnikatel Jusaku Maezawa, který vezme na cestu až 8 umělců ** Pětidenní cesta proběhne v chystané lodi BFS

Petr Kubala | 14

Google Cloud Next: Blíží se bitva o to, kdo ovládne cloud, tedy internet zítřka

Google Cloud Next: Blíží se bitva o to, kdo ovládne cloud, tedy internet zítřka

** Google v týdnu ukázal nové telefony Pixel ** V Londýně se ale také konal Google Cloud Next ** Konference o tom, jak bude vypadat internet v cloudu zítra

Jakub Čížek | 31


Aktuální číslo časopisu Computer

Jak vytvořit a spravovat vlastní web

Velký test herních klávesnic a DVB-T2 tunerů

Vše o formátu RAW

Vybíráme nejlepší základní desku