11. Správa databázového sezení

Databázové aplikace komunikují s databází pomocí BDE. Aplikační databázové připojení, ovladače, kurzory, dotazy apod. jsou spravovány v kontextu jednoho nebo více BDE sezení. Sezení izoluje množinu databázových přístupových operací, jako je databázové připojení, bez nutnosti spouštět jinou instanci aplikace.
V aplikaci můžeme spravovat sezení BDE pomocí komponent TSession a TSessionList. Každá komponenta TSession v aplikaci zaobaluje jedno sezení BDE. Všechny sezení v aplikaci jsou spravovány jednou komponentou TSessionList.
Všechny databázové aplikace automaticky vytvářejí komponentu sezení nazvanou Session, která zaobaluje implicitní sezení BDE. Aplikace může deklarovat, vytvářet a manipulovat s dalšími komponentami sezení podle potřeby.
Všechny databázové aplikace také automaticky vytvářejí komponentu seznamu sezení nazvanou Sessions, která umožňuje aplikaci spravovat všechny své komponenty sezení.
Tato kapitola popisuje komponenty sezení a seznamu sezení a jejich použití k řízení BDE sezení databázových aplikací.
Poznámka: Implicitní komponenty sezení a seznamu sezení jsou vyhovující pro většinu aplikací. Pouze aplikace používající více vláken (např. protože potřebují spustit souběžné dotazy na jednu databázi) mohou potřebovat manipulovat se svými komponentami sezení a seznamu sezení.
V této kapitole bude popsáno:

Práce s komponentou sezení

Komponenta sezení poskytuje globální správu nad skupinou databázových připojení v aplikaci. Když vytvoříme úplnou klientskou databázovou aplikaci nebo aplikační server, pak naše aplikace automaticky obsahuje komponentu sezení nazvanou Session. Když přidáváme k aplikaci komponenty databáze a datových množin, pak jsou automaticky přiřazeny k tomuto implicitnímu sezení. Sezení také umožňuje řídit přístup k souborům Paradoxu chráněným heslem a specifikovat adresář pro sdílené soubory Paradoxu na síti. Aplikace mohou řídit databázová připojení a přístup k souborům Paradoxu pomocí vlastností, událostí a metod sezení.
Implicitní sezení můžeme použít k řízení všech databázových připojení v aplikaci nebo můžeme vytvořit další komponenty sezení při návrhu nebo je vytvářet dynamicky za běhu k řízení podmnožiny databázových připojení v aplikaci.
Některé aplikace, jako jsou aplikace, které spouštějí souběžné dotazy na stejnou databázi vyžadují další komponenty sezení. V tomto případě každý souběžný dotaz musí být spuštěn pod svým vlastním sezením. Více vláknové databázové aplikace také vyžadují více sezení. Aplikace, které používají více sezení musí tato sezení spravovat pomocí komponenty seznamu sezení nazvané Sessions.
Tato část je popsána v těchto bodech:
Používání implicitního sezení
Všechny databázové aplikace jsou automaticky vybaveny implicitním sezením. C++ Builder vytváří implicitní komponentu sezení nazvanou Session pro databázové aplikace při jejich spuštění (její SessionName je "Default"). Implicitní sezení poskytuje globální řízení nad všemi komponentami databáze nepřiřazeným k jiným sezením, které jsou dočasné (vytvořené sezením za běhu když datová množina je otevřena a není přiřazena k námi vytvořené komponentě databáze) nebo trvalé (explicitně vytvořené naší aplikací). Implicitní sezení není viditelné v datovém modulu nebo na formuláři během návrhu, ale můžeme přistupovat k jeho vlastnostem a metodám v kódu za běhu aplikace.
Když vytvoříme komponentu databáze, pak je automaticky přiřazena k implicitnímu sezení. Musíme pouze přiřadit vytvářenou komponentu databáze k explicitně pojmenovanému sezení, jestliže komponenta provádí souběžné dotazy na jiných databázích než databázích otevřených implicitním sezením. V tomto případě, vytvoříme více vláknovou databázovou aplikaci a musíme vytvořit jedno další sezení pro obsluhu každého dalšího vlákna.
K použití implicitního sezení, nemusíme zapisovat žádný kód, dokud naše aplikace nemusí: Když přidáme komponentu databáze k aplikaci během návrhu nebo ji vytvoříme dynamicky za běhu, pak je automaticky přiřazena k implicitnímu sezení, pokud nespecifikujeme její přiřazení k jinému sezení. Jestliže naše aplikace otevírá datovou množinu, která není přiřazena ke komponentě databáze, pak C++ Builder automaticky:
  1. Vytváří pro ní za běhu komponentu databáze.
  2. Přiřazuje komponentu databáze k implicitnímu sezení.
  3. Inicializuje některé klíčové vlastnosti komponenty databáze na základě implicitních vlastností sezení.
Jednou z nejdůležitějších vlastností je KeepConnections, která určuje zda databázové připojení je udržováno nebo zrušeno aplikací. Další vlastnosti, události a metody komponenty TSession jsou popsány ve zbytku této kapitoly.
Vytváření dalších sezení
Můžeme vytvořit své vlastní sezení k nahrazení implicitního sezení. Během návrhu můžeme umístit další sezení na datový modul (nebo formulář), nastavit jeho vlastnosti v Inspektoru objektů, zapsat pro něj obsluhy událostí a zapsat kód, který volá jeho metody. Můžeme také vytvářet sezení, nastavovat jejich vlastnosti a volat jejich metody za běhu. Vytvářením dalších sezení se nemusíme zabývat pokud aplikace nespouští souběžné dotazy nebo se nejedná o více vláknovou aplikaci.
K povolení dynamického vytváření komponenty sezení za běhu provedeme následující kroky:
  1. Deklarujeme ukazatel na proměnnou TSession.
  2. Vytvoříme nové sezení pomocí operátoru new. Tento operátor volá konstruktor TSession k vytvoření a inicializaci nového sezení. Konstruktor nastavuje prázdný seznam komponent databáze pro sezení, nastavuje prázdný seznam zpětných volání BDE pro sezení, nastavuje vlastnost KeepConnections na true a přidává sezení k seznamu sezení udržovaných komponentou seznamu sezení aplikace.
  3. Nastavíme vlastnost SessionName pro nové sezení na unikátní jméno. Tato vlastnost je použita k přiřazení komponenty databáze k sezení.
  4. Aktivujeme sezení a volitelně můžeme přizpůsobit jeho vlastnosti.
Tyto kroky jsou použity v následujícím kódu:
TSession *SecondSession = new TSession(Form1);
try
{
  SecondSession->SessionName = "SecondSession";
  SecondSession->KeepConnections = false;
  SecondSession->Open();
  ...
}
__finally
{
  delete SecondSession;
};
Poznámka: Nikdy nerušíme implicitní sezení.
Můžeme také spravovat vytváření a otevírání sezení pomocí metody OpenSession komponenty TSessionList. Použití OpenSession je bezpečnější než použití operátoru new, protože OpenSession vytváří pouze sezení, která zatím neexistují.
Pojmenování sezení
Vlastnost SessionName sezení je použita pro jméno sezení používané pro přiřazování databází a datových množin k sezení. Pro implicitní sezení vlastnost SessionName je "Default". Pro každou další vytvářenou komponentu sezení, musíme nastavit její vlastnost SessionName na unikátní hodnotu.
Komponenty databáze a datové množiny mají vlastnosti SessionName, které odpovídají vlastnosti SessionName komponenty sezení. Pokud vlastnost SessionName pro komponentu databáze nebo datové množiny vyprázdníme, pak tato komponenta je automaticky přiřazena k implicitnímu sezení. Můžeme také nastavit SessionName komponenty databáze nebo datové množiny na jméno odpovídající SessionName vytvořené komponenty sezení.
Např. následující kód používá metodu OpenSession implicitní komponenty TSessionList (nazvané Sessions), k otevření nové komponenty sezení, nastavení jejího SessionName na "InterBaseSession", aktivaci sezení a přiřazení existující komponenty databáze Database1 k tomuto sezení:
TSession *IBSession = Sessions->OpenSession("InterBaseSession");
Database1->SessionName = "InterBaseSession";
Aktivování sezení
Active je vlastnost typu bool, která určuje, zda komponenty databáze a datové množiny přiřazené k sezení jsou otevřené. Tuto vlastnost můžeme použít k zjištění současného stavu databázového sezení a připojené datové množiny nebo k její změně.
K určení současného stavu sezení testujeme Active. Pokud Active je false (implicitně), pak všechny databáze a datové množiny přiřazené k sezení jsou uzavřeny. Je-li true, pak databáze a datové množiny jsou otevřeny.
Nastavení Active na true generuje událost OnStartup sezení, nastavuje vlastnosti NetFileDir a PrivateDir, pokud jim jsou přiřazeny hodnoty a nastavuje vlastnost ConfigMode. Můžeme zapsat obsluhu události OnStartup k provádění dalších databázových spouštěcích aktivit. Vlastnosti NetFileDir a PrivateDir jsou používány pouze pro připojování k tabulkám Paradoxu. ConfigMode určuje jak BDE zpracuje přezdívky BDE vytvořené v kontextu sezení.
Po aktivizaci sezení můžeme otevřít jeho databázová připojení voláním metody OpenDatabase.
Pro komponenty sezení umístěné v datovém modulu nebo na formuláři, nastavíme Active na false, když chceme otevřené databáze a datové množiny uzavřít. Za běhu, uzavírání databází a datových množin může vyvolat k nim přiřazené události.
Poznámka: Nemůžeme nastavit Active implicitního sezení na false během návrhu. I když za běhu můžeme uzavřít implicitní sezení, není to doporučováno.
Pro námi vytvořenou komponentu sezení, použijeme Inspektor objektů k nastavení Active na false při návrhu k zákazu všech databázových přístupů pro sezení změnou jediné vlastnosti. Provedeme to tehdy, jestliže během vývoje aplikace nechceme přijímat výjimky informující, že vzdálené databáze je dočasně neaktivní.
K aktivaci a deaktivaci jiných než implicitních sezení můžeme také při běhu aplikace použít metody sezení Open a Close. Např. následující kód uzavírá všechny otevřené databáze a datové množiny sezení:
Session1->Close();
Tento kód nastavuje vlastnost Active komponenty Session1 na false. Když je vlatnost Active sezení false, pak každý pokus aplikace o otevření databáze nebo datové množiny nastaví Active na true a volá obsluhu události OnStartup sezení (pokud existuje). Reaktivovat sezení lze provést také kódem za běhu. Následující kód reaktivuje Session1:
Session1->Open();
Poznámka: Pokud sezení je aktivní, pak můžeme také otevírat a uzavírat jednotlivá databázová připojení.
Přizpůsobení spouštění sezení
Chování spouštění sezení můžeme přizpůsobit zápisem obsluhy události OnStartup sezení. Tato událost vzniká, když sezení je aktivováno. Sezení je aktivováno při jeho prvním vytvoření a dále, když jeho vlastnost Active je změněna z false na true (např. když databáze nebo datová množina přiřazená k sezení je otevřena a nejsou otevřené jiné databáze nebo datové množiny).
Specifikace implicitního chování databázového připojení
KeepConnection poskytuje implicitní hodnotu pro vlastnost KeepKonnection dočasných komponent databáze vytvářených za běhu aplikace. KeepConnection specifikuje co se stane s připojením databáze zřízeným pro komponentu, když všechny její datové množiny jsou uzavřeny. Je-li true (implicitně), pak konstantní nebo trvalá databázová připojení jsou udržována i když datové množiny nejsou aktivní. Pro false, připojení databáze je ukončeno, jakmile všechny její datové množiny jsou uzavřeny.
Poznámka: Trvalé připojení pro komponentu databáze explicitně umístěnou v datovém modulu nebo na formuláři je řízeno vlastností KeepConnection komponeny databáze. Jestliže se liší v nastavení, pak KeepConnection pro komponentu databáze vždy přepisuje vlastnost KeepConnection sezení.
KeepConnection je vhodné nastavit na true pro aplikace, které často otevírají a uzavírají všechny datové množiny přiřazené k databázi na vzdáleném serveru. Toto nastavení omezuje provoz na síti a urychluje přístup k datům, protože připojení je otevřeno a uzavřeno pouze jednou v průběhu sezení. Jinak aplikace pokaždé při odpojení a připojení k databázi uzavírá nebo opětovně zřizuje připojení.
Poznámka: Když KeepConnection pro sezení je true, pak můžeme uzavřít neaktivní databázová připojení pro všechny dočasné komponenty databáze a potom uvolnit dočasné komponenty databáze voláním metody DropConnections.
Např. následující kód ukončuje neaktivní připojení a uvolňuje všechny dočasné komponenty databáze pro implicitní sezení:
Session->DropConnections();
Vytváření, otevírání a uzavírání databázových připojení
Pro otevření databázového připojení v sezení voláme metodu OpenDatabase. OpenDatabase přebírá jeden parametr, jméno otevírané databáze. Toto jméno je přezdívka BDE nebo jméno komponenty databáze. Pro Paradox nebo dBASE, jméno může být také úplná specifikace souboru.
Např. následující příkaz používá implicitní sezení a pokusí se otevřít databázové připojení pro databázi popsanou přezdívkou BCDEMOS.
TDatabase *BCDemosDatabase = Session->OpenDatabase("BCDEMOS");
OpenDatabase dělá své vlastní sezení aktivním (pokud již není aktivní) a pak zjišťuje zda specifikované jméno databáze neodpovídá vlastnosti DatabaseName nějaké komponenty databáze pro sezení. Pokud jméno neodpovídá existující komponentě databáze, pak OpenDatabase vytváří dočasnou komponentu databáze používající specifikované jméno. Každé volání OpenDatabase inkrementuje čítač odkazů pro databázi o 1. Pokud tento čítač je větší než 0, pak databáze je otevřena. Konečně OpenDatabase volá metodu Open komponenty databáze pro připojení k serveru.
Uzavírání databázového připojení je popsáno v následujících bodech: Uzavírání jednoho databázového připojení
Konkrétní databázové připojení můžeme uzavřít metodou CloseDatabase nebo voláním metody Close uzavřít všechna připojení pro sezení najednou. Když voláme CloseDatabase, pak čítač odkazů je dekrementován o 1. Když čítač odkazů pro databázi je 0, pak databáze je uzavřena a uvolněna. CloseDatabase přebírá jeden parametr (uzavíranou databázi). Např. následující příkaz uzavírá databázové připojení otevřené příkazem uvedeným v předchozím bodu:
Session->CloseDatabase(BCDemosDatabase);
Pokud specifikované jméno databáze je přiřazeno k dočasné komponentě databáze a vlastnost KeepConnection sezení je false, pak dočasná komponenta databáze je uvolněna (uzavřeno připojení).
Poznámka: Pokud KeepConnection je false, pak dočasné komponenty databáze jsou uzavřeny a uvolněny automaticky když poslední datová množina přiřazená ke komponentě databáze je uzavřena. K uvolnění dočasné komponenty databáze, když KeepConnection je true, voláme metodu Close komponenty databáze a pak voláme metodu DropConnections sezení.
Pokud komponenta databáze je trvalá (aplikace komponentu deklaruje a instantizuje ji) a vlastnost KeepConnection sezení je false, pak CloseDatabase volá metodu Close komponenty databáze k uzavření připojení.
Poznámka: Voláním CloseDatabase pro trvalou komponentu databáze neuzavíráme připojení. K uzavření připojení voláme metodu Close komponenty databáze přímo.

Uzavírání všech databázových připojení
Všechna databázová připojení můžeme uzavřít dvěmi způsoby:

Když nastavíme Active na false, pak C++ Builder automaticky volá metodu Close. Close odpojuje od všech aktivních databází uvolněním dočasných komponent databází a volá metody Close pro každou trvalou komponentu databáze. Nakonec Close nastaví madlo sezení BDE na NULL.
Zrušení dočasných databázových připojení
Pokud vlastnost KeepConnection pro sezení je true (implicitně), pak databázová připojení pro dočasné komponenty databáze jsou udržovány i když všechny datové množiny používané komponentou jsou uzavřeny. Můžeme eliminovat tato připojení a uvolnit všechny neaktivní dočasné komponenty databáze pro sezení voláním metody DropConnections. Např. následující kód uvolňuje všechny neaktivní dočasné komponenty databáze pro implicitní sezení:
Session->DropConnections();
Dočasné komponenty databáze pro které jedna nebo více datových množin jsou aktivní, nejsou tímto voláním zrušeny a uvolněny. K uvolnění těchto komponent voláme Close.
Hledání databázového připojení
Metodu FindDatabase sezení používáme k určení zda specifikovaná komponenta databáze je skutečně přiřazena k sezení. FindDatabase přebírá jeden parametr (jméno hledané databáze). Toto jméno je přezdívka BDE nebo jméno komponenty databáze. Pro Paradox nebo dBASE jméno může být i úplná specifikace souboru.
Např. následující kód hledá v implicitním sezení komponentu databáze používající přezdívku BCDEMOS a pokud není nalezena, pak ji vytváří a otevírá:
TDatabase *DB = Session->FindDatabase("BCDEMOS");
if ( !DB )                               // Databáze v sezení neexistuje
  DB = Session->OpenDatabase("BCDEMOS"); // vytvoření a otevření databáze
if (DB && DB->Connected) {
  if (!DB->InTransaction) {
    DB->StartTransaction();
    ...
  }
}
FindDatabase vrací nalezenou komponentu databáze. Pokud není nalezena, pak vrací NULL.
Získávání informací o sezení
Informace o sezení a jeho databázových komponentách můžeme získávat pomocí informačních metod sezení. Např. jedna z metod získává jména všech přezdívek známých sezení a další metoda získává jména tabulek přiřazených ke specifické komponentě databáze použité sezením. Následující tabulka uvádí informační metody komponent sezení.
 
Metoda Význam
GetAliasDriverName Získává ovladač BDE pro specifikovanou přezdívku databáze.
GetAliasNames Získává seznam přezdívek BDE pro databáze.
GetAliasParams Získává seznam parametrů pro specifikovanou přezdívku BDE databáze.
GetConfigParams Získává specifikovanou konfigurační informaci z konfiguračního souboru BDE.
GetDatabaseNames Získává seznam přezdívek BDE a jmen všech současně používaných komponent databáze.
GetDriverNames Získává jména všech současně instalovaných ovladačů BDE.
GetDriverParams Získává seznam parametrů pro specifikovaný ovladač BDE.
GetStoredProcNames Získává jména všech uložených procedur pro specifikovanou databázi.
GetTableNames Získává jména všech tabulek vyhovujících zadanému vzoru pro specifikovanou databázi.

Mimo GetAliasDriverName, tyto metody vracejí množinu hodnot v seznamu řetězců deklarovaných a udržovaných naší aplikací. GetAliasDriverName vrací řetězec (jméno současného ovladače BDE pro jistou komponentu databáze použitou sezením).
Např. následující kód získává jména všech komponent databáze a přezdívek známých implicitnímu sezení:
TStringList *List = new TStringList();
try
{
  Session->GetDatabaseNames(List);
  ...
}
catch (...)
{
  delete List;
  throw;
}
delete List;

Práce s přezdívkami BDE
Protože sezení obvykle zaobaluje řadu databázových připojení, jedna vlastnost a mnoho metod komponenty sezení pracuje s přezdívkami BDE. Každá komponenta databáze přiřazená k sezení má přezdívku BDE (pro tabulky Paradoxu a dBASE to může být úplná specifikace souboru). Přezdívky BDE a přiřazené metody TSession mají tři hlavní použití: Následující body popisují tyto oblasti: Specifikování viditelnosti přezdívek
Vlastnost ConfigMode sezení určuje, které přezdívky BDE jsou sezením viditelné. ConfigMode je množina popisující, které typy přezdívek jsou viditelné. Implicitní nastavení je cmAll, které je přeloženo na množinu [cfmVirtual, cfmPersistent]. Pokud ConfigMode je cmAll, pak sezení může vidět všechny přezdívky vytvořené v sezení, všechny přezdívky v konfiguračním souboru BDE uživatelova systému a všechny přezdívky, které BDE udržuje v paměti.
Hlavním významem ConfigMode je umožnit specifikovat a omezit viditelnost přezdívek na úrovni sezení. Např. nastavením ConfigMode na cfmSession omezíme pohled sezení na přezdívky vytvořené sezením. Všechny ostatní přezdíky v konfiguračním souboru BDE a paměti nejsou viditelné.

Dělání přezdívek sezení viditelným ostatním sezením a aplikacím
Když přezdívka je vytvořena během sezení, pak BDE ukládá kopii přezdívky v paměti. Implicitně tato kopie je lokální pouze v sezení ve kterém je vytvořena. Ostatní sezení ve stejné aplikaci mohou vidět tyto přezdívky, pokud jejich vlastnost ConfigMode je cmAll nebo cfmPersistent.
K udělání přezdívek viditelných pro všechna sezení a ostatní aplikace použijeme metodu SaveConfigFile sezení. SaveConfigFile zapisuje přezdívky v paměti do konfiguračního souboru BDE kde mohou být čteny a používány ostatními aplikacemi používajícími BDE.

Určování známých přezdívek, ovladačů a parametrů
Pět metod komponenty sezení umožňuje aplikaci získávat informace o přezdívkách BDE včetně informací o ovladačích a parametrech. Jedná se o metody GetAliasNames, GetAliasParams, GetAliasDriverName, GetDriverNames a GetDriverParams (viz předchozí bod).

Vytváření, modifikace a rušení přezdívek
Sezení může vytvářet, modifikovat a rušit přezdívky během svého života. Metoda AddAlias vytváří novou přezdívku BDE pro databázový server SQL. AddStandardAlias vytváří novou přezdívku BDE pro tabulky Paradoxu, dBASE nebo ASCII.
AddAlias přebírá tři parametry: řetězec obsahující jméno pro přezdívku, řetězec specifikující používaný ovladač SQL a seznam řetězců zaplněný parametry pro přezdívku.
Např. následující příkaz přidává novou přezdívku pro zpřístupnění serveru InterBase k implicitnímu sezení:
TStringList *AliasParams = new TStringList();
try
{
  AliasParams->Add("OPEN MODE=READ");
  AliasParams->Add("USER NAME=TOMSTOPPARD");
  AliasParams->Add("SERVER NAME=ANIMALS:/CATS/PEDIGREE.GDB");
  Session->AddAlias("CATS", "INTRBASE", AliasParams);
  ...
}
catch (...)
{
  delete AliasParams;
  throw;
}
delete AliasParams;
AddStandardAlias přebírá tři řetězcové parametry: jméno pro přezdívku, úplná cesta k tabulce Paradoxu nebo dBASE a jméno implicitního ovladače použitého při pokusu o otevření tabulky bez přípony. Např. následující příkaz vytváří novou přezdívku pro zpřístupnění tabulky Paradoxu:
Session->AddStandardAlias("MYBCDEMOS", "C:\\TESTING\\DEMOS\\", "Paradox");
Poznámka: Když přidáme přezdívku k sezení, pak je dostupná pouze tímto sezením a všemi ostatními sezeními s cfmPersistent vloženými do množiny konfiguračních režimů vlastností ConfigMode.
Po vytvoření přezdívky můžeme změnit její parametry voláním ModifyAlias. ModifyAlias přebírá dva parametry: jméno modifikované přezdívky a seznam řetězců obsahujících měněné parametry a jejich hodnoty.
Např. následující příkazy mění parametr OPEN MODE pro přezdívku CATS v implicitním sezení na READ/WRITE:
TStringList *List = new TStringList();
List->Clear();
List->Add("OPEN MODE=READ/WRITE");
Session->ModifyAlias("CATS", List);
delete List;
K zrušení předem vytvořené přezdívky v sezení voláme metodu DeleteAlias. DeleteAlias přebírá jeden parametr (jméno rušené přezdívky). DeleteAlias udělá přezdívku nedostupnou v sezení.
Poznámka: DeleteAlias neodstraňuje přezdívku z konfiguračního souboru BDE, pokud přezdívka byla zapsána do souboru předchozím voláním SaveConfigFile. K odstranění přezdívky z konfiguračního souboru po volání DeleteAlias voláme znova SaveConfigFile.

Procházení komponentami databáze
Dvě vlastnosti komponenty sezení Databases a DatabaseCount umožňují procházet všemi komponentami databází přiřazených k sezení.
Databases je pole všech současně aktivních komponent databáze přiřazených k sezení. Společně s vlastností DatabaseCount můžeme Databases použít k procházení přes všechny aktivní komponenty databáze k provedení jisté akce.
DatabaseCount je celočíselná vlastnost, která indikuje počet právě aktivních komponent databáze přiřazených k sezení. Při otevírání nebo uzavírání připojení během sezení se tato hodnota mění. Např. jestliže vlastnost KeepConnection sezení je false a všechny komponenty databáze jsou vytvářeny podle potřeby za běhu aplikace, pak vždy při otevření unikátní databáze je DatabaseCount inkrementováno o 1 a vždy při uzavření je tato vlastnost dekrementována o 1. Pokud DatabaseCount je rovno 0, pak nejsou aktivní žádné komponenty databáze pro sezení.
Vlastnost DatabaseCount je obvykle používána s vlastností Databases k provedení akcí pro aktivní komponenty databáze.
Např. následující kód nastavuje vlastnost KeepConnection každé aktivní databáze v implicitním sezení na true:
if (Session->DatabaseCount > 0)
  for (int MaxDbCount = 0; MaxDbCount<Session->DatabaseCount; MaxDbCount++)
    Session->Databases[MaxDbCount]->KeepConnection = true;
Specifikace adresářů Paradoxu
Dvě vlastnosti komponenty sezení NetFileDir a PrivateDir jsou specifické pro aplikace, které pracují s tabulkami Paradoxu. NetFileDir specifikuje adresář, který obsahuje síťový řídící soubor Paradoxu PDOXUSRS.NET. Tento soubor ovládá sdílení tabulek Paradoxu na síti. Všechny aplikace, které potřebují sdílet tabulky Paradoxu musí specifikovat stejný adresář pro síťový řídící soubor (obvykle adresář na souborovém serveru).
PriveteDir specifikuje adresář pro uložení dočasných tabulek zpracovávaných souborů, jako jsou tabulky generované BDE k zpracování lokálních SQL příkazů.
V této části jsou uvedeny tyto body: Specifikace umístění řídícího souboru
C++ Builder odvozuje hodnotu NetFileDir od konfiguračního souboru BDE pro danou přezdívku databáze. Pokud nastavíme NetFileDir sami, pak námi zadaná hodnota přepíše nastavení konfigurace BDE. Při návrhu můžeme specifikovat hodnotu pro NetFileDir v Inspektoru objektů. Můžeme také nastavovat nebo měnit NetFileDir kódem za běhu. Následující kód nastavuje NetFileDir pro implicitní sezení na adresář ze kterého je naše aplikace spouštěna:
Session->NetFileDir = ExtractFilePath(ParamStr(0));
Poznámka: NetFileDir může být změněno pouze, když aplikace nemá otevřený žádný soubor Paradoxu. Pokud měníme NetFileDir za běhu, pak musíme zadat přípustný adresář, který je sdílen uživateli sítě.

Specifikace umístění dočasných souborů
Pokud pro vlastnost PrivateDir není specifikována žádná hodnota, pak BDE automaticky použije současný adresář. Pokud naše aplikace je spouštěna přímo ze síťového serveru, pak můžeme zvýšit výkonnost aplikace nastavením PrivateDir na lokální adresář před otevřením databáze.
Poznámka: Nenastavujeme PrivateDir při návrhu, pokud zamýšlíme otevřít databázi. Způsobí to generování chyby "Directory is busy".
Následující kód mění nastavení vlatnosti PrivateDir implicitního sezení na uživatelův adresář C:\TEMP:
Session->PrivateDir = "C:\\TEMP";
Pozor: PrivateDir nikdy nenastavujeme na kořenový adresář; vždy specifikujeme podadresář.

Práce s tabulkami Paradoxu chráněnými heslem
Komponenta sezení poskytuje čtyři metody a jednu událost, které slouží výhradně pro spravování přístupu k heslem chráněným tabulkám Paradoxu. Metody jsou AddPassword, GetPassword, RemoveAllPassword a RemovePassword. Událost je OnPassword. Funkce PasswordDialog je také dostupná pro přidávání a odstraňování jednoho nebo více hesel ze sezení.
Metoda TSession->AddPassword poskytuje volitelný způsob pro aplikace k poskytnutí hesla pro sezení před otevřením zakódované tabulky Paradoxu, která pro přístup vyžaduje heslo. AddPassword přebírá jeden parametr (řetězec použitého hesla). AddPassword můžeme volat několikrát (podle potřeby) k přidání hesel pro zpřístupnění souborů Paradoxu chráněných různými hesly.
Nemusíme volat AddPassword pro specifikaci hesel zpřístupňujících tabulky Paradoxu chráněné heslem. Pokud to neprovedeme, pak aplikace při pokusu o otevření takovýchto tabulek zobrazí dialogové okno, ve kterém uživatel musí zadat heslo.
TSession->RemovePassword ruší předem přidané heslo. RemovePassword přebírá jeden parametr a to řetězec obsahující rušené heslo. RemoveAllPassword ruší všechny předem přidaná hesla.
Session->RemovePassword("secret");
TSession->RemoveAllPassword ruší všechna dříve přidaná hesla z paměti.
Session->RemoveAllPasswords;
TSession->GetPassword spouští událost TSeesion->OnPassword pro sezení. Událost OnPassword je volána pouze když aplikace se pokusí otevřít poprvé tabulku Paradoxu a BDE zjistí nedostatečná přístupová práva. Kód události OnPassword můžeme použít k obsloužení a poskytnutí hesla BDE nebo můžeme zvolit použití implicitního zpracování hesla (zobrazení dialogového okna pro zadání hesla uživatelem).

Správa více sezení

Jestliže vytváříme jednu aplikaci, která používá více vláken provádějících databázové operace, pak musíme pro každé vlákno vytvořit jedno další sezení. Stránka Data Access Palety komponent obsahuje komponentu sezení, kterou můžeme umístit při návrhu do datového modulu nebo na formulář.
Pozor: Když umisťujeme komponentu sezení, pak musíme také nastavit její vlastnost SessionName na unikátní hodnotu tak, aby nevznikl konflikt s vlastností SessionName implicitního sezení.
Umístění komponenty sezení během návrhu umožňuje aby počet vláken (a tedy sezení) požadovaných aplikací za běhu byl statický. Nicméně aplikace také umožňuje vytvářet sezení dynamicky. K vytvoření dynamického sezení voláme za běhu globální funkci Sessions->OpenSession. Tato funkce vyžaduje jeden parametr, kterým je jméno pro sezení (musí být unikátní mezi jmény všech sezení pro aplikaci). Následující kód dynamicky vytváří a aktivuje nové sezení s unikátně generovaným jménem:
Sessions->OpenSession("RunTimeSession" + IntToStr(Sessions->Count + 1));
Tento příkaz generuje unikátní jméno pro sezení s využitím aktuálního počtu sezení. Pokud za běhu dynamicky vytváříme a rušíme sezení, pak tento kód nebude pracovat dobře. Tento kód pouze ukazuje jak používat vlastnosti a metody sezení pro správu více sezení.
Sessions je komponenta typu TSessionList, která je automaticky vytvářena pro databázové aplikace. Vlastnosti a metody Sessions můžeme používat k udržování více sezení ve více vláknové databázové aplikaci. Následující tabulka uvádí vlastnosti a metody komponenty TSessionList.
 
Vlastnost nebo metoda Funkce
Count Vrací počet sezení (aktivních i neaktivních) v seznamu sezení.
FindSession V seznamu sezení vyhledává sezení specifikovaného jména a vrací ukazatel na komponentu sezení nebo NULL, není-li sezení se specifikovaným jménem. Pokud předáme prázdné jméno sezení, pak FindSession vrací ukazatel na implicitní sezení Session.
GetSessionNames Zaplňuje seznam řetězců jmény současně instantizovaných komponent sezení. Tato metoda vždy přidává alespoň jeden řetězec a to "Default" pro implicitní sezení (jméno implicitního sezení je vždy prázdný řetězec).
List Vrací komponentu sezení pro specifikované jméno sezení. Pokud není sezení se specifikovaným jménem, pak je generována výjimka.
OpenSession Vytváří a aktivuje nové sezení nebo reaktivuje existující sezení pro specifikované jméno sezení.
Sessions Zpřístupňuje seznam sezení pomocí pořadové hodnoty. 

Jako příklad použití vlastností a metod Sessions ve více vláknové aplikaci uvažujeme co nastane když chceme otevřít databázové připojení. K určení zda připojení skutečně existuje, použijeme vlastnost Sessions k procházení jednotlivými sezeními v seznamu sezení, počínaje od implicitního sezení. Pro každou komponentu sezení testujeme její vlastnost Databases k zjištění zda databáze je skutečně otevřená. Pokud zjistíme, že jiné vlákno určenou databázi již skutečně používá, pak testujeme následující sezení v seznamu.
Jestliže existující proces databázi nepoužívá, pak ji můžeme otevřít pro připojení v tomto sezení. Na druhé straně jestliže všechna existující vlákna používají databázi, pak musíme otevřít nové sezení ve kterém otevřeme další databázové připojení.
Pokud replikujeme datový modul, který obsahuje sezení ve více vláknové aplikaci, kde každé vlákno obsahuje svou vlastní kopii datového modulu, pak můžeme použít vlastnost AutoSessionName k zajištění toho, že všechny datové množiny v datovém modulu použijí správné sezení. Nastavení AutoSessionName na true způsobuje generování dynamické generování vlastních unikátních jmen sezení při jejich vytváření za běhu. Pak přiřadíme toto jméno každé datové množině v datovém modulu, čímž přepíšeme všechny explicitně nastavená jména sezení. To zajistí, že každé vlákno má své vlastní sezení a všechny datové množiny používají sezení ve svém vlastním datovém modulu.

Používání komponent sezení v datových modulech

Komponenty sezení můžeme bezpečně umisťovat do datových modulů. Pokud vložíme datový modul, který obsahuje jednu nebo více komponent sezení do Zásobníku objektů, pak musí být nastavena vlastnost AutoSessionName na true k zabránění konfliktům ve jmenných prostorech při dědění modulu.

  1. Vytvořte aplikaci, která vypíše seznam dostupných přezdívek BDE (např. v kombinovaném ovladači) a umožní z nich volit. Pro vybranou přezdívku zobrazte různé dostupné informace.
11. Správa databázového sezení