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φ
|