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φ