Kdy╛ aplikace C++ Builderu pou╛φvajφcφ DBE se p°ipojuje
k databßzi, pak p°ipojenφ je zaobaleno komponentou TDatabase. Komponenta
databßze zaobaluje p°ipojenφ k jednΘ databßzi v kontextu sezenφ BDE v aplikaci.
Nßsledujφcφ body popisujφ komponentu databßze a jak manipulovat s databßzov²m
p°ipojenφm.
Komponenta databßze je takΘ pou╛φvßna ke
sprßv∞ transakcφ v aplikacφch zalo╛en²ch na BDE. JinΘ pou╛itφ komponenty
databßze je aplikovßnφ odlo╛en²ch aktualizacφ na p°ipojenΘ tabulky. Tφm
se ale zatφm zab²vat nebudeme.
Seznßmenφ s
trval²mi a doΦasn²mi komponentami databßze
Ka╛dΘ databßzovΘ p°ipojenφ v aplikaci je zaobaleno komponentou
databßze a to bez ohledu na to, zda explicitn∞ poskytneme komponentu
databßze p°i nßvrhu nebo ji vytvo°φme dynamicky za b∞hu. Kdy╛ se aplikace
pokusφ p°ipojit k databßzi, pak je pou╛ita ji╛ vytvo°enß trvalß komponenta
databßze nebo je generovßna doΦasnß komponenta databßze, kterß existuje
pouze po dobu trvßnφ p°ipojenφ.
DoΦasnΘ komponenty databßze jsou vytvß°eny podle pot°eby
pro v╣echny datovΘ mno╛iny v datovΘm modulu nebo na formulß°i, kdy╛ je
nevytvo°φme sami. DoΦasnΘ komponenty databßze poskytujφ dostateΦnou podporu
pro v∞t╣inu typick²ch databßzov²ch aplikacφ, kterΘ nevy╛adujφ zpracovßnφ
detail∙ databßzovΘho p°ipojenφ. Pro v∞t╣inu aplikacφ klient/server m∙╛eme
vytvo°it svou vlastnφ komponentu databßze namφsto pou╛itφ doΦasnΘ. Zφskßme
tφm v∞t╣φ mo╛nosti °φzenφ databßze vΦetn∞:
-
Vytvß°enφ trval²ch databßzov²ch p°ipojenφ.
-
P°izp∙sobenφ p°ihla╣ovßnφ k databßzovΘmu serveru.
-
╪φzenφ transakcφ a specifikace ·rovn∞ izolace transakcφ.
-
Vytvß°enφ lokßlnφch p°ezdφvek BDE pro na╣i aplikaci.
Budeme se zde zab²vat je╣t∞ t∞mito body:
Pou╛itφ doΦasnΘ komponenty
databßze
DoΦasnΘ komponenty databßze jsou automaticky generovßny podle
pot°eby. Nap°. pokud umφstφme komponentu TTable na formulß°, nastavφme
jejφ vlastnosti a otev°eme tabulku bez pou╛itφ a nastavenφ komponenty TDatabase
a p°i°azenφ komponenty tabulky k nφ, pak C++ Builder vytvß°φ pro tabulku
doΦasnou komponentu databßze.
N∞kterΘ klφΦovΘ vlastnosti doΦasnΘ komponenty databßze
jsou urΦeny sezenφm ve kterΘm jsme. Nap°. °φzenφm vlastnosti KeepConnections
sezenφ urΦujeme, zda databßzovΘ p°ipojenφ je udr╛ovßno i kdy╛ jeho datovΘ
mno╛iny jsou uzav°eny (implicitn∞) nebo zda p°ipojenφ je zru╣eno, kdy╛
v╣echny jeho datovΘ mno╛iny jsou uzav°eny. Podobn∞, implicitnφ udßlost
OnPassword
pro sezenφ zaji╣╗uje, ╛e kdy╛ aplikace se pokusφ o p°ipojenφ k databßzi
na serveru, kterß vy╛aduje heslo, pak je zobrazeno standardnφ dialogovΘ
okno pro zadßvßnφ hesla. Ostatnφ vlastnosti doΦasnΘ komponenty databßze
poskytujφ standardnφ p°ihlß╣enφ a zpracovßnφ transakcφ.
Implicitnφ vlastnosti vytvo°enΘ pro doΦasnou komponentu
databßze poskytujφ vhodnΘ chovßnφ pro ╣irokou °adu situacφ. NicmΘn∞ v n∞kter²ch
aplikacφch typu klient/server s mnoha u╛ivateli a r∙zn²mi po╛adavky na
databßzovΘ p°ipojenφ, musφme vytvo°it svou vlastnφ komponentu databßze.
Vytvß°enφ komponent
databßze p°i nßvrhu
Strßnka Data Access Palety komponent obsahuje komponentu
databßze, kterou m∙╛eme umφstit do datovΘho modulu nebo na formulß°. Hlavnφ
v²hodou vytvß°enφ komponenty databßze p°i nßvrhu je to, ╛e m∙╛eme nastavit
poΦßteΦnφ hodnoty vlastnostφ a zapsat pro nφ obsluhu udßlosti OnLogin.
OnLogin
nabφzφ mo╛nost p°izp∙sobenφ zpracovßnφ bezpeΦnosti na databßzovΘm serveru,
kdy╛ se komponenta databßze poprvΘ p°ipojuje k serveru.
Vytvß°enφ komponent
databßze za b∞hu aplikace
Komponenty databßze m∙╛eme takΘ vytvß°et dynamicky za b∞hu
aplikace. Kdy╛ takto vytvß°φme databßzovΘ komponenty, pak jim musφme dßt
unikßtnφ jmΘno a p°i°adit je k sezenφ.
Komponentu vytvß°φme pomocφ operßtoru new. Nßsledujφcφ
funkce p°ebφrß jmΘno databßze a jmΘno sezenφ a vytvß°φ komponentu databßze
za b∞hu, p°i°azuje ji ke specifikovanΘmu sezenφ (v p°φpad∞ pot°eby vytvß°φ
novΘ sezenφ) a nastavuje n∞kolik klφΦov²ch vlastnostφ komponenty databßze:
TDatabase* __fastcall TForm1::RunTimeDbCreate(const
AnsiString DatabaseName,
const AnsiString SessionName)
{
// Pokud sezenφ existuje, pak je ud∞lßme
aktivnφm, neexistuje-li,
// pak vytvo°φme novΘ sezenφ
Sessions->OpenSession(SessionName);
TSession *pSession = Sessions->FindSession(SessionName);
TDatabase *TempDatabase = pSession->FindDatabase(DatabaseName);
// pokud databßze ji╛ existuje, pak
nßvrat
if (TempDatabase)
return TempDatabase;
// Vytvo°enφ novΘ komponenty databßze
TempDatabase = new TDatabase(this);
try {
TempDatabase->DatabaseName
= DatabaseName;
TempDatabase->SessionName
= SessionName;
TempDatabase->KeepConnection
= true;
return pSession->OpenDatabase(DatabaseName);
}
catch (...) {
delete TempDatabase;
throw;
}
}
Nßsledujφcφ Φßst k≤du ukazuje jak m∙╛eme volat tuto funkci
k vytvo°enφ komponenty databßze pro implicitnφ sezenφ:
TDatabase *MyDatabase[10];
// pole ukazatel∙ na databßze
int MyDBCount = 0;
// d°φv∞j╣φ inicializace MyDBCount
...
// pozd∞ji, vytvo°enφ komponenty databßze
MyDatabase[MyDBCount] = RunTimeDbCreate(AnsiString("MyDb")
+
IntToStr(MyDBCount++), "");
...
╪φzenφ p°ipojenφ
Kdy╛ vytvo°φme komponentu databßze p°i nßvrhu nebo za b∞hu
aplikace, pak m∙╛eme pou╛φt vlastnosti, udßlosti a metody TDatabase
k °φzenφ a zm∞n∞ jejφho chovßnφ v na╣φ aplikaci. V nßsledujφcφch bodech
je popsßno jak manipulovat s komponentami databßze:
P°i°azovßnφ komponenty
databßze k sezenφ
V╣echny komponenty databßze musφ b²t p°i°azeny k BDE sezenφ.
Dv∞ vlastnosti komponenty databßze Session a SessionName
z°izujφ toto p°i°azenφ.
SessionName identifikuje p°ezdφvku sezenφ, ke
kterΘ je p°i°azena komponenta databßze. Kdy╛ poprvΘ vytvo°φme komponentu
databßze p°i nßvrhu, pak SessionName je nastaveno na "Default".
VφcevlßknovΘ nebo reentrantnφ BDE aplikace mohou mφt vφce ne╛ jedno sezenφ.
B∞hem nßvrhu m∙╛eme zφskat p°φpustnΘ SessionName z rozbalovacφho
seznamu v Inspektoru objekt∙. JmΘna sezenφ v tomto seznamu jsou zφskßna
z vlastnostφ SessionName v╣ech komponent sezenφ v aplikaci.
Vlastnost Session je urΦenß pouze pro Φtenφ a
dostupnß pouze za b∞hu aplikace a odkazuje se na komponentu sezenφ specifikovanou
vlastnostφ
SessoinName. Nap°. pokud SessionName je prßzdnß
nebo "Default", pak vlastnost Session ukazuje na stejnou instanci
TSessoinjako
ukazuje globßlnφ prom∞nnß Session. Session umo╛≥uje aplikaci
p°istupovat k vlastnostem, metodßm a udßlostem v nad°φzenΘ komponent∞ sezenφ
komponenty databßze bez nutnosti znßt aktußlnφ jmΘno sezenφ. To je u╛iteΦnΘ,
kdy╛ komponenta databßze je p°i°azovßna za b∞hu k r∙zn²m sezenφm.
Specifikovßnφ p°ezdφvek BDE
AliasName a DriverName jsou vzßjemn∞ vyluΦujφcφ
se vlastnosti.
AliasName specifikuje jmΘno existujφcφ p°ezdφvky
BDE k pou╛itφ pro komponentu databßze. P°ezdφvky jsou zobrazeny v rozbaliteln²ch
seznamech pro komponenty datov²ch mno╛in a tak se m∙╛eme spojit s konkrΘtnφ
komponentou databßze. Pokud specifikujeme
AliasName pro komponentu
databßze, pak v╣echny hodnoty p°i°azenΘ k DriverName jsou vyprßzdn∞ny,
proto╛e jmΘno ovladaΦe je v╛dy Φßstφ p°ezdφvky BDE.
Poznßmka: P°ezdφvky BDE vytvo°φme a editujeme
pomocφ Pr∙zkumnφka databßze nebo Administrßtora BDE. S t∞mito Φinnostmi
jsme se ji╛ seznßmili v p°edchozφch kapitolßch.
DatabaseName umo╛≥uje poskytnutφ aplikaΦnφho jmΘna
pro komponentu databßze. Toto jmΘno pou╛φvßme spoleΦn∞ s AliasName
nebo DriverName a je lokßlnφ v na╣i aplikaci. DatabaseName
m∙╛e b²t p°ezdφvka BDE nebo pro soubory Paradoxu a dBASE ·plnß specifikace
souboru. Podobn∞ jako
AliasName i DatabaseName se zobrazuje
v rozbaliteln²ch seznamech v komponentßch datov²ch mno╛in.
DriverName je jmΘno ovladaΦe BDE. JmΘno ovladaΦe
je jednφm parametrem v p°ezdφvce BDE, ale m∙╛eme specifikovat jmΘno ovladaΦe
mφsto p°ezdφvky, kdy╛ vytvß°φme lokßlnφ p°ezdφvku BDE pro komponentu databßze
pomocφ vlastnosti
DatabaseName. Pokud specifikujeme DriverName,
pak v╣echny hodnoty ji╛ p°i°azenΘ k AliasName jsou vyprßzdn∞ny (k
zabrßn∞nφ mo╛n²m konflikt∙m mezi jmΘnem specifikovanΘho ovladaΦe a jmΘnem
ovladaΦe, kter² je Φßstφ p°ezdφvky BDE identifikovanΘ v AliasName).
Ke specifikaci p°ezdφvky BDE p°i nßvrhu, p°i°adφme ovladaΦ
BDE nebo vytvo°φme lokßlnφ p°ezdφvku BDE dvojit²m kliknutφm na komponent∞
databßze k vyvolßnφ Editoru vlastnostφ databßze. V tomto editoru m∙╛eme
zadat DatabaseName v Φßsti Name, existujφcφ p°ezdφvku BDE
v kombinovanΘm ovladaΦi Alias Name nebo m∙╛eme volit z existujφcφ
p°ezdφvky v rozbalovacφm seznamu. Kombinovan² ovladaΦ Driver Name
umo╛≥uje zadßvat jmΘno existujφcφho ovladaΦe BDE pro vlastnost DriverName
nebo m∙╛eme volit z existujφcφch jmen ovladaΦ∙ v rozbalovacφm seznamu.
Poznßmka: Editor takΘ umo╛≥uje zobrazit a nastavit
p°ipojovacφ parametry BDE a nastavit stav vlastnostφ LoginPrompt
a KeepConnection.
K nastavenφ DatabaseName, AliasName nebo
DriverName
za b∞hu aplikace, vlo╛φme p°φslu╣n² p°i°azovacφ p°φkaz do na╣eho k≤du.
Nap°. nßsledujφcφ k≤d pou╛ije text z editaΦnφho ovladaΦe k urΦenφ p°ezdφvky
pro komponentu databßze Database1:
Database1->DatabaseName = Edit1->Text;
Nastavovßnφ parametr∙
p°ezdφvek BDE
B∞hem nßvrhu m∙╛eme vytvß°et nebo editovat p°ipojovacφ parametry
t°emi zp∙soby:
-
Pomocφ Pr∙zkumnφka databßze nebo Administrßtora BDE vytvo°φme
nebo modifikujeme p°ezdφvky BDE vΦetn∞ parametr∙.
-
Dvojit²m kliknutφm na vlastnosti Params v Inspektoru
objekt∙ vyvolßme Editor seznamu °et∞zc∙.
-
Dvojit²m kliknutφm na komponent∞ databßze v datovΘm modulu
nebo na formulß°i vyvolßme Editor vlastnostφ databßze.
V╣echny tyto metody editujφ vlastnost Params komponenty
databßze.
Params je seznam °et∞zc∙ obsahujφcφ p°ipojovacφ parametry
databßze pro p°ezdφvku BDE p°i°azenou ke komponent∞ databßze. TypickΘ p°ipojovacφ
parametry zahrnujφ jmΘno serveru, velikost pam∞ti cache, jazykov² ovladaΦ
a dotazov² re╛im SQL.
Kdy╛ poprvΘ vyvolßme Editor vlastnostφ databßze, pak
parametry pro p°ezdφvku BDE nejsou viditelnΘ. K zobrazenφ souΦasnΘho nastavenφ
stiskneme
Defaults. SouΦasnΘ parametry jsou zobrazeny v Φßsti Parameter
overrides. Existujφcφ polo╛ky m∙╛eme editovat nebo p°idßvat novΘ. Pro
smazßnφ existujφcφch parametr∙ stiskneme Clear. Zm∞ny se projevφ
a╛ po stisku
OK.
Za b∞hu aplikace m∙╛e nastavovat parametry p°ezdφvky
pouze p°φmou editacφ vlastnosti Params.
╪φzenφ p°ihla╣ovßnφ
ke vzdßlenΘmu serveru
V∞t╣ina vzdßlen²ch databßzov²ch server∙ obsahuje bezpeΦnostnφ
slu╛by k zamezenφ neautorizovanΘho p°φstupu. Obecn∞ server vy╛aduje jmΘno
u╛ivatele a heslo p°ed umo╛n∞nφm p°φstupu k databßzi. Jestli╛e se pot°ebujeme
p°ihlßsit k serveru b∞hem nßvrhu, pak je zobrazeno standardnφ okno p°ihla╣ovßnφ
pro zadßnφ jmΘna a hesla u╛ivatele.
Jsou t°i zp∙soby jak provΘst p°ihlß╣enφ za b∞hu aplikace:
-
Nastavφme vlastnost LoginPrompt komponenty databßze
na true (implicitn∞). Aplikace bude zobrazovat standardnφ dialogovΘ
okno p°ihla╣ovßnφ pro zadßnφ jmΘna a hesla u╛ivatele.
-
Nastavφme LoginPrompt na false a vlo╛φme parametry
USER NAME a PASSWORD do vlastnosti Params pro komponentu databßze.
Nap°.
USER NAME=SYSDBA
PASSWORD=masterkey
Upozorn∞nφ: Jeliko╛ vlastnost Params
je snadno zobrazitelnß, nenφ tato metoda doporuΦovßna.
-
Zapφ╣eme obsluhu udßlosti OnLogin pro komponentu databßze
a pou╛ijeme ji pro nastavenφ p°ihla╣ovacφch parametr∙ za b∞hu. OnLogin
zφskß kopii vlastnosti Params komponenty databßze, kterou m∙╛eme
modifikovat. JmΘno tΘto kopie v OnLogin je LoginParams. Vlastnost
Values
pou╛ijeme k nastavenφ nebo zm∞n∞ p°ihla╣ovacφch parametr∙ takto:
LoginParams->Values["USER NAME"] = UserName;
LoginParams->Values["PASSWORD"] = PasswordSearch(UserName);
P°i ukonΦenφ OnLogin jsou LoginParams p°edßny
zp∞t do
Params a jsou pou╛ity k navßzßnφ p°ipojenφ.
P°ipojenφ k databßzovΘmu
serveru
Jsou dva zp∙soby p°ipojenφ k databßzovΘmu serveru pomocφ
komponenty databßze:
-
Volßnφ metody Open.
-
Nastavenφm vlastnosti Connected na true.
Nastavenφm Connected na true vyvolßme metodu
Open.
Open
ov∞°uje zda databßze specifikovanß vlastnostmi
DatabaseName nebo
Directory
existuje a pokud existuje obsluha udßlosti OnLogin pro komponentu
databßze, pak je provedena. Jinak je zobrazeno standardnφ dialogovΘ okno
p°ihla╣ovßnφ.
Poznßmka: Kdy╛ komponenta databßze nenφ p°ipojena
k serveru a aplikace se pokusφ otev°φt datovou mno╛inu p°i°azenou ke komponent∞
databßze, pak nejprve je volßna metoda Open komponenty databßze
k z°φzenφ p°ipojenφ. Pokud datovß mno╛ina nenφ p°i°azena k existujφcφ komponent∞
databßze, pak je vytvo°ena doΦasnß komponenta databßze a je pou╛ita pro
z°φzenφ p°ipojenφ.
Po z°φzenφ databßzovΘho p°ipojenφ je toto p°ipojenφ dßle
udr╛ovßno pokud je aktivnφ alespo≥ jedna datovß mno╛ina. Kdy╛ ji╛ nenφ
aktivnφ ╛ßdnß datovß mno╛ina, pak osud p°ipojenφ je urΦen vlastnostφ KeepConnection
komponenty databßze.
Specißlnφ ·vahy
p°i p°ipojovßnφ ke vzdßlenΘmu serveru
Kdy╛ se p°ipojφme ke vzdßlenΘmu databßzovΘmu serveru z aplikace,
pak aplikace pou╛ije BDE nebo ovladaΦ SQL Links ke z°φzenφ p°ipojenφ.
BDE m∙╛e komunikovat s podporovan²mi ovladaΦi ODBC. OvladaΦe SQL Links
a ODBC musφ b²t p°ed z°φzenφm p°ipojenφ sprßvn∞ nakonfigurovßny. KonfiguraΦnφ
parametry jsou ulo╛eny ve vlastnosti Params komponenty databßze.
Jako Φßst konfigurace m∙╛e b²t nutno specifikovat sφ╗ov²
protokol pou╛φvan² serverem, jako je SPX/IPX nebo TCP/IP a jeho parametry.
V mnoha p°φpadech, konfigurace sφ╗ovΘho protokolu je obslou╛ena nastavovacφm
softwarem klienta. Pro ODBC m∙╛e b²t takΘ nutnΘ provΘst nastavenφ ovladaΦe
pomocφ Sprßvce ovladaΦ∙ ODBC.
Z°φzenφ a inicializace p°ipojenφ mezi klientem a serverem
m∙╛e b²t problematickΘ. Nßsledujφcφ seznam nßm m∙╛e pomoci p°i odstra≥ovßnφ
problΘm∙:
-
Je na╣e klientskß strana p°ipojenφ sprßvn∞ konfigurovßna?
-
Pokud pou╛φvßme TCP/IP:
-
Je nß╣ komunikaΦnφ software TCP/IP instalovßn. Je sprßvn∞
instalovßn WINSOCK.DLL?
-
Je IP adresa serveru registrovßna v souboru HOSTS klienta?
-
Je DNS sprßvn∞ konfigurovßno?
-
M∙╛eme pou╛φt p°φkaz ping na server?
-
Jsou DLL pro na╣e p°ipojenφ a ovladaΦe databßze ve vyhledßvacφch
cestßch?
Aplikace m∙╛e pou╛φvat datovΘ zdroje ODBC (nap°. Sybase).
Konfigurace ovladaΦe ODBC vy╛aduje:
-
V²robcem podporovan² ODBC ovladaΦ.
-
Sprßvce ovladaΦ∙ ODBC.
-
Administrßtor ODBC.
K nastavenφ p°ezdφvky ODBC pro p°ipojenφ ovladaΦem ODBC pou╛ijeme
Administrßtor BDE.
Odpojenφ od databßzovΘho
serveru
Jsou dva zp∙soby odpojenφ komponenty databßze od serveru:
-
Nastavφme vlastnost Connected na false.
-
Volßme metodu Close.
Nastavenφ Connected na false volß Close.
Close
uzavφrß v╣echny otev°enΘ datovΘ mno╛iny a odpojuje je od serveru. Nap°.
nßsledujφcφ k≤d uzavφrß v╣echny aktivnφ datovΘ mno╛iny komponenty databßze
a ukonΦuje jejφ p°ipojenφ:
Database1->Connected = false;
Uzavφrßnφ datov²ch
mno╛in bez odpojovßnφ od serveru
Jsou situace, kdy chceme uzav°φt v╣echny datovΘ mno╛iny,
bez odpojenφ od databßzovΘho serveru. K uzav°enφ v╣ech otev°en²ch datov²ch
mno╛in bez odpojenφ od serveru provedeme tyto kroky:
-
Nastavφme vlastnost KeepConnection komponenty databßze
na true.
-
Volßme metodu CloseDataSets komponenty databßze.
Prochßzenφ
datov²mi mno╛inami komponenty databßze
Komponenta databßze poskytuje dv∞ vlastnosti, kterΘ umo╛≥ujφ
aplikaci prochßzet v╣emi datov²mi mno╛inami p°i°azen²mi ke komponent∞:
DataSets
a DataSetCount.
DataSets je indexovanΘ pole v╣ech aktivnφch datov²ch
mno╛in (TTable, TQuery a TStoredProc) pro komponentu
databßze. Aktivnφ datovΘ mno╛iny jsou ty kterΘ jsou otev°eny. DataSetCount
je celoΦφselnß hodnota urΦenß pouze pro Φtenφ, specifikujφcφ poΦet souΦasn∞
aktivnφch datov²ch mno╛in.
DataSets s DataSetCount m∙╛eme pou╛φt k
prochßzenφ v╣emi aktivnφmi datov²mi mno╛inami v k≤du. Nap°. nßsledujφcφ
k≤d prochßzφ v╣emi aktivnφmi datov²mi mno╛inami a nastavuje vlastnost CachedUpdates
pro v╣echny datovΘ mno╛iny typu TTable na true:
for (int i = 0; i < pDatabase->DataSetCount;
i++)
if (pDatabase->DataSets[i]->ClassNameIs("TTable"))
pDatabase->DataSets[i]->CachedUpdates
= true;
Zpracovßnφ transakcφ
Kdy╛ vytvo°φme databßzovou aplikaci, pak C++ Builder poskytuje
°φzenφ transakcφ pro v╣echen databßzov² p°φstup. Transakce je skupina akcφ,
kterΘ musφ b²t ·sp∞╣n∞ provedeny v jednΘ nebo vφce tabulkßch databßze d°φve
ne╛ jsou zapsßny (stanou se trval²mi). Pokud n∞kterß z t∞chto akcφ je ne·sp∞╣nß,
pak v╣echny akce transakce jsou zru╣eny. Transakce zaji╣╗ujφ konzistentnost
databßze i p°i vzniku hardwarov²ch chyb. TakΘ udr╛ujφ integritu dat p°i
soub∞╛nΘm vφceu╛ivatelskΘm p°φstupu.
Nap°. v bankovnφ aplikaci, p°evßd∞jφcφ Φßstku z jednoho
·Φtu na jin² ·Φet je operace, kterou je vhodnΘ chrßnit transakcφ. Pokud
po odeΦtenφ Φßstky z jednoho ·Φtu nastane chyba kterß zabßnφ v p°iΦtenφ
Φßstky na druh² ·Φet, pak je vhodnΘ zru╣it celou transakci, nebo╗ neprob∞hla
celß.
Normßln∞ C++ Builder poskytuje pro na╣i aplikaci implicitnφ
°φzenφ transakcφ pomocφ BDE. Kdy╛ aplikace je pod implicitnφm °φzenφm transakcφ,
pak C++ Builder pou╛φvß odd∞lenΘ transakce pro ka╛d² zßznam v datovΘ mno╛in∞,
kter² je zapsßn do p°ipojenΘ databßze. Implicitnφ °φzenφ transakcφ minimalizuje
konflikty aktualizacφ a udr╛uje konzistentnost databßze. Na druhΘ stran∞,
proto╛e ka╛d² °ßdek zapisovan² do databßze tvo°φ vlastnφ transakci, implicitnφ
°φzenφ transakcφ zvy╣uje provoz v sφti a zpomaluje aplikaci.
Pokud transakce °φdφme explicitn∞, m∙╛eme volit vhodn∞j╣φ
doby ke spu╣t∞nφ, dokonΦenφ a zru╣enφ na╣ich transakcφ. Kdy╛ vyvφjφme klientskou
aplikaci ve vφceu╛ivatelskΘm prost°edφ, obzvlß╣t∞ kdy╛ aplikace pracuje
se vzdßlen²m SQL serverem (jako je Sybase, Oracle, Microsoft SQL nebo InterBase)
nebo vzdßlenou ODBC databßzφ, pak musφme transakce °φdit explicitn∞.
Poznßmka: Pokud pou╛φvßme odlo╛enΘ aktualizace,
pak m∙╛eme minimalizovat poΦet transakcφ nutn²ch pro pou╛itφ v na╣i aplikaci.
Pou╛φvßnφ explicitnφch transakcφ
Jsou dva zßsadn∞ odli╣nΘ zp∙soby explicitnφho °φzenφ transakcφ
v databßzov²ch aplikacφch:
-
Pou╛ijeme metody a vlastnosti komponenty databßze, jako je
StartTransaction,
Commit,
Rollback,
InTransaction
a TransIsolation.
-
V komponent∞ TQuery pou╛ijeme pr∙chozφ SQL. Pr∙chozφ
SQL je pou╛iteln² pouze ve verzi Client/Server, kde pou╛φvßme SQL Links
k p°edßvßnφ p°φkaz∙ SQL p°φmo na vzdßlen² SQL nebo ODBC server.
Hlavnφ v²hodou pou╛itφ metod a vlastnostφ komponenty databßze
k °φzenφ transakcφ je to, ╛e poskytuje ΦistΘ, p°enositelnΘ aplikace, kterΘ
nejsou zßvislΘ na konkrΘtnφ databßzi nebo serveru. Hlavnφ v²hodou pou╛itφ
pr∙chozφho SQL je to, ╛e m∙╛eme pou╛φvat roz╣φ°enΘ mo╛nosti sprßvy transakcφ
konkrΘtnφho databßzovΘho serveru (je zapot°ebφ se seznßmit s tφmto modelem
v dokumentaci databßzovΘho serveru).
JednovrstvovΘ aplikace nemohou pou╛φvat pr∙chozφ SQL.
M∙╛eme pou╛φt komponentu databßze k vytvo°enφ explicitnφch transakcφ pro
lokßlnφ databßze. Jsme ale omezeni na lokßlnφ transakce.
Pou╛φvßni komponenty databßze pro transakce
Kdy╛ spustφme transakci, pak v╣echny nßsledujφcφ p°φkazy,
kterΘ Φtou z a zapisujφ do databßze pat°φ do tΘto transakce. Ka╛d² p°φkaz
je nedφlnou souΦßstφ skupiny. Zm∞ny musφ b²t ·sp∞╣n∞ zapsßny do databßze
nebo v╣echny zm∞ny provedenΘ ve skupin∞ musφ b²t zru╣eny.
Polo╛me si je╣t∞ otßzku, jak dlouho mß trvat transakce?
V ideßlnφm p°φpad∞ pouze tak dlouho, jak je nezbytnΘ. ╚φm dΘle je transakce
aktivnφ, tφm vφce u╛ivatel∙, kte°φ souΦasn∞ p°istupujφ k databßzi a vφce
soub∞╛n²ch transakcφ je zahßjeno a ukonΦeno b∞hem ╛ivota na╣φ transakce,
Φφm╛ se zvy╣ujφ konflikty mezi transakcemi, kdy╛ p°istoupφme k zßpisu na╣ich
zm∞n.
Kdy╛ pou╛ijeme komponentu databßze, pak k≤d jednΘ transakce
je tento:
-
Spustφme transakci volßnφm metody StartTransaction
databßze.
-
Kdy╛ transakce je spu╣t∞na, pak v╣echny nßsledujφcφ databßzovΘ
akce pat°φ do transakce dokud transakce nenφ explicitn∞ ukonΦena. Testovßnφm
vlastnosti InTransaction komponenty databßze m∙╛eme zjistit zda
transakce probφhß. V pr∙b∞hu transakce, data kterß vidφme v databßzov²ch
tabulkßch, je urΦeno ·rovnφ izolacφ transakcφ.
-
Kdy╛ v╣echny akce tvo°φcφ transakci prob∞hnou ·sp∞╣n∞, pak
v╣echny provedenΘ zm∞ny ud∞lßme trval²mi volßnφm metody Commit komponenty
databßze. Commit obvykle umis╗ujeme do p°φkazu try...catch.
Pokud transakce nem∙╛e b²t ·sp∞╣n∞ dokonΦena, pak se m∙╛eme pokusit o zpracovßnφ
chyby a p°φpadn∞ operaci zopakovat nebo transakci zru╣it.
-
Pokud v pr∙b∞hu transakce se vyskytne chyba, pak m∙╛eme chtφt
zru╣it v╣echny zm∞ny provedenΘ transakci. K zru╣enφ t∞chto zm∞n pou╛ijeme
metodu Rollback komponenty databßze.
Rollback obvykle pou╛φvßme v:
-
V k≤du zpracovßnφ v²jimky, kdy╛ se nem∙╛eme zotavit z databßzovΘ
chyby.
-
V obsluze udßlosti pro stisknutφ tlaΦφtka Cancel nebo
podobnΘ volb∞ v nabφdce.
TransIsolation specifikuje ·rove≥ izolacφ transakcφ
pro transakce komponenty databßze. ┌rove≥ izolacφ transakcφ urΦuje jak
transakce jsou ovlivn∞ny jin²mi soub∞╛n²mi transakcemi, kterΘ pracujφ se
stejn²mi tabulkami. UrΦuje jak transakce "vidφ" zm∞ny ostatnφch transakcφ
v tabulce. Implicitnφ nastavenφ pro TransIsolation je tiReadCommitted.
Nßsledujφcφ tabulka uvßdφ p°ehled mo╛n²ch hodnot TransIsolation
a popisuje jejich v²znam:
┌rove≥ izolace |
V²znam |
tiDirtyRead |
Povoluje Φtenφ neukonΦen²ch zm∞n vytvo°en²ch ostatnφmi
soub∞╛n²mi transakcemi databßze. NeukonΦenΘ zm∞ny nejsou trvalΘ a mohou
b²t kdykoliv zru╣eny. Tato ·rove≥ nejmΘn∞ izoluje od zm∞n provßd∞n²ch jin²mi
transakcemi. |
tiReadCommitted |
Povoluje Φtenφ pouze dokonΦen²ch (trval²ch) zm∞n proveden²ch
v databßzi ostatnφmi soub∞╛n²mi transakcemi. Je to implicitnφ ·rove≥ izolace. |
tiRepeatableRead |
Povoluje jedno jednorßzovΘ Φtenφ databßze. Na╣e transakce
nevidφ zm∞ny na datech proveden²ch ostatnφmi transakcemi. Tato ·rove≥ izolace
zaji╣╗uje to, ╛e kdy╛ na╣e transakce opakovan∞ Φte zßznam, pak zφskßme
nezm∞n∞n² zßznam. Tato ·rove≥ izolacφ nejvφce izoluje od zm∞n proveden²ch
ostatnφmi transakcemi. |
DatabßzovΘ servery majφ r∙znou podporu pro tyto ·rovn∞
izolacφ. Pokud po╛adovanß ·rove≥ izolacφ nenφ serverem podporovßna, pak
C++ Builder pou╛ije nejbli╛╣φ vy╣╣φ ·rove≥ izolace.
Poznßmka: Kdy╛ pou╛φvßme transakce s lokßlnφmi
tabulkami Paradoxu, dBASE, Access nebo FoxPro, pak nastavφme TransIsolation
na tiDirtyRead mφsto pou╛itφ implicitnφho tiReadCommitted.
Pokud pro lokßlnφ tabulky mßme nastavenou jinou ·rove≥ izolace ne╛ tiDirtyRead,
pak BDE vracφ chybu.
Jestli╛e aplikace pou╛φvß ODBC ke spoluprßci se
serverem, pak ovladaΦ ODBC musφ takΘ podporovat po╛adovanou ·rove≥ izolace.
Pou╛φvßnφ pr∙chozφho SQL
S pr∙chozφm SQL pou╛φvßme komponentu TQuery, TStoredProc
nebo TUpdateSQL k zasφlßnφ p°φkaz∙ °φzenφ transakcφ SQL p°φmo na
vzdßlen² databßzov² server. BDE tyto p°φkazy nezpracovßvß. Pou╛itφ pr∙chozφho
SQL umo╛≥uje p°evzφt v²hody °φzenφ transakcφ nabφzen²ch na╣φm serverem
a to obzvlß╣t∞ kdy╛ toto °φzenφ je nestandardnφ.
Pro pou╛itφ pr∙chozφho SQL k °φzenφ transakcφ musφme:
-
Instalovat sprßvn∞ ovladaΦe SQL Links. Pokud p°i instalaci
C++ Builderu zvolφme standardnφ instalaci, pak ovladaΦe SQL Links jsou
nainstalovßny dob°e.
-
Konfigurovat sprßvn∞ nß╣ sφ╗ov² protokol.
-
Mφt p°φstup k databßzi na vzdßlenΘm serveru.
-
Pou╛φt pr∙zkumnφka SQL k nastavenφ SQLPASSTHRUMODE
na NOT SHARED.
Poznßmka: Kdy╛ SQLPASSTHRUMODE je NOT
SHARED, pak musφme odd∞lit komponenty databßze pro datovΘ mno╛iny kterΘ
p°edßvajφ transakce SQL na server a datovΘ mno╛iny, kterΘ je nep°edßvajφ.
SQLPASSTHRUMODE specifikuje zda BDE a p°φkazy
pr∙chozφho SQL mohou b²t sdφleny stejn²m databßzov²m p°ipojenφm. SQLPASSTHRUMODE
je v∞t╣inou nastaveno na SHARED AUTOCOMMIT. Pokud ale chceme
pou╛φvat pr∙chozφ SQL, pak jej musφme nastavit na NOT SHARED (musφme
mφt samostatnou komponentu databßze pro komponentu TQuery, kterß
p°edßvß p°φkazy transakcφ SQL na server a dal╣φ komponenty datov²ch mno╛in,
kterΘ to ned∞lajφ).
Pou╛φvßnφ lokßlnφch transakcφ
BDE podporuje lokßlnφ transakce na tabulkßch Paradoxu a dBASE.
Z hlediska k≤dovßnφ nenφ rozdφl mezi lokßlnφmi transakcemi a transakcemi
na vzdßlenΘm databßzovΘm serveru. Kdy╛ transakce je zahßjena na lokßlnφ
tabulce, pak provedenΘ zm∞ny jsou zaznamenßny. Ka╛d² zaznamenan² zßznam
obsahuje vyrovnßvacφ pam∞╗ pro p∙vodnφ zßznam. Kdy╛ transakce je aktivnφ,
pak aktualizovan² zßznam je uzamΦen dokud transakce nenφ ukonΦena volßnφm
Commit
nebo
Rollback. P°i Rollback je k obnovenφ p∙vodnφho stavu
pou╛it zßznam z vyrovnßvacφ pam∞ti p∙vodnφho zßznamu.
Pro lokßlnφ transakce platφ tato omezenφ:
-
Nenφ podporovßno automatickΘ obnovovßnφ dat.
-
Nejsou podporovßny p°φkazy definice dat.
-
Transakce nemohou b²t spu╣t∞ny na doΦasn²ch tabulkßch.
-
Pro Paradox, lokßlnφ transakce mohou b²t provßd∞ny pouze
na tabulkßch s p°φpustn²mi indexy. Nelze zru╣it zm∞ny v tabulkßch Paradoxu,
kterΘ nejsou indexovßny.
-
Je omezen poΦet zßznam∙, kterΘ mohou b²t uzamΦeny a modifikovßny.
Pro tabulky Paradoxu je to 255 zßznam∙ a pro dBASE 100 zßznam∙.
-
Transakce nemohou b²t spu╣t∞ny pro ovladaΦ BDE ASCII.
-
┌rove≥ izolacφ transakcφ musφ b²t nastavena pouze na tiDirtyRead.
-
Nelze uzavφrat kurzor na tabulce b∞hem ru╣enφ transakce.
Aplikovßnφ odlo╛en²ch aktualizacφ
BDE poskytuje podporu pro odlo╛enΘ aktualizace. P°i odlo╛en²ch
aktualizacφch, na╣e aplikace zφskß data z databßze, provede v╣echny zm∞ny
lokßln∞ na kopii dat a aplikuje odlo╛enΘ aktualizace na datovou mno╛inu
najednou. Odlo╛enΘ aplikace jsou aplikovßny na databßzi v jednΘ transakci.
Odlo╛enΘ aktualizace mohou minimalizovat Φas transakce
a omezovat sφ╗ov² provoz. NicmΘn∞, odlo╛enß data jsou lokßlnφ v na╣φ aplikaci
a tedy nejsou pod °φzenφm transakcφ. Pracujeme na t∞chto datech lokßln∞,
zatφmco ostatnφ aplikace mohou m∞nit tato data v databßzov²ch tabulkßch.
Tyto zm∞ny nevidφme, dokud na╣e odlo╛enΘ aktualizace neaplikujeme. P°i
zßpisu na╣ich zm∞n do databßze m∙╛e vzniknout mnoho konflikt∙.
M∙╛eme °φci datovΘ mno╛in∞ podporujφcφ BDE aby pou╛φvala
odlo╛enΘ aktualizace pomocφ vlastnosti CachedUpdates. Kdy╛ zm∞ny
jsou kompletnφ, pak je m∙╛eme aplikovat komponentou datovΘ mno╛iny, komponentou
databßze nebo specißlnφ aktualizaΦnφm objektem. Kdy╛ zm∞ny nemohou b²t
aplikovßny na databßzi bez specißlnφho zpracovßnφ (nap°. kdy╛ pracujeme
se spojen²m dotazem), pak musφme pou╛φt udßlost OnUpdateRocord k
zßpisu zm∞n do jednotliv²ch tabulek tvo°φcφch spojen² pohled.
Poznßmka: Pokud pou╛φvßme odlo╛enΘ aplikace,
pak m∙╛eme p°edpoklßdat p°esun do vφcevrstvovΘ aplikace, nebo╗ zde jsou
v∞t╣φ mo╛nosti aktualizace.
Vytvß°enφ a restrukturalizace databßzov²ch tabulek
V aplikacφch zalo╛en²ch na BDE, m∙╛eme pou╛φt komponentu
TTable
k vytvo°enφ novΘ databßzovΘ tabulky a k p°idßvßnφ index∙ k existujφcφm
tabulkßm. Tabulky m∙╛eme vytvß°et p°i nßvrhu nebo za b∞hu. K vytvo°enφ
tabulky musφme specifikovat polo╛ky v tabulce pomocφ vlastnosti
FieldDefs
a p°φpadnΘ indexy pomocφ vlastnosti IndexDefs a volßme metodu CreateTable
(nebo v mφstnφ nabφdce tabulky zvolφme
Create Table).
Poznßmka: Kdy╛ vytvß°φme tabulky Oracle8, pak
nem∙╛eme vytvß°et objekty polo╛ek (ADT polo╛ky, polo╛kovΘ pole, odkazovΘ
polo╛ky a polo╛kovΘ datovΘ mno╛iny).
Pokud chceme za b∞hu restrukturalizovat tabulku (jinak
ne╛ p°idat indexy), pak musφme pou╛φt DbiDoRestructure API BDE.
P°idßvat indexy k existujφcφ tabulce m∙╛eme pomocφ metody AddIndex
komponenty tabulky.
Poznßmka: K restrukturalizaci tabulek Paradoxu
a dBASE p°i nßvrhu m∙╛eme pou╛φt Desktop databßze. K vytvß°enφ a restrukturalizaci
tabulek na vzdßlen²ch serverech, pou╛φvßme Pr∙zkumnφk SQL a restrukturalizujeme
tabulky pomocφ SQL.
Pochopenφ vztahu
mezi databßzφ a komponentou sezenφ
Obecn∞, vlastnosti komponenty sezenφ, jako je KeepConnections,
poskytujφ globßlnφ, implicitnφ chovßnφ, kterΘ je aplikovßno na v╣echny
doΦasnΘ komponenty databßze vytvß°enΘ podle pot°eby za b∞hu aplikace.
Metody sezenφ jsou n∞kdy aplikovßny r∙zn∞. Metody TSession
ovliv≥ujφ v╣echny komponenty databßze bez ohledu na jejich stav. Nap°.
metoda DropConnections sezenφ uzavφrß v╣echny datovΘ mno╛iny nßle╛ejφcφ
komponentßm databßze sezenφ a pak ukonΦuje v╣echna databßzovß p°ipojenφ,
kdy╛ vlastnost KeepConnection pro jednotlivΘ komponenty databßze
je true.
Metody komponenty databßze p∙sobφ pouze na datovΘ mno╛iny
p°i°azenΘ k danΘ komponent∞ databßze. Nap°. p°edpoklßdejme ╛e komponenta
databßze
Database1 je p°i°azena k implicitnφmu sezenφ. Pak
Database1->CloseDataSets();
uzavφrß pouze ty datovΘ mno╛iny, kterΘ jsou p°i°azeny
k Database1. Otev°enΘ datovΘ mno╛iny pat°φcφ do jin²ch komponent
databßzφ v implicitnφm sezenφ z∙stßvajφ otev°eny.
Pou╛φvßnφ
komponent databßze v datov²ch modulech
Komponenty databßze m∙╛eme bezpeΦn∞ umis╗ovat do datov²ch
modul∙. Jestli╛e vlo╛φme datov² modul, kter² obsahuje komponentu databßze
do Zßsobnφku objekt∙, a chceme aby ostatnφ u╛ivatelΘ od nφ mohli d∞dit,
pak musφme nastavit vlastnost
HandleShared komponenty databßze na
true
k zabrßn∞nφ konflikt∙m globßlnφho jmennΘho prostoru.
-
Pokuste se v n∞jakΘ aplikaci p°ipojit k n∞jakΘ databßzi vy╛adujφcφ jmΘno
u╛ivatele a heslo a vyzkou╣ejte r∙znΘ zp∙soby zadßvßnφ t∞chto informacφ.
|
12. P°ipojovßnφ k databßzi
|