12. P°ipojovßnφ k databßzi

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∞: 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: 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:
P°ipojenφ k databßzovΘmu serveru
Jsou dva zp∙soby p°ipojenφ k databßzovΘmu serveru pomocφ komponenty databßze: 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∙: Aplikace m∙╛e pou╛φvat datovΘ zdroje ODBC (nap°. Sybase). Konfigurace ovladaΦe ODBC vy╛aduje: 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: 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:
  1. Nastavφme vlastnost KeepConnection komponenty databßze na true.
  2. 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: 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:
  1. Spustφme transakci volßnφm metody StartTransaction databßze.
  2. 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φ.
  3. 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.
  4. 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: 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: 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φ:

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.

  1. 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