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í:
-
Modifikovat vlastnosti sezení, jako je specifikace databázových
připojení pro automaticky generované databázové komponenty.
-
Reagování na události sezení, jako je pokus aplikace o přístup
k souborům Paradoxu chráněným heslem.
-
Provádění metod sezení, jako je otevírání nebo uzavírání
databáze v reakci na akce uživatele.
-
Nastavovat vlastnost NetFileDir pro přístup k tabulkám
Paradoxu na síti a nastavovat vlastnost PrivateDir na lokálním disku
pro zvýšení výkonu.
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:
-
Vytváří pro ní za běhu komponentu databáze.
-
Přiřazuje komponentu databáze k implicitnímu sezení.
-
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:
-
Deklarujeme ukazatel na proměnnou TSession.
-
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.
-
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í.
-
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:
-
Nastavíme vlastnost Active pro sezení na false.
-
Voláme metodu Close pro sezení.
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í:
-
Určují viditelnost
-
Získávají informace o přezdívce a ovladači
-
Vytváření, modifikování a rušení přezdívek
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.
-
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í
|