pondělí 17. března 2014

Vývoj databázových aplikací III

Komunikace s DB

Od okamžiku, kdy se úspěšně připojíme k databázi, s ní můžeme začít komunikovat. Databázovému stroji předáváme naše požadavky ve formě SQL příkazů a server na ně odpovídajícím způsobem reaguje.
Z pohledu komponent FireDAC je třeba rozlišovat, jaký typ dat DB server na základě zaslaného požadavku vrátí:
• Příkaz nevrací žádná data (DDL, DML, DCL, TCL)
• Příkaz vrací právě jednu hodnotu (Agregační funkce DQL)
• Příkaz vrací výsledkovou sadu neboli "result set" (DQL)

DDL (Data Definition Language) - Příkazy umožňující definovat datové schéma. Mezi základní příkazy DDL patří:
• CREATE (Vytvoří požadovaný typ objektu)
• ALTER (Umožňuje provést změnu struktury existujícího objektu)
• DROP (Odstraní určený objekt z databáze)

DQL (Data Query Language) - Příkazy pro výběr množiny dat z jedné nebo více tabulek nebo pohledů:
• SELECT (Vrací data z dle zadaných kritérií)

DML (Data Manipulation Language) - Obsahuje set příkazů pro práci s uloženými daty. Mezi základní příkazy DML patří:
• INSERT (Vkládá nové záznamy do určené tabulky)
• UPDATE (Provede aktualizaci určených záznamů)
• DELETE (Odstraní příkazem specifikovaná data)

DCL (Data Control Language) - Příkazy pro řízení přístupových práv k jednotlivým objektům databáze. Mezi příkazy DCL patří:
• GRANT (Přiznává uvedená oprávnění určenému uživateli)
• REVOKE (Odebírá uživateli uvedená oprávnění)

TCL (Transaction Control Language) - Příkazy pro řízení transakcí, nebo li sledu operací sdružených do logických bloků. TCL příkazy jsou:
• COMMIT (Provede uložení v rámci transakce provedených změn)
• ROLLBACK (Odvolává transakci a vrací data do původního stavu)

Komunikace se serverem na úrovni připojení

Některé požadavky lze databázovému serveru předat přímo na úrovni připojení. Výhodou je, že odpadá poměrně vysoká režie, kterou vyžaduje obsluha výsledkových sad. Ta je přímo implementovaná v komponentách jako jsou "FDQuery", "FDTable" nebo "FDStoredProc". Pro zaslání příkazu databázi nabízí FireDAC připojení dvě funkce:

ExecSQL - Použití ExecSQL je vhodné pro příkazy, které nevrací žádnou výsledkovou sadu. Případná chybová hlášení můžeme ošetřit za pomoci bloku "try-except". ExecSQL voláme jako metodu objektu ADConnection:


Delphi

procedure TForm1ButtonClick(Sender: TObject);
begin
  try
    FDConnection1.ExecSQL('REVOKE SELECT ON OBJECT::KRAJ TO public');
  except
    on E: EFDDBEngineException do
      ShowMessage(E.ToString);
  end;
end;



C++ Builder

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  try {
  FDConnection1->ExecSQL("REVOKE SELECT ON OBJECT::KRAJ TO public");
  } catch (EFDDBEngineException &EFDDBEngineException) {
  ShowMessage(UnicodeString(EADDBEngineException.Message));
  }
}

ExecSQLScalar - Potřebujeme-li spustit příkaz, který vrací právě jednu hodnotu (například agregační funkce jako jsou COUNT, SUM, MAX, AVG a podobně), můžeme použít metodu ExecSQLScalar:


Delphi

procedure TForm1ButtonClick(Sender: TObject);
var
  cnt: integer;
begin
  try
    cnt := FDConnection1.ExecSQLScalar('select count(*) from firma');
  except
    on E: EFDDBEngineException do
      ShowMessage(E.ToString);
  end;
  ShowMessage(IntToStr(cnt));
end;


C++ Builder

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  Integer cnt;
  try {
  cnt = FDConnection1->ExecSQLScalar("select count(*) from firma");
  ShowMessage(IntToStr(cnt));
  } catch (EFDDBEngineException &EFDDBEngineException) {
  ShowMessage(UnicodeString(EFDDBEngineException.Message));
  }
  ShowMessage(IntToStr(cnt));
}

TFDCommand

Další možností pro spouštění příkazů, které nevrací žádnou výsledkovou sadu je použití komponenty TADCommand. Hlavní předností je přímá podpora asynchronního spouštění příkazů, které lze nastavit za pomoci parametru "CmdExecMode".

Parametr "CmdExecMode" může nabývat následujících hodnot:

amBlocking - Vlákno, z kterého bylo volání příkazu spuštěno, je spolu s uživatelským rozhraním blokováno, dokud není akce dokončena.
amNonBlocking - Vlákno, z kterého bylo volání příkazu spuštěno, je blokováno po dobu provádění příkazu. Uživatelské rozhraní blokováno není.
amCancelDialog  - Nastavení je shodné s volbou "amBlocking", navíc je však zobrazen dialog, který umožňuje spuštěnou akci kdykoliv přerušit.
amAsync – Není blokováno ani vlákno z kterého byl příkaz vyvolán, ani uživatelské rozhraní. Volaná metoda okamžitě předává řízení zpět aplikaci.

Pokud v kódu použijeme parametr "CmdExecMode", musí být součástí projektu instance třídy "TFDGUIxAsyncExecuteDialog". Tu můžeme vytvořit v kódu, nebo ji vybrat v paletě komponent a jednoduše ji umístit na formulář. Zobrazený text lze nastavit přes vlastnost "Prompt".

Dialog Asynchronního spuštění



Delphi

procedure TForm1ButtonClick(Sender: TObject);
begin
  FDCommand1.ResourceOptions.CmdExecMode := amNonBlocking;
  FDCommand1.CommandText.add('REVOKE SELECT ON OBJECT::KRAJ TO public');
  try
    FDCommand1.Active := True;
  except
    on E: EFDDBEngineException do
      ShowMessage(E.ToString);
  end;
end;


C++ Builder

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  FDCommand1->ResourceOptions->CmdExecMode = amNonBlocking;
  FDCommand1->CommandText->Add("REVOKE SELECT ON OBJECT::KRAJ TO public");
  try {
  FDCommand1->Active = True;
  } catch (EFDDBEngineException &EFDDBEngineException) {
  ShowMessage(UnicodeString(EFDDBEngineException.Message));
  }
}

Pokud má být spuštěna uložená procedura, je třeba nastavit vlastnost "ADCommand.CommandKind" na hodnotu "skStoredProc". Pro ostatní příkazy to není nutné, FireDAC rozpozná typ příkazu automaticky.

Spouštění sady SQL příkazů

Jsou situace, kdy je třeba spustit sled více souvisejících SQL příkazů. Většina databázových strojů má k dispozici "oddělovač příkazů", díky kterému lze "dávku" spustit stejným způsobem, jako samostatný příkaz. Tento přístup však má celou řadu omezení. Pro řešení komplexnějších úlohu lze použít databázový "skript".
Rozdíly mezi Dávkou a skriptem:
• Skript může obsahovat i příkazy jiného jazyka než SQL
• Jsou k dispozici informace o průběhu, snazší logování
• Ve skriptu lze použít všechny typy příkazů včetně DDL
• Skript se na rozdíl od dávky může skládat z více transakcí
• Vykonávání skriptu řídí klient, vykonávání dávky server
• Pro spuštění skriptu je třeba mít patřičné rozhraní

Vytvoření a spuštění dávky
Sestavení dávky z jednotlivých řetězců umožňují komponenty "TADCommand" (metoda CommandText.Add()) nebo "TADQuery" (metoda SQL.Add()).


Delphi

procedure TForm1ButtonClick(Sender: TObject);
begin
  FDQuery1.SQL.Add('Use EMBT');
  FDQuery1.SQL.Add('begin tran');
  FDQuery1.SQL.Add('insert into tb values(1,' + QuotedStr('A') + ');');
  FDQuery1.SQL.Add('insert into tb values(2,' + QuotedStr('B') + ');');
  FDQuery1.SQL.Add('insert into tb values(3,' + QuotedStr('C') + ');');
  FDQuery1.SQL.Add('Commit;');
  FDQuery1.Active := True;
end;


C++ Builder

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  FDQuery1->SQL->Add("Use EMBT");
  FDQuery1->SQL->Add("begin tran");
  FDQuery1->SQL->Add("insert into tb values(1," + QuotedStr("A") + ');");
  FDQuery1->SQL->Add("insert into tb values(2," + QuotedStr("B") + ');");
  FDQuery1->SQL->Add("insert into tb values(3," + QuotedStr("C") + ');");
  FDQuery1->SQL->Add("Commit;");
  FDQuery1->Active = True;
}

Vytvoření a spuštění SQL Skriptu
SQL Skript lze vytvořit v libovolném textovém editoru. Pokud chceme mít k dispozici pomůcky, jako je třeba kontrola a doplňování syntaxe, formátování nebo vizuální vytváření dotazů, je možné využít některý ze specializovaných komerčních nebo open source editorů.
Jak už bylo uvedeno, skripty používají kromě SQL většinou také další "skriptovací" jazyk. Pro jejich spouštění je tak třeba mít k dispozici odpovídající rozhraní (např. SQLPlus pro Oracle, nebo PowerShell pro MSSQL). Součástí FireDAC je utilita "FDExecutor", kterou lze spustit z příkazového řádku.

FireDAC Executor

Možnost spouštět databázové skripty lze zpřístupnit i uživatelům vytvářených aplikací. Podporu práce se skripty zajišťuje FireDAC komponenta "TFDScript". Komponenta umožňuje sestavit skript řádek po řádku, nebo jej jednoduše načíst z určeného souboru a spustit. Na formulář můžeme také přidat "FDGUIxScriptDialog", který informuje uživatele o průběhu zpracování skriptu nebo zobrazí případné chyby.

FireDAC Script Dialog

Skript lze samozřejmě sestavit také v rámci aplikace. Použijeme třídu "TFDScript". Pomocí jejích metod "SQLScripts.Add" můžeme vytvářet jednotlivé skripty. Obsah skriptu se skládá z jednotlivých položek, které přidáváme pomocí metody "SQL.Add".


Delphi

procedure TForm1ButtonClick(Sender: TObject);
begin
  // Přesměrování výstupů do FDGUIxScriptDialog1
  FDScript1.ScriptDialog := FDGUIxScriptDialog1;
  // Odstraní dříve definované SQL skripty
  FDScript1.SQLScripts.Clear;
  // Přidání nového skriptu do seznamu skriptů
  FDScript1.SQLScripts.Add;
  FDScript1.SQLScripts.Items[0].Name := 'Skript1';
  FDScript1.SQLScripts.Items[0].SQL.Add('use embt;');
  FDScript1.SQLScripts.Items[0].SQL.Add('select * from tb1;');
  // Ověření a spuštění vytvořených skriptů
  FDScript1.ValidateAll();
  FDScript1.ExecuteAll();
end;


C++ Builder

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  FDScript1->ScriptDialog = FDGUIxScriptDialog1;
  FDScript1->SQLScripts->Clear;
  FDScript1->SQLScripts->Add;
  FDScript1->SQLScripts->Items[0]->Name = "Skript1";
  FDScript1->SQLScripts->Items[0]->SQL->Add("use embt;");
  FDScript1->SQLScripts->Items[0]->SQL->Add("select * from tb1;");
  FDScript1->ValidateAll();
  FDScript1->ExecuteAll();
}

View Petr Houf's LinkedIn profileView Petr Houf's profile

čtvrtek 27. února 2014

Vývoj databázových aplikací II

Připojení k databázi

Připojení k databázovému stroji je realizováno nevizuální komponentou "FDConnection". Komponenta podporuje připojení k datům již v době návrhu aplikace ("Design Time"), rovněž však může být použita dynamicky a připojení může být s její pomocí vytvořeno až za běhu aplikace ("Run Time"). Z pohledu nakládání s hodnotami parametrů lze rozlišit tři základní přístupy (typy připojení):


FireDAC - Typy připojení

Trvalé připojení

Parametry tohoto typu připojení jsou uloženy v definičním souboru, který může být využíván různými uživateli i aplikacemi. Trvalé připojení lze definovat s využitím nástroje "FireDAC Explorer". FireDAC Explorer je samostatně spustitelný externí program ("FDExplorer.exe"), který nalezneme ve složce určené proměnnou prostředí "BDSBIN". Ve verzi XE5 je to složka "bin" domovského adresáře RAD Studia (při typické instalaci  C:\Programfiles\Embarcadero\RADStudio\12.0).


Nastavení proměnných prostředí naleznete v nastaveních prostředí (nabídka Tools => Options => Environment Options => Environment Variables)

Od verze XE5 je FireDAC zahrnut v hlavní nabídce. Pro spuštění FireDAC Exploreru tedy můžeme kliknout na nabídku "Tools => FireDAC Explorer". V Exploreru lze editovat stávající nebo vytvářet nové definiční soubory. 
Každý definiční soubor může obsahovat parametry pro libovolný počet připojení. Vždy je nejprve třeba určit ovladač (Driver ID) a následně hodnoty jednotlivých parametrů. Ty se samozřejmě liší dle použité databáze. 


Správa definičních souborů ve FireDAC Exploreru

FireDAC Explorer na základě zadaných informací upraví nebo vytvoří nový definiční soubor (textový soubor s příponou .ini), který je uložen na disku a může tak být snadno sdílen.

Nastavení ovladače
Pokud se připojujete k databázím stejného dodavatele, ale v různých verzích, může nastat problém s použitím správných klientských knihoven. Řešením je úprava souboru FDDrivers.ini, nebo změna "VendorLib" pro příslušný "DriverLink".

Příklad 1: Zápis do FDDrivers.ini
[IBXE3]
BaseDriverID=IB
VendorLibWin32=C:\InterBaseXE3\gds32.dll
VendorLibWin64=C:\InterBaseXE3\gds64.dll


Příklad 2: Změna klientské knihovny za běhu
FDConnection1.Close;
FDPhysIBDriverLink1.Release;
FDPhysIBDriverLink1.VendorLib := 'C:\InterBaseXE3\gds32.dll';
FDConnection1.Open;


FireDAC Explorer také nabízí základní funkce pro procházení databázových objektů, zobrazení jejich struktury, zobrazení dat nebo vytváření a spouštění SQL skriptů.

Procházení objektů ve FireDAC Exploreru



Pokud chcete možnost editovat definiční soubory zpřístupnit i koncovým uživatelům aplikace, lze použít nástroj FireDAC Administrátor ("FDAdminstrator.exe"), který je určený k šíření s aplikací. FDAdministrator je omezen na práci s definičními soubory.

Příklad 3: Vytvoření Definičního souboru v kódu aplikace



Delphi



procedure TForm1.ButtonClick(Sender: TObject);
var
CnnParams: TStrings;
CnnDef: IFDStanConnectionDef;

begin
// Nastavení parametrů připojení
CnnParams := TStringList.Create;
CnnParams.Add('Server=WIN-CR0VL03P8IT');
CnnParams.Add('Database=MSDEMODB');
CnnParams.Add('OSAuthent=Yes');

// Vytvoření a pojmenování definičního souboru
FDManager1.ConnectionDefFileName :=
'C:\DEMAXE5\FDConnections\MujDefSoubor.ini';

// Vytvoření a pojmenování definice. Parametry:
// Zvolené jméno pro připojení, ovladač, parametry připojení
FDManager1.AddConnectionDef('SQL_Connection', 'MSSQL', CnnParams);

// Uložení definice
CnnDef := FDManager1.ConnectionDefs.FindConnectionDef ('SQL_Connection');
CnnDef.MarkPersistent();
CnnDef.Apply();

// Připojení k databázi
FDConnection1.ConnectionDefName := 'Test_Connection';
FDConnection1.Connected := True;
end;




C++ Builder


void __fastcall TForm1::ButtonClick(TObject *Sender)
{
TStrings* CnnParams = new TStringList();
IFDStanConnectionDef* CnnDef;

// Nastavení parametrů připojení
CnnParams->Add("Server=WIN-CR0VL03P8IT");
CnnParams->Add("Database=MSDEMODB");
CnnParams->Add("OSAuthent=Yes");

// Vytvoření a pojmenování definičního souboru
FDManager1->ConnectionDefFileName =
"C:\\DEMAXE5\\FDConnections\\MujDefSoubor.ini";

// Uložení definice
FDManager1->AddConnectionDef("Test_Connection", "MSSQL", CnnParams);
CnnDef = FDManager1->
ConnectionDefs->FindConnectionDef("Test_Connection");
CnnDef->MarkPersistent();
CnnDef->Apply();

// Připojení k DB
FDConnection1->ConnectionDefName = "Test_Connection";
FDConnection1->Connected = True;
}



Vyhrazené připojení

Interní připojení umožňuje technologie FireDAC definovat pouze v rámci aplikace. Definiční soubor je vytvořen s využitím komponenty "FDManager" pouze v paměti, ale není uložen na disk pro účely sdílení. Z hlediska kódu je interní připojení identické s připojením trvalým, jen není volána metoda "MarkPersistent". Interní připojení nepodporuje sdružování připojení ("connection pooling").


Dočasné připojení

Pokud je připojení k databázi vytvořené jako dočasné, jsou hodnoty jednotlivých parametrů součástí zdrojového kódu aplikace. Definiční soubor není vytvářen ani v paměti, ani ukládán na disk. Údaje tedy nejsou nikde zveřejněny a nejsou dostupné jiným uživatelům ani aplikacím.

V době návrhu můžeme použít vestavěnou utilitu "Connection editor". Editor spustíme tak, že na formulář umístíme komponentu "FDConnection" a poté na ni klikneme pravým tlačítkem myši.

Vyvolání Connection Editoru


Podle typu databáze, ke které se připojujeme, zvolíme odpovídající ovladač. Následně vyplníme potřebné parametry a nastavení uložíme. Funkčnost připojení lze okamžitě vyzkoušet za pomoci tlačítka "Test".

FireDAC Connection Editor


Další možností je parametry definovat v okně "Object Inspector". Opět je třeba nejprve vybrat ovladač a potom otevřít editor pro vlastnost "Params" a ručně vypsat potřebná nastavení.


Object Explorer


Dočasné připojení je samozřejmě rovněž možné vytvořit programově. Jednotlivé parametry definujeme přímo na úrovni připojení, v našem případě objektu "FDConnection".

Příklad 4: Vytvoření dočasného připojení



Delphi


procedure TForm1.ButtonClick(Sender: TObject);
begin
  FDConnection1.DriverName := 'MSSQL';
  FDConnection1.Params.Add('Server=WIN-CR0VL03P8IT');
  FDConnection1.Params.Add('Database=MSDEMODB');
  FDConnection1.Params.Add('OSAuthent=Yes');
  FDConnection1.Connected := True;
end;




C++ Builder


void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  FDConnection1->DriverName = "MSSQL";
  FDConnection1->Params->Add("Server=WIN-CR0VL03P8IT");
  FDConnection1->Params->Add("Database=MSDEMODB");
  FDConnection1->Params->Add("OSAuthent=Yes");
  FDConnection1->Connected = True;
}


Connection Editor je možné zpřístupnit i uživatelům aplikace. Stačí do sekce "uses" přidat unitu "ConnEdit" a následně z kódu otevřít v ní definovaný dialog.

Příklad 5: Otevření Editoru připojení z kódu



Delphi


uses FireDAC.VCLUI.ConnEdit;

procedure TForm1.ButtonClick(Sender: TObject);
begin
  if TfrmFDGUIxFormsConnEdit.Execute(FDConnection1, '') then
    FDConnection1.Connected := True
end;




C++ Builder


#include

void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  TfrmFDGUIxFormsConnEdit *frmFDGUIxFormsConnEdit1;
  if (frmFDGUIxFormsConnEdit1->Execute(FDConnection1, "")) {
    FDConnection1->Connected = True;
}
}



sobota 8. února 2014

Vývoj databázových aplikací I

Připojení k databázím

Vývojové nástroje Delphi a C++ Builder byly od počátku navrženy pro tvorbu podnikových aplikací, ke kterým neodmyslitelně patří i možnost spolupráce s databázovými stroji. Tak, jak se rozšiřovala nabídka databázových strojů, a měnily se požadavky uživatelů, byla do Delphi i C++ Builderu postupně implementována řada technologií pro přístup k relačním databázím.


Přínos DB komponent

S databázovým serverem by bylo samozřejmě možné komunikovat i přímo bez DB komponent. Jednotlivé databázové servery se však liší jak nabízenými funkcemi, tak i rozhraním, prostřednictvím kterého je možné tyto funkce volat. Server je většinou provozován na jiném stroji, často i na odlišném operačním systému. Dodavatelé tak spolu s DB serverem šíří zpravidla také klientské knihovny pro jednotlivé operační systémy a jejich verze. Klientské knihovny poskytují rozhraní (API) pro vývojáře aplikačního software. I tato rozhraní jsou však ještě příliš specifická. Vývojové nástroje společnosti Embarcadero proto nabízí DB komponenty a ovladače, které vývojáře odstíní od konkrétní implementace a umožňují jim vytvářet snadno přenositelné aplikace, provozovatelné s databázovými stroji různých dodavatelů.


FireDAC

FireDAC je souborem knihoven pro práci s daty získaný v únoru 2013 v rámci akvizice od ruské společnosti DA-Soft. Hlavními přínosy je možnost nasazení na různých platformách včetně mobilních zařízení, rychlost a zpřístupnění specifických funkcí jednotlivých databázových strojů. Spolu s vývojovými nástroji společnosti Embarcadero jsou stále dodávány i další technologie pro přístup k datům (především z důvodu zpětné kompatibility), FireDAC je však v tomto směru jednoznačně "vlajkovou lodí" a pro nové projekty by měl být preferovanou volbou.

FireDAC - Databázový "Hello World"

Než se podrobněji podíváme na jednotlivé komponenty, ukážeme si použití FireDAC komponent na nejjednodušším možném příkladu. Připojíme se k databázi, formulujeme SQL dotaz a zobrazíme získaná data. Na formulář umístíme následující komponenty:

FDConnection - nastavuje parametry připojení k databázi
FDQuery - slouží k definování SQL dotazu
DataSource - zprostředkovává přístup k datové sadě
DBGrid - datová mřížka pro zobrazení dat
DBNavigator - navigační lišta
FDGUIxWaitCursor - multiplatformní "přesýpací hodiny"
FDPhysIBDriverLink (databázový ovladač pro InterBase)



Za pomoci Inspektora objektů nastavíme základní vlastnosti pro jednotlivé komponenty:



Nastavení FDConnection.Params:
Server=localhost
User_Name=SYSDBA
Password=masterkey
CharacterSet=WIN1250
Database=C:\IBData\IBDEMODB.IB
DriverID=IB

Nastavení FDQuery.SQL:
select osoba_id, prijmeni, jmeno from osoba;


Konfigurace je plně totožná s BDE, což usnadňuje případnou migraci starších databázových aplikací.


Použití komponenty TADGUIxWaitCursor nebo přidání unity uADCompGUIx do uses je povinné pro každý projekt využívající technologii FireDAC. V případě, že projekt obsluhu kurzoru neobsahuje, skončí překlad aplikace selháním a je zobrazeno chybové hlášení.




Přiřazení ovladače je povinné pro všechny projekty využívající technologii FireDAC. Pokud není ovladač k aplikaci ani jedním z uvedených způsobů připojen, sestavování aplikace selže a zobrazí se chybové hlášení.




Porovnání FireDAC s ostatními knihovnami

BDE - Původní technologie společnosti Borland pro připojení k databázím. Od roku 2002 již není dále rozvíjena. Neobsahuje tak např. podporu unicode, 64-bitových Windows nebo platformy FireMonkey. BDE je dodáván s ohledem na údržbu starších aplikací, jeho použití v nových projektech se důrazně nedoporučuje.

dbGo (ADO) - Sada komponent zajišťujících přístup k databázím prostřednictvím technologie ActiveX Data Objects (ADO) společnosti Microsoft. Použitelnost je omezena pouze na operační systémy MS Windows.

InterBase Express (IBX) - specializované komponenty pro databázový stroj Interbase. Kromě připojení k DB a zajištění přístupu k datům obsahuje i podporu čiností spojených se správou serveru jako je např. zálohování a obnova dat.

dbExpress - Nástupce BDE uvedený cca v roce 2000 (Delphi 6). Od odstatních typů připojení se odlišuje použitím jednosměrných (unidirectional) datových sad. Výsledky dotazů nejsou automaticky ukládány do vyrovnávací paměti. Pro aktualizaci databáze je třeba použít komponentu "DataSetProvider" a zajistit ošetření případných konfliktů.



Vývojové nástroje Delphi, C++ Builder nebo RAD Studio jsou v současnosti dostupné v mnoha edicích. Jednou z oblastí, v kterých se dodávané edice liší je právě podpora vývoje databázových aplikací. Následující tabulka ukazuje, které technologie jsou v jednotlivých edicích dostupné:




Pro edice Professional je k dispozici balíček "FireDAC Client/Server Add-On Pack", který rozšiřuje možnosti připojení o přístup k databázím Oracle, SQL Server, InterBase, DB2, Firebird, SQLite, MySQL, PostgreSQL, SQL Anywhere, Advantage DB, Access, Informix, DataSnap a dalším.

pondělí 13. ledna 2014

LiveBindings II - Wizard


LiveBindings Wizard


V minulém příspěvku jsme propojení objektů definovali za pomoci LiveBindings Designeru. Druhou možností, jak navrhovat LiveBindings propojení typu "QuickBindings" je použít "LiveBindings Wizard", který uživatele při realizaci typických požadavků vede krok za krokem. Dialog otevřeme kliknutím na ikonu v okně LiveBindings Designeru:

LiveBindings Wizard lze přidat do kontextové nabídky. Ve vlastnostech prostředí (nabídka "Tools => Options") vybereme "LiveBindings" a zaškrtneme volbu "Display LiveBindings Wizard in context menu".



Od tohoto okamžiku je již možné vyvolat LiveBindings Wizard z kontextové nabídky po klinutí pravým tlačítkem myši na formulář.


Následně si stačí v LiveBindings Wizard dialogu zvolit příslušný typ požadované vazby:


Link a control with field - Propojí zvolenou komponentu s určeným zdrojem dat. Umožňuje vybrat existující nebo definovat novou komponentu a připojit ji k určenému datovému zdroji. Pokud žádný datový zdroj není k dispozici, umožňuje jej definovat.
Link a grid with a data source - Propojí existující nově vytvořenou mřížku (TGrid, TStringGrid) s určeným zdrojem dat. Pokud žádný datový zdroj není k dispozici, umožňuje jej definovat.
Link a component property with a control - Umožňuje vybrat komponentu a její zvolenou vlastnost s jinou existující nebo nově definovanou komponentou.
Link a component property with a field - Propojí vybranou vlastnost zvolené komponenty s požadovaným datovým zdrojem. Pokud žádný datový zdroj není k dispozici, umožňuje jej definovat.
Create a data source - Umožňuje definovat nový datový zdroj (jeho typ, položky, případně doplňkové atributy jako jsou popisky nebo navigační tlačítka).



LiveBindings Wizard je kontextový, takže pokud klikneme pravým tlačítkem myši místo na formuláře na některou z existujících komponent, nabídne pouze relevantní možnosti (viz např. pro CheckBox).

Editace vizuálně navržených vazeb

Vlastnosti propojení definovaných s využitím průvodce "LiveBindings Wizard" nebo LiveBindings Designeru lze samozřejmě editovat v Inspektorovi Objektů. Stačí otevřít LiveBindings Designer a kliknout na příslušnou vazbu (symbol šipky mezi objekty). Možnost editace již definovaných vazeb nabízí také komponenta "BindingsList".


Komponenta BindingsList

Třetí možností jak definovat LiveBindings propojení mezi vlastnostmi komponent nebo komponentami a datovými zdroji je použití komponenty BindingsList (seznam propojení). BindingsList komponentu umístíme na formulář a poklepeme na ni levým tlačítkem myši. Otevře se dialog pro správu propojení. Nové propojení přidáme volbou "New Binding...":

Pokud již bylo pomocí Wizardu nebo LiveBindings Designeru vytvořeno alespoň jediné propojení, byla komponenta BindingsList přidána na formulář automaticky.


Na první pohled vidíme, že nabídka vazeb je rozsáhlejší. Kromě "QuickBindings" dialog nabízí ještě další kategorie, jako jsou "Bindigs Expressions", "Links" nebo "Lists".

Bindings Expressions
Všechna propojení jsou definována jednoduchými textovými výrazy (Bind Expressions), které při běhu aplikace průběžně vyhodnocuje LiveBindings Engine.


TBindExpression - Umožňuje definovat dvojici výrazů "Source Expression" a "Control Expression" mezi právě jednou vlastností zdrojového objektu a jednou vlastností cílového objektu.

  • Source Expression - Výraz, který zajišťuje vyhodnocení vstupu
  • Control Expression - Výraz, který zajišťuje vyhodnocení výstupu
TBindExprItems - Pro některá propojení (např. mezi datovou sadou a mřížkou) může být definováno více výrazů (Expressions Collection). V kolekci mohou být zastoupeny výrazy typu "Format", "Parse" a "Clear":

  • Format - Ovlivňuje tvar, v jakém bude informace předána ("zápis")
  • Parse - Ovlivňuje získání informace ze zdroje ("čtení")
  • Clear - Zajišťuje odstranění dříve předané informace ("čištění")
Links
TBindLink - Určen pro definování propojení umožňující předat hodnotu určené vlastnosti objektu zvolenému datovému zdroji.
TBindListLink - Specializovaný link pro objekty typu List.
TBindGridLink - Specializovaný link pro objekty typu Grid.
TBindPosition - Link umožňující synchronizaci pozice mezi objekty pracujícími s kolekcemi (např. ListBox a Grid).
TBindControlValue - Link umožňující synchronizaci hodnot při jejich změně ve zdrojovém objektu.

Lists
TBindList - Definuje jednosměrnou vazbu pro naplnění objektů jako ListBox, ComboBox a podobně.
TBindGridList - Definuje jednosměrnou vazbu pro naplnění objektů typu Grid.

Bindings Expressions, Links a Lists jsou otevřenější a poskytují více možností pro uživatelská nastavení než vizuální návrh prostřednictvím QuickBindings. Použití konverzí a metod v LiveBindings výrazech bude věnován příští příspěvek.