14. API BDE I

BDE (Borland Database Engine) je 32-bitovΘ jßdro modulu p°φstupu k databßzi pro prost°edky firmy Borland. BDE nabφzφ dostateΦnou mno╛inu slu╛eb pro v²vojß°e databßzov²ch aplikacφ typu klient/server.
BDE mß architekturu zalo╛enou na ovladaΦφch. Ka╛d² databßzov² formßt nebo datov² zdroj obvykle vy╛aduje samostatn² ovladaΦ BDE. Dan² ovladaΦ m∙╛e podporovat uzav°enou rodinu datov²ch zdroj∙. Nap°. ovladaΦ dBASE podporuje dBASE III, dBASE IV a nov∞j╣φ a FoxPro verze 2.0, 2.5 a 2.6.
BDE je navr╛en objektov∞ orientovan∞, co╛ usnad≥uje jeho roz╣i°ovßnφ a p°izp∙sobovßnφ. K roz╣φ°enφ BDE na p°φstup k dal╣φmu databßzovΘmu systΘmu, jednodu╣e instalujeme p°φslu╣n² ovladaΦ BDE nebo ovladaΦ ODBC pro tento databßzov² systΘm.
V prost°edφ klient/server, aplikaΦnφ a v²vojovΘ nßstroje sφdlφ na klientskΘm poΦφtaΦi, zatφmco datovΘ zdroje jsou umφst∞ny na databßzovΘm serveru. BDE poskytuje transparentnφ p°φstup k databßzov²m server∙m a lokßlnφm databßzφm.

Funkce API BDE

BDE obsahuje API pro p°φm² p°φstup ke svΘ funkΦnosti. API obsahuje mno╛inu funkcφ, kterΘ mohou b²t volßny z libovolnΘho programovacφho jazyka umo╛≥ujφcφho volßnφ DLL Windows. Funkce BDE jsou optimalizovßny pro volßnφ z C nebo C++.
Dva r∙znΘ typy databßzov²ch systΘm∙ tradiΦn∞ podporujφ r∙zn² p°φstup k dat∙m: Funkce BDE jednotn∞ p°istupujφ k ob∞ma t∞mto typ∙m databßzov²ch systΘm∙ s konzistentnφm na kurzoru zalo╛enΘm API. Prost°ednictvφm ovladaΦ∙, BDE dßvß v²vojß°∙m aplikacφ p°φstup k unikßtnφm slu╛bßm ka╛dΘho databßzovΘho systΘmu, jako jsou datovΘ typy a specißlnφmu zpracovßnφ SQL databßzφ.
Pro v╣echny podporovanΘ databßze pro kterΘ je dostupn² p°irozen² ovladaΦ BDE nebo ovladaΦ ODBC, volßnφ funkcφ API BDE slou╛φ k nßsledujφcφm ·Φel∙m:

Objekty BDE

BDE je p°i nßvrhu objektov∞ orientovanΘ. Za b∞hu aplikace, v²vojß° aplikace spolupracuje s BDE vytvß°enφm r∙zn²ch objekt∙ BDE. Tyto b∞hovΘ objekty jsou pak pou╛ity k manipulaci s databßzov²mi entitami jako jsou tabulky a dotazy. Programovßnφ pro BDE vy╛aduje interakce s objekty BDE.
Ka╛d² typ objektu BDE je definovßn mno╛inou vlastnostφ. Hodnoty jsou p°i°azeny k vlastnostem p°i vytvo°enφ objektu. Nap°. jmΘno tabulky CUSTOMER je hodnota p°i°azenß k vlastnosti jmΘna tabulky objektu kurzoru, kdy╛ tabulka CUSTOMER je otev°ena.
Rozhranφ API BDE poskytuje mno╛inu funkcφ, kterΘ v²vojß° aplikace m∙╛e pou╛φt k zφskßnφ existujφcφch hodnot vlastnostφ a k nastavovßnφ t∞chto hodnot.
Jeden objekt system °φdφ zdroje spoleΦnΘ pro v╣echny aplikace spu╣t∞nΘ na stejnΘm poΦφtaΦi. Objekt system je automaticky vytvo°en API BDE p°i prvnφ inicializaci klienta. V tomto okam╛iku v╣echna konfiguraΦnφ nastavenφ jako nap°. maximum pam∞ti povolenΘ pro vyrovnßvacφ pam∞ti, jsou p°eΦtena z Registr∙ Windows.
Nov² objekt client je vytvo°en, kdy╛ aplikace volß inicializaΦnφ funkci BDE. Toto prvnφ volßnφ DbiInit je nutno provΘst d°φve ne╛ je mo╛no volat jinΘ funkce BDE. Objekt client je udr╛ovßn automaticky BDE a existuje hlavn∞ jako kontext pro v╣echny systΘmovΘ zdroje pou╛itΘ BDE pro ka╛dΘho klienta. Objekt client mß takΘ vlastnosti, kterΘ mohou b²t nastaveny.
OvladaΦe databßze jsou vlastn∞ny klientem nebo systΘmem; po zavedenφ ovladaΦe, v╣echny ostatnφ klienti registrovanΘ BDE, k n∞mu majφ p°φstup.
Aplikace m∙╛e udr╛ovat jedno nebo vφce sezenφ. Sezenφ izoluje databßzovΘ p°φstupovΘ operace bez nutnosti spu╣t∞nφ jinΘ instance aplikace. Kdy╛ je aplikace inicializovßna, pak je vytvo°eno automaticky implicitnφ sezenφ. Objekt session je kontejner pro v╣echny ostatnφ b∞hovΘ objekty BDE, kterΘ mohou b²t vytvß°eny, tj. Databßze, Kurzory a P°φkazy dotazu.
Pokud nß╣ p°φstupov² objekt je vytvo°en v jinΘm sezenφ, pak souΦasnΘ sezenφ bude zm∞n∞no na sezenφ ve kterΘm objekt byl vytvo°en. Sezenφ je takΘ vlastnφk v╣ech tabulek a zßmk∙ zßznam∙ zφskan²ch v╣emi objekty v sezenφ. To znamenß, ╛e tabulky nebo uzamΦenΘ zßznamy zφskanΘ pomocφ jednoho kurzoru v sezenφ jsou vlastn∞ny v╣emi kurzory v sezenφ, kterΘ jsou otev°eny na stejnΘ tabulce. Dal╣φ sezenφ mohou b²t vytvo°ena k umo╛n∞nφ jinΘho uzamykacφho kontextu.
Dal╣φ vlastnostφ sezenφ je privßtnφ adresß°, kde BDE umis╗uje v╣echny doΦasnΘ tabulky zalo╛enΘ na souborech vytvo°enΘ sezenφm. Dßle sezenφ vlastnφ dv∞ vlastnosti specifickΘ pro ovladaΦ Paradoxu: heslo (pro umo╛n∞nφ p°φstupu k tabulkßm chrßn∞n²m heslem) a sφ╗ov² °φdφcφ adresß°, kde je umφst∞n soubor PDOXUSRS.NET.
Ka╛d² databßzov² ovladaΦ je zaveden systΘmem, kdy╛ aplikace poprvΘ po╛aduje slu╛bu z tohoto ovladaΦe. V tento okam╛ik, v╣echny konfiguraΦnφ nastavenφ nalezenΘ v Registrech Windows nebo konfiguraΦnφm souboru BDE t²kajφcφ se tohoto ovladaΦe jsou pou╛ity k jeho inicializaci. OvladaΦe jsou vlastn∞ny klientem nebo systΘmem; jednou zaveden² ovladaΦ mohou pou╛φvat v╣echny klienti registrovanΘ BDE. V²vojß° aplikace se m∙╛e takΘ informovat o mo╛nostech ovladaΦe, jako je schopnost ovladaΦe podporovat transakce.
Standardnφ ovladaΦe pro Paradox, dBASE, Access, FoxPro a textovΘ databßze jsou dodßvßny s BDE. Pro databßzovΘ systΘmy SQL jako je Informix, DB2, InterBase, Oracle a Sybase jsou dostupnΘ samostatnΘ p°irozenΘ ovladaΦe BDE SQL. LibovolnΘ ovladaΦe ODBC mohou b²t pou╛ity s BDE, proto╛e BDE mß konektivitu s ODBC. Funkce BDE jako DbiAddAlias a DbiOpenDatabase automaticky p°idßvajφ ovladaΦe ODBC a datovΘ zdroje jako p°ezdφvky BDE na aktivnφ sezenφ pokud nejsou prßv∞ ulo╛eny v konfiguraΦnφm souboru. BDE takΘ podporuje ovladaΦe ODBC 3.
Databßze je organizovanß kolekce svßzan²ch tabulek. Pro p°φstup k dat∙m v tabulce, sezenφ musφ nejprve zφskat p°φstup do databßze volßnφm DbiOpenDatabase, kterΘ vracφ madlo databßze.
Souborov∞ zalo╛enΘ databßze, jako je Paradox, dBASE, FoxPro, Access a text, BDE klasifikuje jako "standardnφ" databßze. Soubory ve standardnφch databßzφch jsou normßln∞ seskupovßny do adresß°∙ p°i°azen²ch ke standardnφm databßzφm, i kdy╛ aplikace m∙╛e specifikovat ·plnou specifikaci souboru a zp°φstupnit libovolnΘ soubory a to jak lokßlnφ nebo umφst∞nΘ na sφti.
SQL databßze obvykle sφdlφ na serveru. KlientskΘ aplikace se musφ nejprve p°ihlßsit a z°φdit p°ipojenφ na databßzov² server. To vy╛aduje p°edßnφ p°φslu╣nΘho jmΘna u╛ivatele a hesla. Kdy╛ volßme DbiOpenDatabase, pak BDE se p°ipojuje k serveru a z°izuje p°ipojenφ stejn∞ jako pro standardnφ databßze.
P°ezdφvky jsou zkrßcenß jmΘna odkaz∙ na databßze. DatabßzovΘ odkazy v aplikaci mohou pou╛φvat jmΘna p°ezdφvek, co╛ d∞lß aplikace p°enositeln²mi. Definici p°ezdφvky m∙╛eme zm∞nit kdykoliv pomocφ Administrßtora BDE. V╣echny odkazy na p°ezdφvky v aplikaci automaticky ukazujφ na novou definici p°ezdφvky.
Pro standardnφ databßze, p°ezdφvka je jmΘno p°i°azenΘ jako zkratka k adresß°i obsahujφcφm soubory, ke kter²m chceme p°istupovat. Kdy╛ otev°eme databßzi s p°ezdφvkou, pak tabulka v adresß°i m∙╛e b²t otev°ena uvedenφm pouze jmΘna tabulky bez nutnosti poskytnutφ ·plnΘ cesty.
Pro SQL databßze musφ b²t pro p°ezdφvku definovßny vlastnosti. Tyto vlastnosti jsou znaΦn∞ zßvislΘ na ovladaΦi SQL. Vlastnosti p°ezdφvky zahrnujφ: jmΘno u╛ivatele, jmΘno serveru, re╛im otev°enφ, implicitnφ re╛im dotazu, jazykov² ovladaΦ apod. Po z°φzenφ p°ezdφvky pro SQL databßzi, ji klientskß aplikace pou╛φvß stejn²m zp∙sobem jako pou╛φvß p°ezdφvku pro standardnφ databßze.
BDE poskytuje p°φstup k tabulkßm a v²sledk∙m dotaz∙ prost°ednictvφm kurzor∙. Kurzor umo╛≥uje adresovat zßznam v kolekci zßznam∙. V╣echny operace manipulace dat (vklßdßnφ, ru╣enφ, aktualizace) a takΘ pohyb kurzoru po tabulce (n∞kdy naz²van² jako navigace) jsou provßd∞ny s kurzory. Kdy╛ aplikace otev°e tabulku volßnφm DbiOpenTable nebo provede dotaz, pak je vrßceno madlo kurzoru. Po nßvratu madla kurzoru, jej m∙╛eme pou╛φt k zφskßnφ dat ulo╛en²ch v tabulce stejn∞ jako informacφ o tabulce. M∙╛eme takΘ zφskat nebo nastavit vlastnosti tohoto kurzoru. Aplikace m∙╛e kdykoliv uzav°φt kurzor volßnφm DbiCloseCursor. Kdy╛ je kurzor uzav°en, pak madlo kurzoru se stane neplatn²m. Na jednΘ tabulce m∙╛e b²t vytvo°eno vφce kurzor∙.
Pro p°φstup k dat∙m v tabulce, aplikace otev°e tabulku a zφskß madlo kurzoru. Tabulka m∙╛e b²t otev°ena v²luΦn∞ nebo sdφlen∞. P°ekladov² re╛im m∙╛e b²t specifikovßn jako xltNONE nebo xltFIELD. Pokud je specifikovßno xltNONE, pak data z tabulky jsou vracena jako nep°elo╛en² fyzick² typ (p°irozenΘ datovΘ typy jak jsou ulo╛eny datov²m zdrojem). Kdy╛ je specifikovßno xltFIELD, pak data jsou p°elo╛ena na obecnΘ logickΘ typy BDE. LogickΘ typy jsou kompatibilnφ s datov²mi typy jazyka C.
Implicitn∞, zßznamy vracenΘ kurzorem nejsou v jistΘm po°adφ. ╪azenΘ kurzory mohou b²t zφskßny specifikacφ aktivnφho indexu pro kurzor (pomocφ DbiOpenTable nebo DbiSwitchToIndex). Spu╣t∞nΘ dotazy s klauzulφ ORDER BY jsou takΘ °azenΘ kurzory.
Kdy╛ aplikace otev°e kurzor na tabulce nebo v²sledku dotazu, pak kurzor je umφst∞n na zaΦßtek v²sledkovΘ mno╛iny, p°ed prvnφ °ßdek v tabulce. Tato poΦßteΦnφ pozice umo╛≥uje aplikaci p°istupovat ke v╣em zßznam∙m pomocφ funkce DbiGetNextRecord. Kurzor m∙╛e b²t umφst∞n na zßznam nebo na mezeru p°ed zßznamem. Mezera je pozice mezi zßznamy, na zaΦßtku tabulky, na konci tabulky nebo na mφst∞ po zru╣enΘm zßznamu.
Mo╛nΘ pozice kurzor∙ jsou: Zßlo╛ka m∙╛e b²t zφskßna k ulo╛enφ souΦasnΘ pozice kurzoru, co╛ umo╛nφ pozd∞j╣φ nßvrat na toto mφsto. Zßlo╛ky lze zapamatovat na libovolnΘ pozici: na souΦasnΘm °ßdku, na zaΦßtku nebo na konci tabulky nebo na meze°e. Volßnφ DbiGetBookMark uklßdß souΦasnou pozici kurzoru jako zßlo╛ku. Nßsledujφcφ volßnφ DbiSetToBookMark umis╗uje kurzor na mφsto ulo╛enΘ DbiGetBookMark. Na kurzoru m∙╛e b²t umφst∞no vφce zßlo╛ek. Pozice dvou zßlo╛ek m∙╛e b²t porovnßvßna volßnφm DbiCompareBookMark.
Dotazy SQL a QBE mohou b²t provßd∞ny p°φmo nebo je nejprve p°ipravφme a pak provedeme. Kdy╛ dotaz je p°ipraven, pak BDE testuje jeho p°φpustnost; pokud dotaz je p°φpustn², pak BDE vytvß°φ objekt dotazu a vracφ madlo p°φkazu dotazu. Po zφskßnφ madla m∙╛eme m∞nit jistΘ vlastnosti madla. Nap°. pokud dotaz mß oznaΦovaΦe parametr∙, pak hodnoty parametr∙ mohou b²t nastaveny p°ed provedenφm dotazu.

DatabßzovΘ entity

DatabßzovΘ entity jsou trvalΘ objekty, spoleΦnΘ pro v∞t╣inu databßzov²ch systΘm∙ a zahrnujφ: tabulky, indexy, polo╛ky, dotazy, transakce, zp∞tnß volßnφ a k°φ╛ovΘ databßzovΘ operace.
Data v databßzi jsou organizovanß v tabulkßch. V BDE jmΘno tabulky mß v²znam pouze v databßzi. Tabulky jsou dostupnΘ z aplikace v °ßdcφch (zßznamech) a sloupcφch (polo╛kßch). ╪ßdky mohou b²t °azeny indexy. K vytvo°enφ tabulky, aplikace volß funkci BDE DbiCreateTable p°edßnφm kompletnφ struktury popisu tabulky CRTblDesc. P°φpadn∞, tabulky mohou b²t vytvß°eny pomocφ jazyka definice dat SQL (DDL).
JistΘ databßzovΘ operace vytvß°ejφ doΦasnΘ tabulky, kterΘ mohou b²t pozd∞ji ulo╛eny na disk. Pokud tabulka zφskß znaΦnou velikost, pak je automaticky zapsßna na disk. KlientskΘ aplikace mohou explicitn∞ uklßdat doΦasnΘ tabulky na disk volßnφm funkce DbiMakePermanent nebo DbiSaveChanges. Tyto tabulky se chovajφ jako normßlnφ tabulky.
DbiCreateInMemTable pou╛ijeme k vytvo°enφ doΦasnΘ tabulky, kterou nezam²╣lφme zapsat na disk. Jsou vytvß°eny aplikacφ pro ulo╛enφ informacφ, kterΘ jsou v pr∙b∞hu zpracovßnφ stßle zapot°ebφ. Tyto tabulky lze vytvo°it pouze s logick²mi typy a nepodporujφ indexy.
Indexy urΦujφ po°adφ zßznam∙ v tabulce. Paradox, dBASE, FoxPro, Access a systΘmy SQL databßzφ umo╛≥ujφ vytvß°et indexy. Jsou ale rozdφly ve zp∙sobu prßce index∙ a lisφ se i informace nutnΘ k definovßnφ index∙ na t∞chto databßzov²ch systΘmech.
BDE podporuje v╣echny p°irozenΘ modely indexovßnφ v t∞chto systΘmech. K umo╛n∞nφ na╣i aplikaci vytvo°it index, BDE poskytuje obecnou strukturu deskriptoru indexu IDXDesc. IDXDesc je svaz v╣ech polo╛ek po╛adovan²ch k definovßnφ index∙ pro v╣echny podporovanΘ systΘmy databßze. Pro p°idßnφ indexu, aplikace zapφ╣e po╛adovanß data do IDXDesc a volß funkci DbiAddIndex.
K vytvo°enφ indexu pro tabulku, na╣e aplikace po╛aduje pouze data v polo╛kßch deskriptoru indexu, kterΘ jsou aplikovatelnΘ na databßzov² systΘm jistΘ tabulky. Nap°. kdy╛ definujeme index pro tabulku InterBase, pak na╣e aplikace ignoruje polo╛ky jako jsou szTagName a szExpIdx, kterΘ se pou╛φvajφ pouze k definovßnφ index∙ dBASE. Pokud hodnoty po╛adovan²ch polo╛ek nejsou dodßny, pak volßnφ DbiAddIndex vracφ chybovou zprßvu.
R∙znΘ typy index∙ v databßzov²ch systΘmech majφ r∙znΘ po╛adavky. Nap°. kdy╛ p°idßvßme udr╛ovateln² index dBASE, pak je vy╛adovßna polo╛ka szTagName. Indexy mohou b²t takΘ vytvß°eny pomocφ Jazyka definice dat SQL.
Jsou t°i zßkladnφ typy index∙: Indexy majφ t°i dal╣φ charakteristiky: Je d∙le╛itΘ pochopit, ╛e r∙znΘ ovladaΦe podporujφ r∙znΘ typy a charakteristiky index∙. Nßsleduje seznam pravidel pro r∙znΘ typy index∙ a charakteristik podporovan²ch ka╛d²m ovladaΦem.
dBASE
Nßsledujφcφ pravidla popisujφ jak dBASE podporuje indexy: Paradox
Nßsledujφcφ pravidla popisujφ jak Paradox podporuje indexy: SQL
Nßsledujφcφ pravidla popisujφ jak ovladaΦe SQL podporujφ indexy: Polo╛ky jsou sloupce tabulky. Vlastnosti ka╛dΘ polo╛ky v tabulce jsou definovßny ve struktu°e deskriptoru polo╛ky FLDDesc. Kdy╛ tabulka je vytvß°ena DbiCreateTable, pak deskriptor tabulky CRTblDesc ukazuje na pole struktur FLDDesc, kde ka╛dß definuje polo╛ku v tabulce.
FyzickΘ datovΘ typy se v jednotliv²ch typech datov²ch zdroj∙ li╣φ. Nap°. Φφsla v pohyblivΘ °ßdovΘ Φßrce jsou uklßdßny r∙zn∞ v Paradoxu, dBASE a datov²ch zdrojφch SQL. FyzickΘ datovΘ typy jednoho datovΘho zdroje nemusφ b²t kompatibilnφ s fyzick²mi datov²mi typy ostatnφch datov²ch zdroj∙ pro ulo╛enφ stejn²ch dat.
LogickΘ datovΘ typy jsou obecnΘ datovΘ typy pou╛φvanΘ BDE. Tyto obecnΘ typy jsou zam∞nitelnΘ mezi datov²mi zdroji, proto╛e BDE je automaticky p°eklßdß na p°φslu╣nΘ fyzickΘ datovΘ typy pro ka╛d² cφlov² datov² zdroj.
LogickΘ datovΘ typy BDE jsou kompatibilnφ se standardnφmi datov²mi typy jazyka C. P°ekladov² algoritmus aplikace m∙╛eme p°epsat p°i zp°φstup≥ovßnφ tabulky a tak zφskßvat data ve fyzickΘm formßtu pou╛it²m datov²m zdrojem.
ObecnΘ dotazovacφ moduly umo╛≥ujφ specifikovat dotazy v jazyku SQL nebo QBE na libovolnΘm dostupnΘm datovΘm zdroji. Prost°ednictvφm dotaz∙, BDE umo╛≥uje uniformovat data zφskßvanß prost°ednictvφm datov²ch zdroj∙. Lokßlnφ sprßvce dotazu umo╛≥uje spojovat data z r∙zn²ch server∙. Nap°. m∙╛eme spojit Oracle s dBASE, Sybase s Paradoxem nebo InterBase s Oraclem na dvou r∙zn²ch serverech. Pro spu╣t∞nφ k°φ╛ov²ch databßzov²ch dotaz∙, jmΘna tabulek v dotazu musφ b²t kvalifikovßny jmΘny p°ezdφvek. K°φ╛ovΘ databßzovΘ dotazy jsou podporovßny pouze s madly standardnφch databßzφ, pokud dotaz je cφlen na SQL server.
BDE poskytuje mno╛inu funkcφ rozhranφ dotazu, kter²mi v²vojß° aplikace se m∙╛e dotazovat tabulek v dostupn²ch databßzφch: BDE umo╛≥uje p°istupovat k dat∙m SQL, Paradoxu, dBASE, FoxPro nebo Access prost°ednictvφm dotaz∙ SQL (podmno╛iny jazyka SQL) a dotaz∙ QBE (jazyka Query By Example definovanΘho v Paradoxu). Oba typy dotaz∙ mohou b²t provßd∞ny jako ╛ivΘ v²sledkovΘ mno╛iny (aktualizace se provedou i v p∙vodnφch tabulkßch).
Transakce je skupina svßzan²ch operacφ, kterΘ musφ v╣echny prob∞hnout ·sp∞╣n∞ nebo musφ b²t v╣echny zru╣eny. BDE podporuje transakce na v╣ech serverech t°emi funkcemi BDE: DbiBeginTran, DbiEndTran a DbiGetTranInfo.
Aplikace volß DbiBeginTran, p°edßvß p°φkazy SQL a funkce BDE vlo╛enΘ do transakce a pak volß DbiEndTran. DbiGetInfo vracφ stavovΘ informace o transakci.
BDE podporuje lokßlnφ transakce pro ovladaΦe Paradoxu, dBASE a Access a tak aktualizovanΘ tabulky mohou b²t vrßceny do p∙vodnφho stavu nebo zapsßny trvale. Bez podpory transakcφ, aktualizace jsou zapsßny bezprost°edn∞ a nenφ je mo╛no zru╣it.
Kdy╛ lokßlnφ transakce je spu╣t∞na na standardnφ databßzi, pak aktualizace provedenΘ na tabulkßch v databßzi jsou zaznamenßny. Tento zßznam obsahuje ulo╛enφ p∙vodnφch zßznamu, kterΘ byly zm∞n∞ny. Kdy╛ transakce je aktivnφ, pak aktualizovanΘ zßznamy jsou uzamΦeny. Tyto zßmky jsou dr╛eny dokud transakce nenφ trvale zapsßna nebo zru╣ena. Pro standardnφ databßze neexistuje automatickΘ zotavenφ z chyb.
N∞kdy klientskß aplikace po╛aduje informace o zpracovßnφ danΘ funkce. Nap°. pokud tabulka je restrukturalizovßna, pak jistΘ podmφnky mohou zp∙sobit zßpis zßznam∙ do "problΘmovΘ" tabulky mφsto do cφlovΘ tabulky. V t∞chto situacφch m∙╛eme chtφt ukonΦit operaci nebo provΘst n∞jakou jinou akci. Zp∞tnΘ volßnφ umo╛≥uje aplikaci vyhodnotit situaci p°ed p°edßnφm akce BDE. Aplikace registruje zp∞tnß volßnφ volßnφm DbiRegisterCallBack.
Po registraci zp∞tnΘho volßnφ, v²skyt specifikovanΘ udßlosti spou╣tφ zp∞tn∞ volanou funkci. Zp∞tnΘ volßnφ pak zjistφ dal╣φ instrukce pro aplikaci. Klient reaguje na zp∞tnΘ volßnφ zaslßnφm p°φslu╣nΘho nßvratovΘho k≤du (cbrABORT, cbrCONTINUE apod.). Mechanismus zp∞tnΘho volßnφ je efektivnφ, proto╛e BDE m∙╛e zφskat reakci aplikace bez p°eru╣enφ normßlnφho procesu zpracovßnφ.
Dotazy a dßvkovΘ funkce BDE mohou operovat na heterogennφch datov²ch zdrojφch. Nßsledujφcφ p°φklady ukazujφ tyto slu╛by:

V²voj aplikacφ

Budeme se seznamovat se zßkladnφ kroky v²voje aplikacφ s BDE.
┌vod do programovßnφ BDE
Nynφ si ukß╛eme jak zaΦφt programovat BDE. Po provedenφ nßsledujφcφch krok∙ budeme mφt jednoduchou aplikaci, kterß zφskß zßznam z tabulky a zobrazφ prvnφ dv∞ polo╛ky.
Pro tuto jednoduchou aplikaci nastavφme cφlovΘ prost°edφ na konzolovou aplikaci. Nebudeme se tedy muset zab²vat u╛ivatelsk²m rozhranφm Windows. Nastavφme volbu p°ekladu "Allocate enums as ints". Do modulu obsahujφcφ k≤d BDE vlo╛φme hlaviΦkovΘ soubory: WINDOWS.H a IDAPI.H.
Nßsledujφ zßkladnφ kroky pot°ebnΘ k zφskßnφ zßznamu z tabulky. Cel² program si m∙╛eme prohlΘdnout zde.

Zp°φstup≥ovßnφ a aktualizace tabulek

Nßsledujφcφ tabulka uvßdφ procesy zp°φstup≥ovßnφ a aktualizace tabulek pomocφ BDE:
 
Fßze ┌loha Funkce BDE
P°φprava Inicializace modulu p°φstupu k databßzi (BDE) DbiInit
P°φprava Otev°enφ databßze DbiOpenDatabase
P°φprava Otev°enφ tabulky a zφskßnφ kurzoru DbiOpenTable
P°φprava Zφskßnφ vlastnostφ kurzoru DbiGetCursorProps
P°φprava Alokovßnφ vyrovnßvacφ pam∞ti zßznamu Zodpovφdß aplikace
P°φprava Zφskßnφ deskriptoru polo╛ky DbiGetFieldDescs
P°φprava Zahßjenφ re╛imu odlo╛en²ch aktualizacφ DbiBeginDelayedUpdates
Zφskßvßnφ Umφst∞nφ ukazatele a zφskßnφ zßznamu do vyrovnßvacφ pam∞ti DbiGetNextRecord
Zφskßvßnφ Zφskßnφ polo╛ky z vyrovnßvacφ pam∞ti DbiGetField
Aktualizace Aktualizace polo╛ky a zßpis do vyrovnßvacφ pam∞ti zßznamu DbiPutField
Aktualizace Aktualizace tabulky nov²m zßznamem DbiModifyRecord
Aktualizace Aplikovßnφ odlo╛en²ch zm∞n na tabulku DbiApplyDelayedUpdates
UkonΦenφ UkonΦenφ re╛imu odlo╛en²ch aktualizacφ DbiEndDelayedUpdates
UkonΦenφ Uzav°enφ kurzoru DbiCloseCursor
UkonΦenφ Uzav°enφ databßze DbiCloseDatabase
UkonΦenφ UkonΦenφ BDE (modulu p°φstupu k databßzi) DbiExit
P°φprava na p°φstup k tabulce
Prvnφm volßnφm, kterΘ aplikace provßdφ na BDE je v╛dy DbiInit, k inicializaci modulu p°φstupu k databßzi a spu╣t∞nφ novΘho sezenφ. DbiInit m∙╛e b²t voliteln∞ pou╛ito s ukazatelem na informaΦnφ strukturu prost°edφ DBIEnv. Normßln∞ je p°edßvßn ukazatel NULL, Φφm╛ donutφme BDE hledat polo╛ky v Registrech a v konfiguraΦnφm souboru BDE a pou╛itφ implicitnφho nastavenφ. Pokud p°edßme ukazatel NULL na strukturu DBIEnv, pak BDE hledß konfiguraΦnφ soubor takto:
  1. BDE testujφ Registry Windows na konfiguraΦnφ soubor definovan² polo╛kou [BDE] s podpolo╛kou CONFIGFILE01.
  2. Pokud krok 1 nenφ ·sp∞╣n², pak BDE hledß konfiguraΦnφ soubor jmΘna IDAPI.CFG ve spou╣t∞cφm adresß°i.
  3. Pokud krok 2 nenφ ·sp∞╣n², pak BDE je inicializovßno implicitnφm nastavenφm preferovan²m pro ka╛d² ovladaΦ.
Jestli╛e ukazatel nenφ NULL a konfiguraΦnφ soubor je specifikovßn ve struktu°e DBIEnv, pak BDE pou╛ije tento konfiguraΦnφ soubor. Nßsleduje p°φklad volßnφ DbiInit:
rslt = DbiInit(NULL);
D°φve ne╛ m∙╛eme otev°φt tabulku musφme volßnφm DbiOpenDatabase otev°φt databßzi. ┌sp∞╣nΘ volßnφ DbiOpenDatabase vracφ madlo databßze, kterΘ je dßle p°edßvßno nßsledujφcφm volßnφm mnoha funkcφ BDE.
Pro SQL databßze musφ b²t s DbiOpenDatabese dodßno jmΘno u╛ivatele a heslo pro p°ipojenφ k serveru.
Nßsledujφcφ p°φklad k≤du otevφrß standardnφ databßzi pomocφ nastavenφ jmΘna databßze a typu databßze na NULL:
rslt = DbiOpenDatabase(NULL, NULL, dbiREADWRITE,
       dbiOPENSHARED, NULL, 0, NULL, NULL, &hDb)
Pro zm∞nu souΦasnΘho adresß°e pro standardnφ databßzi volßme DbiSetDirectory:
rslt = DbiSetDirectory(hDb, "C:\\DATE");
Je n∞kolik r∙zn²ch metod specifikace SQL databßze ve volßnφ DbiOpenDatabase: Nap°. tento k≤d otevφrß pojmenovanou databßzi na SQL serveru:
rslt = DbiOpenDatabase("myalias", NULL, dbiREADWRITE, dbiOPENSHARED,
                       "mypassword", 0, NULL, NULL, &hDb)
Kdy╛ volßme DbiOpenDatabase, pak m∙╛eme p°edat p°ezdφvku odkazujφcφ se na jmΘno databßze v konfiguraΦnφm souboru.
Parametry eOpenMode a eShareMode volßnφ DbiOpenDatabase v kombinaci s parametry eOpenMode a eShareMode volßnφ DbiOpenTable urΦujφ p°φstupovß prßva u╛ivatel∙ k tabulkßm v databßzi.
Pro datovΘ zdroje SQL, parametr OPEN MODE pro ka╛dou p°ezdφvku v konfiguraΦnφm souboru BDE mß p°ednost p°ed parametry re╛imu otev°enφ p°edan²m v DbiOpenDatabase.
Pokud re╛im otev°enφ je pouze pro Φtenφ, pak tabulky v databßzi nenφ mo╛no otev°φt v re╛imu Φtenφ i zßpis. Kdy╛ databßze je otev°ena v re╛imu Φtenφ i zßpis, pak tabulky v databßzi mohou b²t otevφrßny DbiOpenTable v re╛imu pouze pro Φtenφ i v re╛imu Φtenφ i zßpis.
Pokud re╛im sdφlenφ databßze je v²luΦn², pak tabulky v databßzi nemohou b²t otevφrßny DbiOpenTable ve sdφlenΘm re╛imu. Pokud databßze je otev°ena ve sdφlenΘm re╛imu, pak tabulky v databßzi mohou b²t otevφrßny DbiOpenTable ve v²luΦnΘm nebo sdφlenΘm re╛imu.
VolitelnΘ parametry zßvisejφcφ na databßzi mohou b²t p°edßvßny funkci DbiOpenDatabase. Pro zφskßnφ seznamu a popisu t∞chto voliteln²ch parametr∙ pro databßze, aplikace m∙╛e volat DbiOpenCfgInfoList, p°edßnφm cesty ke jmΘnu databßze v konfiguraΦnφm souboru. Tato funkce vracφ madlo na virtußlnφ tabulku voliteln²ch parametr∙ pro tento databßzov² systΘm a implicitnφ hodnoty t∞chto parametr∙.
OptFields, pOptFldDesc a pOptParams jsou volitelnΘ parametry, ale mohou b²t aktußln∞ vy╛adovßny v zßvislosti na pou╛itΘm ovladaΦi.
Tabulku m∙╛eme otev°φt volßnφm DbiOpenTable a p°edßnφm p°φslu╣n²ch parametr∙ jako je jmΘno tabulky, typ ovladaΦe, index, typ p°φstupu a re╛im sdφlenφ. Po ·sp∞╣nΘm otev°enφ tabulky, BDE vracφ madlo kurzoru k tabulce.
Pokud aplikace p°edßvß pln∞ kvalifikovanΘ jmΘno tabulky Paradoxu nebo dBASE, pak nemusφ specifikovat parametr typu ovladaΦe, proto╛e typ ovladaΦe m∙╛e b²t urΦen z p°φpony jmΘna souboru. Pokud jmΘno tabulky neobsahuje cestu, pak je pou╛it souΦasn² adresß° databßze p°i°azenΘ k madlu databßze.
Typ ovladaΦe musφ b²t specifikovßn, pokud jmΘno tabulky nemß p°φponu nebo k p°epsßnφ implicitnφho ovladaΦe p°i°azenΘho k p°φpon∞ souboru nebo k ukonΦenφ jmΘna tabulky teΦkou. Pokud jmΘno tabulky nepodporuje implicitnφ p°φponu a parametr typu ovladaΦe je NULL, pak DbiOpenTable se pokusφ otev°φt tabulku s implicitnφ p°φponou souboru urΦenou pro ka╛d² souborov² ovladaΦ uveden² v konfiguraΦnφm souboru, v po°adφ uvedenφ ovladaΦ∙. Typy ovladaΦ∙ a jejich implicitnφ p°φpony pro ovladaΦe Paradoxu, dBASE a Text ji╛ byly uvedeny.
Pro SQL databßze, jmΘno tabulky m∙╛e b²t pln∞ kvalifikovanΘ jmΘno, kterΘ obsahuje jmΘno vlastnφka ve tvaru
<vlastnφk>.<jmΘno_tabulky>
Pokud nenφ specifikovßn, pak vlastnφk je urΦen z madla databßze. Typ ovladaΦe je ignorovßn, pokud databßze je SQL databßze, nebo╗ ovladaΦ p°i otev°enφ databßze je ji╛ urΦen. Pro databßze Access, jsou po╛adovßny typ ovladaΦe a identifikßtor tabulky.
Pro otev°enφ tabulky s aktivnφm indexem, m∙╛eme pou╛φt nßsledujφcφ parametry, zßvisejφcφ na typu otevφranΘ tabulky: pszIndexName, pszIndexTagName nebo iIndexId. Aktivnφ index urΦuje po°adφ zßznam∙ pro tento kurzor.
Paradox: Pokud v╣echny parametry index∙ jsou NULL, pak tabulka je otev°ena v po°adφ primßrnφho klφΦe (pokud existuje). Pokud je specifikovßn sekundßrnφ klφΦ, tak tabulka je otev°ena na tomto klφΦi. pszIndexName nebo iIndexID m∙╛e b²t pou╛ito pro specifikaci slo╛enΘho nebo neslo╛enΘho sekundßrnφho klφΦe.
Access: Pokud v╣echny parametry index∙ jsou NULL, pak tabulka je otev°ena v p°irozenΘm po°adφ. pszIndexName nebo iIndexID m∙╛e b²t pou╛ito pro specifikaci slo╛enΘho nebo neslo╛enΘho sekundßrnφho klφΦe.
dBASE a FoxPro: Pokud index nenφ specifikovßn, pak tabulka je otev°ena ve fyzickΘm po°adφ.
SQL: Pou╛ijeme parametr pszIndexName pro specifikaci jmΘna indexu. JmΘno indexu m∙╛e b²t kvalifikovßno nebo nekvalifikovßno. NekvalifikovanΘ jmΘno indexu je ·sp∞╣nΘ pouze kdy╛ vlastnφk indexu je souΦasn² u╛ivatel.
Tabulka m∙╛e b²t otev°ena v re╛imu EXCLUSIVE nebo SHARED. Kdy╛ tabulka je otev°ena ve v²luΦnΘm re╛imu, pak dal╣φ u╛ivatelΘ nemohou p°istupovat k tabulce. Kdy╛ tabulka je otev°ena v re╛imu sdφlenφ, pak k tabulce mohou p°istupovat ve stejnΘ dob∞ i ostatnφ u╛ivatelΘ.
Je doporuΦovßn re╛im p°ekladu xltFIELD. Tento re╛im zaji╣╗uje, ╛e BDE automaticky p°eklßdß data z p°irozenΘho fyzickΘho datovΘho formßtu databßze na spoleΦn² logick² formßt BDE, kdy╛ jsou Φteny zßznamy. BDE p°eklßdß data zp∞t do p°irozenΘho formßtu, kdy╛ polo╛ky jsou zapisovßny. Kdy╛ je urΦen p°ekladov² re╛im xltNONE, pak p°eklady nejsou p°i Φtenφ a zßpisu zßznam∙ provßd∞ny.
P°eklad dat nastßvß pouze v pr∙b∞hu volßnφ DbiGetField a DbiPutField; a ne p°i Φtenφ zßznam∙.
┌sp∞╣nΘ volßnφ DbiOpenTable vracφ madlo kurzoru aplikaci. D°φve ne╛ m∙╛eme pou╛φt madlo kurzoru pro p°φstup k dat∙m v tabulce, aplikace musφ p°ipravit vyrovnßvacφ pam∞╗ zßznamu. Tato p°φprava zahrnuje alokaci pam∞ti pro zßznam a v n∞kter²ch p°φpadech jejφ inicializaci.
Aplikace m∙╛e takΘ nastavit pole do kterΘho budou pro ka╛dou polo╛ku z tabulky vlo╛eny deskriptory polo╛ek. K urΦenφ po╛adovanΘ velikosti vyrovnßvacφ pam∞ti zßznam∙ a pole deskriptor∙ polo╛ek aplikace volß DbiGetCursorProps. Toto volßnφ obvykle nßsleduje bezprost°edn∞ po volßnφ DbiOpenTable a vracφ po╛adovanΘ informace ve struktu°e CURProps.
Nßsledujφcφ k≤d zφskßvß vlastnosti kurzoru, alokuje vyrovnßvacφ pam∞╗ zßznamu, nastavuje pole pro deskriptory polo╛ek a zφskßvß deskriptory polo╛ek:
DBIResult   rslt;
pCHAR       pRecBuf;
CURProps    curProps;
pFLDDesc    pFldArray;
...
// Zφskßnφ vlastnostφ tabulky
rslt = DbiGetCursorProps(hCursor, &curProps);
if (rslt == DBIERR_NONE)
{
  // Alokace vyrovnßvacφ pam∞ti zßznamu
  pRecBuf = malloc(curProps.iRecBufSize);
  // Testovßnφ v²sledku alokace
  ...
  // Zφskßnφ pole deskriptor∙ polo╛ek
  pFldArray=(pFLDDesc)malloc(sizeof(FLDDesc)*curProps.iFields);
  // Testovßnφ v²sledk∙ alokace
  ...
  rslt = DbiGetFieldDescs(hCursor, pFldArray);
  ...
  free(pFldArray);
  free(pRecBuf);
}
Kdy╛ aplikace volß DbiGetCursorProps, pak je vrßcena struktura vlastnostφ kurzoru CURProps s informacemi popisujφcφmi nejΦast∞ji pou╛φvanΘ vlastnosti kurzoru. CURProps obsahuje nßsledujφcφ polo╛ky:
 
Typ JmΘno Popis
DBITBLNAME szName JmΘno tabulky 
UINT16 iFNameSize Plnß velikost jmΘna souboru
DBINAME szTableType Typ tabulky
UINT16 iFields PoΦet polo╛ek v tabulce
UINT16 iRecSize Velikost zßznamu (logick² zßznam)
UINT16 iRecBufSize Velikost zßznamu (fyzick² zßznam)
UINT16 iKeySize Velikost klφΦe
UINT16 iIndexes PoΦet souΦasn∞ dostupn²ch index∙
UINT16 iValChecks PoΦet test∙ p°φpustnosti
UINT16 iRefIntChecks PoΦet omezenφ referenΦnφ integrity
UINT16 iBookMarkSize Velikost zßlo╛ky
BOOL bBookMarkStable true, pokud kurzor podporuje trvalΘ zßlo╛ky
DBIOpenMode eOpenMode dbiREADWRITE, dbiREADONLY
DBIShareMode eShareMode dbiOPENSHARED, dbiOPENEXCL
BOOL bIndexed true, pokud index je aktivnφ
INT16 iSeqNums 1: mß sekvenΦnφ Φφsla (Paradox), 0: mß Φφsla zßznam∙ (dBASE, FoxPro), <0 (-1,-2,...): nic (SQL a Access).
BOOL bSoftDeletes true, pokud kurzor podporuje m∞kkΘ ru╣enφ (pouze dBASE a FoxPro)
BOOL bDeletedOn true, pokud zru╣enΘ zßznamy jsou viditelnΘ
UINT16 iRefRange Pokud > 0, pak mß aktivnφ obnovenφ
XLTMode exltMode P°ekladov² re╛im: xltNONE (fyzickΘ typy), xltFIELD (logickΘ typy)
UINT16 iRestrVersion ╚φslo verze
BOOL bUniDirectional true, pokud kurzor je jednosm∞rn² (pouze SQL)
PRVType eprvRights Tabulkovß ·rove≥ prßv
UINT16 iFmlRights Rodinnß prßva (pouze Paradox)
UINT16 iPasswords PoΦet pomocn²ch hesel (pouze Paradox)
UINT16 iCodePage K≤dovß strßnka (0 pokud nenφ znßma)
BOOL bProtected true, pokud tabulka je chrßn∞na heslem
UINT16 iTblLevel Na ovladaΦi zßvislß tabulkovß ·rove≥
DBINAME szLangDriver SymbolickΘ jmΘno jazykovΘho ovladaΦe
BOOL bFieldMap true, pokud mapovßnφ polo╛ek je aktivnφ
UINT16 iBlockSize Velikost datovΘho bloku ve slabikßch (je-li)
BOOL bStrictRefInt true, pokud se vy╛aduje p°esnß referenΦnφ integrita
UINT16 iFilters PoΦet filtr∙
BOOL bTempTable true, pokud tabulka je doΦasnß

Kdy╛ alokujeme pam∞╗, pak jsou v²znamnΘ nßsledujφcφ prvky:

Pokud mß b²t vlo╛en nov² zßznam, pak inicializujeme vyrovnßvacφ pam∞╗ zßznamu volßnφm DbiInitRecord. Tato funkce inicializuje ka╛dou polo╛ku ve vyrovnßvacφ pam∞ti zßznamu, vΦetn∞ polo╛ek BLOB, na prßzdnΘ hodnoty zalo╛enΘ na definovan²ch datov²ch typech. Pro tabulky Paradoxu, implicitnφ hodnoty jsou pou╛ity k inicializaci polo╛ek, pokud v tabulce jsou specifikovßny implicitnφ hodnoty.
Po alokovßnφ pam∞ti pro pole deskriptor∙ polo╛ek, m∙╛e aplikace zφskat deskriptory polo╛ek volßnφm DbiGetFieldDescs. Deskriptory polo╛ek poskytujφ informace, kterΘ jsou pot°ebnΘ k adresovßnφ a manipulaci s polo╛kami ve vyrovnßvacφ pam∞ti zßznam∙. DbiGetFieldDescs vracφ pole struktur FLDDesc, s informacemi popisujφcφmi ka╛dou polo╛ku v tabulce:
 
Typ JmΘno Popis
UINT16 iFldNum ╚φslo polo╛ky (1 a╛ n)
DBINAME szName Specifikuje jmΘno polo╛ky.
UINT16 iFldType Specifikuje typ polo╛ky. V zßvislosti na p°ekladovΘm re╛imu kurzoru je vracen fyzick² nebo logick² typ polo╛ky. 
UINT16 iSubType Specifikuje podtyp polo╛ky. To m∙╛e b²t logick² podtyp BDE nebo fyzick² podtyp ovladaΦe v zßvislosti na p°ekladovΘm re╛imu.
UINT16 iUnits1 Specifikuje poΦet znak∙, Φφslic apod. Pro logickΘ typy polo╛ek, toto Φφslo je konzistentnφ p°es ovladaΦe. Pro fyzickΘ typy polo╛ek, interpretace zßvisφ na ovladaΦi. Pro v∞t╣inu ovladaΦ∙ iUnits1 je p°esnost a iUnits2 je m∞°φtko.
UINT16 iUnits2 Specifikuje poΦet desetinn²ch mφst, apod. Viz specifikace pro iUnits1.
UINT16 iOffset Specifikuje ofset tΘto polo╛ky ve vyrovnßvacφ pam∞ti zßznamu. Zßvisφ na p°ekladovΘm re╛imu.
UINT16 iLen Specifikuje dΘlku tΘto polo╛ky. Zßvisφ na p°ekladovΘm re╛imu.
UINT16 iNullOffset Specifikuje ofset indikßtoru NULL pro tuto polo╛ku ve vyrovnßvacφ pam∞ti zßznamu. P°i nule nenφ indikßtor NULL.
FLDVchk efldvVchk Specifikuje zda k polo╛ce je p°i°azen test p°φpustnosti.
FLDRights efldrRights Specifikuje p°φstupovß prßva pro polo╛ku.
iFldNum Specifikuje ID polo╛ky zßvisejφcφ na ovladaΦi. Pro v∞t╣inu ovladaΦ∙ je to hodnota od 1 do curProps.iFields, mimo tabulek Paradoxu.

Pro konzistentnost nad ovladaΦi, pou╛φvßme po°adφ polo╛ky v poli deskriptor∙. DbiGetField a DbiPutField pou╛φvajφ po°adovß Φφsla od 1 do n.

Umis╗ovßnφ kurzoru a zφskßvßnφ zßznam∙
Po p°ipravenφ vyrovnßvacφ pam∞ti zßznam∙, aplikace ji m∙╛e vyu╛φt k zφskßvßnφ zßznam∙ z tabulky. K zφskßnφ zßznamu, aplikace musφ umφstit kurzor na zßznam, kter² chce zφskat. N∞kterΘ funkce BDE slou╛φ pouze k umis╗ovßnφ kurzoru. Volßnφ t∞chto funkcφ m∙╛e nßsledovat volßnφ funkce, kterß zφskß zßznam do vyrovnßvacφ pam∞ti. Dal╣φ funkce BDE mohou souΦasn∞ p°emis╗ovat kurzor a zφskßvat zßznamy.
N∞kterΘ funkce BDE umis╗ujφ kurzor p°ed zßznam, na zaΦßtek (nebo konec) souboru nebo v²sledkovΘ mno╛iny. Kdy╛ kurzor je umφst∞n na n∞kterou z t∞chto pozicφ, namφsto na zßznam, pak °φkßme, ╛e kurzor je umφst∞n na mezeru. Nßsledujφcφ volßnφ umis╗ujφ kurzor na mezeru: Umis╗ovßnφ kurzoru na mezeru m∙╛e zjednodu╣it programovßnφ. Nap°. volßnφm DbiSetToBegin umφstφme kurzor na mezeru p°ed prvnφ zßznam v tabulce. Pak m∙╛eme v cyklu zpracovat v╣echny zßznamy v tabulce volßnφm DbiGetNextRecord.
N∞kterΘ funkce BDE umis╗ujφ kurzor p°φmo na zßznam. Pokud je poskytnuta vyrovnßvacφ pam∞╗ zßznamu, pak tyto funkce mohou b²t takΘ pou╛ity k zφskßvßnφ zßznam∙ pro zpracovßnφ aplikacφ. Mnoho t∞chto volßnφ m∙╛e voliteln∞ uzamknout zßznam. Zßznamy z∙stßvajφ uzamΦeny dokud nejsou explicitn∞ uvoln∞ny nebo dokud nenφ uzav°eno sezenφ. Nßsledujφcφ p°φklad ukazuje jak umφstit kurzor na zaΦßtek souboru a prochßzet tabulkou:
// Umφst∞nφ kurzoru na zaΦßtek souboru
DbiSetToBegin(hCursor);
// Prochßzenφ tabulkou. P°i ka╛dΘm pr∙chodu Φtenφ zßznamu.
while (DbiGetNextRecord(hCursor, dbiNOLOCK, pRecBuf, NULL)
       == DBIERR_NONE)
{
  ...
}
Zßlo╛ky poskytujφ mo╛nost ulo╛it pozici kurzoru a mφt mo╛nost se pozd∞ji vrßtit na stejnΘ mφsto. Zßlo╛ky jsou zapsßny do vyrovnßvacφ pam∞ti, kterß je alokovßna klientem. Velikost vyrovnßvacφ pam∞ti zßlo╛ek se m∙╛e zm∞nit po volßnφ DbiSwitchToIndex. Aplikace m∙╛e zφskßvat vφce zßznam∙ jednφm volßnφm p°i nastavenφ velikosti vyrovnßvacφ pam∞ti pro n∞kolik zßznam∙ a volßnφm DbiReadBlok. Je zφskßm specifikovan² poΦet zßznam∙ poΦφnaje nßsledujφcφm zßznamem za souΦasnou pozicφ kurzoru. Tato funkce je ekvivalentnφ cyklu, kter² provßdφ volßnφ DbiGetNextRecord.
N∞kolik funkcφ BDE umo╛≥uje vnutit kurzoru nßvrat pouze omezenΘ mno╛iny zßznam∙ nebo polo╛ek aplikaci; tj. aplikace vidφ pouze ty zßznamy v tabulce, kterΘ spl≥ujφ p°eddefinovanou mno╛inu podmφnek. Dotazy poskytujφ dal╣φ zp∙sob nßvratu omezenΘ mno╛iny zßznam∙.
DbiSetRange pou╛ijeme k donucenφ kurzoru aby vracel aplikaci pouze ty zßznamy jejich╛ klφΦ je v definovanΘm  rozsahu. Tato funkce m∙╛e b²t volßna pouze pokud kurzor mß aktivnφ index. Mohou b²t definovßny zahrnujφcφ a vyluΦujφcφ rozsahy. Nßsledujφcφ volßnφ BDE pak zφskßvß mno╛inu zßznam∙ v rozsahu, jako kompletnφ tabulku. Nap°. DbiSetToBegin umφstφ kurzor na mezeru p°ed prvnφm zßznamem v rozsahu mφsto p°ed prvnφ zßznam v tabulce.
Tato funkce je Φasto pou╛φvßna k nalezenφ mno╛iny zßznam∙ mezi dv∞mi hodnotami klφΦ∙ nastavenφm dolnφ a hornφ meze rozsahu. M∙╛e b²t takΘ specifikovßn otev°en² rozsah, od zaΦßtku souboru do specifikovanΘho klφΦe nebo od specifikovanΘho klφΦe do konce souboru.
DbiSetFieldMap pou╛ijeme k donucenφ kurzoru aby vracel polo╛ky v jinΘm po°adφ ne╛ jsou uvedeny v tabulce nebo k vypu╣t∞nφ polo╛ek ze zobracenφ. K nastavenφ mapy polo╛ek, v²vojß° aplikace vytvo°φ pole deskriptor∙ polo╛ek, do kterΘho vlo╛φ pouze ty polo╛ky, kterΘ majφ b²t viditelnΘ kurzorem a v po°adφ ve kterΘm majφ b²t vrßceny. Pouze polo╛ky uvedenΘ v poli jsou viditelnΘ. Vytvo°enφm mapy polo╛ek m∙╛eme zm∞nit velikost zßznamovΘ vyrovnßvacφ pam∞ti.
Aktivnφ filtr vnucuje kurzoru nßvrat omezenΘ mno╛iny zßznam∙ (pouze t∞ch, kterΘ spl≥ujφ podmφnku filtru). Zßznamy nespl≥ujφcφ podmφnku filtru jsou p°eskoΦeny i kdy╛ v tabulce stßle z∙stßvajφ (nejsou pouze viditelnΘ kurzorem). Po deaktivaci filtru jsou viditelnΘ op∞t v╣echny zßznamy.
Podmφnky filtr∙ jsou definovßny tak, aby vracely true nebo false. Kdy╛ filtr je aktivovßn, pak v²raz filtru je aplikovßn na v╣echny zßznamy v tabulce. ViditelnΘ jsou pouze ty, pro kterΘ je vrßceno true. Na jednu tabulku m∙╛e b²t definovßno vφce filtr∙.
Pro definici filtru aplikace volß DbiAddFilter, p°edßvß existujφcφ madlo kurzoru a ukazatel na strukturu CANExpr, kterß obsahuje v²raz. Struktura CANExpr m∙╛e obsahovat operßtory porovnßvßnφ, AND, OT a NOT a testy na prßzdnΘ polo╛ky. R∙znΘ ovladaΦe mohou obsahovat r∙znΘ typy v²raz∙, ale v╣echny podporujφ zßkladnφ kombinaci: <polo╛ka><porovnßvacφ operßtor><konstanta>; nap°. "field1 = 'CA' and field2 < 30". Po dokonΦenφ DbiAddFilter je aplikaci vrßceno madlo filtru.
Po definovßnφ podmφnky filtru musφ b²t filtr aktivovßn DbiActivateFilter aby se projevil. M∙╛e b²t aktivovßno vφce filtr∙. Filtry mohou b²t zapφnßny a vypφnßny podle pot°eby (pomocφ DbiActivateFilter a DbiDeactivateFilter). Filtry jsou automaticky zru╣eny p°i uzav°enφ kurzoru a mohou b²t zru╣eny explicitn∞ volßnφm DbiDropFilter.
P°φstup na ·rovni polo╛ek
Aplikace obvykle zp°φstup≥uje data v zßznamu na ·rovni polo╛ek. Funkce BDE DbiGetField a DbiPutField umo╛≥ujφ aplikaci zφskßvat a aktualizovat data v polo╛kßch ve vyrovnßvacφ pam∞ti zßznamu. Tyto funkce umo╛≥ujφ p°istupovat k polo╛kßm bez nutnosti znßt strukturu vyrovnßvacφ pam∞ti zßznamu.
Pro zφskßnφ polo╛ky z vyrovnßvacφ pam∞ti zßznamu, aplikace volß funkci DbiGetField, p°edß po°adovΘ Φφslo polo╛ky a vyrovnßvacφ pam∞╗ k ulo╛enφ dat obsa╛en²ch v polo╛ce (polo╛ky jsou Φφslovßny od 1). Voliteln∞ m∙╛e b²t vrßcena logickß hodnota indikujφcφ prßzdnou polo╛ku.
K aktualizaci polo╛ky ve vyrovnßvacφ pam∞ti zßznam∙, aplikace volß DbiPutField, p°edß po°adovΘ Φφslo polo╛ky a vyrovnßvacφ pam∞╗ obsahujφcφ obsah polo╛ky zapisovan² do zßznamu. DbiPutField m∙╛e b²t takΘ pou╛ita k vyprßzdn∞nφ polo╛ky, p°edßnφm ukazatele NULL jako parametru vyrovnßvacφ pam∞ti polo╛ky.
Kdy╛ p°ekladov² re╛im polo╛ek je aktivnφ (xltFIELD), pak BDE automaticky p°eklßdß obsah dat polo╛ek. Kdy╛ polo╛ka je zφskßvßna, pak BDE p°elo╛φ data ve vyrovnßvacφ pam∞ti zßznamu z p°irozenΘho typu dat na obecnΘ logickΘ datovΘ typy. P°i zp∞tnΘm zßpisu polo╛ek do vyrovnßvacφ pam∞ti zßznamu je proveden zp∞tn² p°eklad na p°irozenΘ fyzickΘ datovΘ typy.
Pokud p°ekladov² re╛im polo╛ek nenφ uplatn∞n, pak BDE neprovßdφ p°eklad na logickΘ datovΘ typy. Aplikace potom musφ b²t p°ipravena akceptovat data v p°irozen²ch datov²ch typech.
 
Typ BDE Ekvivalent C Popis
fldZSTRING char[ ] Nulou ukonΦenΘ pole znak∙.
fldUINT16 unsigned int 16 bitovΘ celΘ Φφslo bez znamΘnka.
fldINT16 int 16 bitovΘ celΘ Φφslo.
fldUINT32 unsigned long  32 bitovΘ celΘ Φφslo bez znamΘnka.
fldINT32 long 32 bitovΘ celΘ Φφslo.
fldFLOAT double 64 bitovΘ Φφslo v pohyblivΘ °ßdovΘ Φßrce.
fldFLOATIEEE long double  80 bitovΘ Φφslo v pohyblivΘ °ßdovΘ Φßrce.
fldBOOL int 16 bitovß hodnota, true =1; false = 0.
fldBYTES unsigned char[ ]  Pole slabik pevnΘ dΘlky.
fldVARBYTES unsigned char[ ] DΘlkou p°edchßzenΘ pole slabik.

Prßce s BLOB

Proto╛e velikost polo╛ek BLOB m∙╛e b²t znaΦn∞ velkß, BDE s nimi pracuje jinak ne╛ s ostatnφmi polo╛kami; jsou chßpßny jako proudy slabik. Pro prßci s polo╛kami BLOB se pou╛φvajφ nßsledujφcφ funkce BDE: DbiOpenBlob, DbiGetBlob, DbiGetBlobHeading, DbiGetBlobSize, DbiFreeBlob, DbiPutBlob a DbiTruncateBlob.
Pro zßpis do nebo Φtenφ z BLOB je nutno nejprve BLOB otev°φt. Pro otev°enφ BLOB, vyrovnßvacφ pam∞╗ zßznamu musφ obsahovat kopii modifikovanΘho zßznamu nebo vklßdanΘho zßznamu (pokud zßznam bude vklßdßn). Aplikace volß DbiOpenBlob, p°edß madlo kurzoru, ukazatel na vyrovnßvacφ pam∞╗ zßznamu, Φφslo polo╛ky BLOB a p°φstupovß prßva (pokud BLOB je otevφrßn pro Φtenφ i zßpis, pak tabulka musφ b²t otev°ena takΘ pro Φtenφ i zßpis). DbiOpenBlob uklßdß madlo BLOB ve vyrovnßvacφ pam∞ti zßznamu. DbiOpenBlob musφ b²t volßna d°φve ne╛ m∙╛eme volat ostatnφ funkce BLOB.
DbiGetBlob zφskßvß data BLOB ze specifikovanΘho BLOB. M∙╛e b²t zφskßna pouze Φßst dat, poΦφnaje od pozice specifikovanΘ v iOffSet a dΘlce v poΦtu slabik specifikovanΘ v iLen. Aplikace obvykle neznß dΘlku BLOB a tedy provßdφ °adu volßnφ DbiGetBlob k zφskßnφ celΘho BLOB. DbiGetBlob vracφ poΦet skuteΦn∞ p°eΦten²ch slabik a porovnßnφm tΘto hodnoty s po╛adovan²m poΦtem Φten²ch slabik lze zjistit konec BLOB. Aplikace m∙╛e p°φpadn∞ zjistit velikost BLOB p°edem volßnφm DbiGetBlobSize a potom specifikovat aktußlnφ dΘlku ve volßnφ DbiGetBlob (v tomto p°φpad∞ cel² BLOB zφskßme jednφm volßnφm DbiGetBlob).
DbiPutBlob je pou╛φvßn k zßpisu dat do BLOB. BLOB musφ b²t otev°en v re╛imu Φtenφ i zßpis. Aplikace p°edßvß ukazatel na blok dat, kterß majφ b²t zapsßna. Aplikace specifikuje dΘlku zapisovan²ch dat a takΘ ofset v BLOB od kterΘho zaΦneme zapisovat data. Aplikace m∙╛e pou╛φt °adu volßnφ DbiPutBlob k zßpisu celΘho BLOB.
K aktualizaci nebo p°idßvßnφ zßznamu, aplikace provede tyto kroky:
  1. Volß DbiAppendRecord nebo DbiInsertRecord pro p°idßnφ novΘho zßznamu s BLOB k tabulce nebo aplikace volß DbiModifyRecord k modifikaci existujφcφho zßznamu obsahujφcφho BLOB. Ukazatel na vyrovnßvacφ pam∞╗ zßznamu obsahujφcφ nov² zßznam je p°edßn funkci.
  2. Volß DbiFreeBlob k uzav°enφ madla BLOB a v╣ech zdroj∙ alokovan²ch pomocφ DbiOpenBlob (DbiModifyRecord, DbiInsertRecord nebo DbiAppendRecord neuvol≥ujφ automaticky zdroje BLOB po modifikaci zßznamu). Pokud DbiFreeBlob volßme p°ed DbiModifyRecord, DbiInsertRecord nebo DbiAppendRecord, pak zm∞ny jsou ztraceny.
Pro tabulky obsahujφcφ BLOB nesmφme pou╛φvat DbiWriteBlock.
Nßsledujφcφ p°φklad ukazuje zpracovßnφ BLOB:
DBIResult   rslt;
pCHAR       blobBuf;
UINT32      blobSize, bytesRead;
// Φtenφ souΦasnΘho zßznamu
DbiGetRecord(hCursor, dbiNOLOCK, pRecBuf, NULL);
// otev°enφ BLOB
rslt = DbiOpenBlob(hCursor, pRecBuf, 3, dbiREADWRITE);
if (rslt == DBIERR_NONE)
{
  // Zφskßnφ velikosti BLOB a jeho p°eΦtenφ.
  // Zde p°edpoklßdßme,BLOB je men╣φ ne╛ 64K.
  DbiGetBlobSize(hCursor, pRecBuf, 3, &blobSize);
  blobBuf = malloc(blobSize);
  DbiGetBlob(hCursor, pRecBuf, 3, 0, blobSize,
             (pBYTE) blobBuf, &bytesRead);
  ...
  // Uvoln∞nφ BLOB
  DbiFreeBlob(hCursor, pRecBuf, 3);
  // Uklid
  free(blobBuf);
}
P°idßvßnφ, aktualizace a ru╣enφ zßznam∙
Pro p°idßvßnφ, aktualizaci a ru╣enφ zßznam∙, musφ mφt kurzor zßpisov² p°φstup k tabulce. Tabulka nebo zßznam nesmφ b²t uzav°en jin²m u╛ivatelem. Pokud aplikace modifikuje zßznam, pak jej m∙╛e p°i jeho zφskßnφ uzamknout. Zßznam z∙stßvß uzamΦen, pokud jej aplikace explicitn∞ neuvolnφ nebo dokud sezenφ nenφ uzav°eno. M∙╛eme takΘ pou╛φt odlo╛enΘ aktualizace bez p°φmΘho zßpisu do databßze. To minimalizuje mno╛stvφ uzamΦen²ch zdroj∙.
Pro p°idßnφ novΘho zßznamu k tabulce, aplikace provßdφ nßsledujφcφ kroky:
  1. Inicializuje klientem alokovanou vyrovnßvacφ pam∞╗ zßznam∙ volßnφm DbiInitRecord.
  2. Vytvß°enφ polo╛ek zßznam∙ po jednΘ pou╛itφm DbiPutField.
  3. Volßme DbiAppendRecord nebo DbiInsertRecord k zßpisu obsahu vyrovnßvacφ pam∞ti do tabulky. Aplikace specifikuje zda na vlo╛enΘm zßznamu mß b²t dr╛en zßmek (DbiInsertRecord).
K modifikaci existujφcφho zßznamu v tabulce, aplikace provßdφ tyto kroky:
  1. Zφskßme modifikovan² zßznam do klientem alokovanΘ vyrovnßvacφ pam∞ti (zφskan² zßznam m∙╛eme uzamkount).
  2. Zapφ╣eme aktualizovanΘ polo╛ky do vyrovnßvacφ pam∞ti zßznam∙ pomocφ DbiPutField.
  3. Volßme DbiModifyRecord k zßpisu vyrovnßvacφ pam∞ti zßznamu do tabulky. Aplikace specifikuje zda uvolnφ zßmek po dokonΦenφ aktualizace zßznamu.
Pro zru╣enφ zßznamu aplikace provßdφ kroky:
  1. Umφstφ kurzor na ru╣en² zßznam.
  2. Volß DbiDeleteRecord. Pokud zßznam je umφst∞n ve vyrovnßvacφ pam∞ti, pak je zru╣en i zde.
  3. Kurzor je p°emφst∞n na meze°e po zru╣enΘm zßznamu.
Nßsleduje n∞kolik poznßmek:
Spojovßnφ tabulek
SpojovanΘ kurzory umo╛≥ujφ vytvo°it vzßjemn² vztah master - detail mezi tabulkami. Kurzory na dvou tabulkßch mohou b²t spojeny, pokud tabulky sdφlejφ spoleΦnou polo╛ku, kterß v tabulce detail musφ b²t indexovßna. Spojenφm kurzoru na tabulce master a tabulce detail zajistφ, ╛e pro kurzor na tabulce detail jsou viditelnΘ pouze ty zßznamy jejich╛ hodnota klφΦe se shoduje s hodnotou klφΦe v souΦasnΘm zßznamu tabulky master.
Nap°. tabulka CUSTOMER (master) a tabulka ORDERS (detail) sdφlφ spoleΦnou polo╛ku nazvanou CUSTOMER_NO. Pokud souΦasn² zßznam v tabulce master mß hodnotu CUSTOMER_NO rovnou 1221, pak v tabulce detail jsou viditelnΘ pouze ty zßznamy u nich╛ CUSTOMER_NO je rovno 1221.
Tabulka master m∙╛e b²t spojena s vφce ne╛ jednou tabulkou detail, ale tabulka detail m∙╛e b²t spojena pouze s jednou tabulkou master. Tabulka detail m∙╛e b²t takΘ tabulkou master spojenou na dal╣φ tabulky detail. Spojovßnφ je aplikovatelnΘ na v╣echny dostupnΘ typy ovladaΦ∙ a m∙╛e b²t z°φzeno mezi tabulkami stejn²ch nebo rozdφln²ch typ∙.
Pro spojenφ dvou tabulek aplikace provede tyto kroky:
  1. Aplikace otev°e kurzory na obou tabulkßch. Kurzor tabulky detail musφ mφt aktivnφ index na polo╛ce, kterß bude pou╛ita ke spojenφ kurzor∙.
  2. Aplikace volß DbiBeginLinkMode pro ka╛d² spojovan² kurzor. Funkce vracφ nov² kurzor.
  3. Aplikace volß DbiLinkDetail a p°edßvß madla kurzor∙ tabulek master a detail. DatovΘ typy spojovan²ch polo╛ek v zßznamech master a detail se musφ shodovat. Tuto funkci nelze pou╛φt pro v²razovΘ indexy (pro v²razovΘ indexy tabulek dBASE nebo FoxPro musφme pou╛φt DbiLinkDetailToExp).
  4. Dva kurzory jsou nynφ spojeny. Kdy╛ p°emis╗ujeme kurzor master, pak odpovφdajφcφ kurzor detail se m∞nφ k zobrazenφ aplikovateln²ch zßznam∙.
K p°eru╣enφ spojenφ mezi kurzory, aplikace provßdφ:
  1. Aplikace volß DbiUnLinkDetail a p°edßvß madlo kurzoru tabulky detail. Tabulka detail je nynφ odpojena od tablky master a jejφ kurzor zobrazuje cel² rozsah zßznam∙.
  2. Aplikace volß DbiEndLinkMode pro ka╛d² spojovan² kurzor a p°edßvß madlo kurzoru. Je vrßceno standardnφ madlo kurzoru.
╪azenφ tabulek
╪adφcφ funkce BDE DbiSortTable °adφ otev°enΘ nebo uzav°enΘ tabulky a to jak na sob∞ nebo v cφlovΘ tabulce. Jsou volby k odstra≥ovßnφ duplicit, k umo╛n∞nφ °azenφ s rozli╣enφm velikosti pφsmen, k °azenφ podmno╛iny polo╛ek a k poskytnutφ specißlnφ u╛ivatelem definovanΘ °adφcφ funkce. DbiSortTable je takΘ podporovßna ovladaΦi SQL, ale tabulky SQL mohou slou╛it pouze jako zdrojovΘ tabulky a ne jako cφlovΘ. K urΦenφ °adφcφho po°adφ je pou╛it jazykov² ovladaΦ.
Odlo╛enΘ aktualizace
Odlo╛enΘ aktualizace umo╛≥ujφ u╛ivateli zφskßvat data z databßze a provßd∞t zm∞ny, kterΘ jsou uklßdßny a to bez p°φmΘho zßpisu do databßze. U╛ivatel m∙╛e provßd∞t zm∞ny v del╣φm ΦasovΘm intervalu s minimßlnφm uzamykanφm zdroj∙ v aktußlnφ databßzi. Po modifikaci dat, u╛ivatel volß aktualizaΦnφ funkci k ulo╛enφ zm∞n do aktußlnφ databßze. AktualizaΦnφ funkce zasφlß do databßze dßvku v╣ech vklßdßnφ, ru╣enφ a modifikacφ proveden²ch do volßnφ aktualizaΦnφ funkce.
Vrstva odlo╛en²ch aktualizacφ udr╛uje v╣echny zm∞ny, kterΘ jsou provedeny pou╛itφm kombinacφ r∙zn²ch metod tabulky, jako je vklßdßnφ zßznam∙, modifikace zßznam∙ a ru╣enφ zßznam∙. Jak prochßzφme tabulkou, vrstva odlo╛en²ch aktualizacφ zaji╣╗uje, ╛e vidφme modifikovanΘ, zru╣enΘ a vlo╛enΘ zßznamy. Aktualizace ale nejsou bezprost°edn∞ zasφlßny do p°ipojenΘ tabulky, jsou odlo╛eny vrstvou odlo╛en²ch aktualizacφ. «ßdnΘ zßznamovΘ zßmky nejsou dr╛eny dokud odlo╛enΘ aktualizace nejsou trvale zapsßny. Potom zßmky jsou dr╛eny pouze v pr∙b∞hu trvalΘho zßpisu.
Proto╛e zßznamovΘ zßmky nejsou dr╛eny p°ed operacφ trvalΘho zßpisu, riskujeme, ╛e n∞kterΘ zßznamy mohly b²t zm∞n∞ny ostatnφmi u╛ivateli. Pokud zßznam modifikovan² vrstvou odlo╛en²ch aktualizacφ je modifikovßn ostatnφmi u╛ivateli p°ed trval²m zßpisem odlo╛en²ch aktualizacφ, pak je vrßcena chyba, indikujφcφ, ╛e zßznam byl modifikovßn jin²m u╛ivatelem.
Pro tabulky standardnφch databßzφ, ka╛dß ne-BLOB polo╛ka m∙╛e b²t pou╛ita k provßd∞nφ modifikace zßznamu. Po provedenφ po╛adovan²ch zm∞n, klient volß DbiApplyDelayedUpdates pro trval² zßpis nebo zm∞ny zru╣φ. Operace ru╣enφ rychle zru╣φ aktualizaΦnφ informace v cache.
Pokud se u╛ivatel rozhodne trvale zapsat zm∞ny, pak aktualizace jsou aplikovßny na databßzi. P°i aplikovßnφ aktualizacφ je provßd∞no testovßnφ p°φpustnosti referenΦnφ integrity a dat. Mechanismus zp∞tnΘho volßnφ informuje u╛ivatele o poru╣enφ integrity dat. Tento mechanismus m∙╛e p°eskoΦit jistΘ chybnΘ aktualizace nebo zru╣it celou operaci trvalΘho zßpisu.
Vrstva odlo╛en²ch aktualizacφ pracuje v pr∙b∞hu Φasu na jednou kurzoru. Pokud klienty cht∞jφ podporovat odlo╛enΘ aktualizace ve form∞ operacφ na vφce ne╛ jednom kurzoru, pak klient zodpovφdß za synchronizaci odlo╛en²ch aktualizacφ na r∙zn²ch kurzorech. N∞kterß volßnφ BDE, kterΘ provßd∞jφ operace na tabulkßch nejsou podporovßny vrstvou odlo╛en²ch aktualizacφ, vΦetn∞ volßnφ BDE °adφcφch data, jako je DbiSwitchToIndex. To m∙╛e b²t provedeno p°ed zadßvßnφm odlo╛en²ch aktualizacφ. Vrstva odlo╛en²ch aktualizacφ zßvisφ na zßlo╛kßch k dr╛enφ stopy k modifikovan²m zßznam∙m. Proto╛e zßlo╛ky se m∞nφ volßnφm DbiSwitchToIndex, jsou tato volßnφ BDE zakßzßna.
Pou╛φvßnφ re╛imu odlo╛en²ch aktualizacφ je dvoufßzov² proces. V prvnφ fßzi p°φkaz dbiDelayedUpdPrepare se pokusφ aplikovat v╣echny zm∞ny na p°ipojenß data. Pokud jej pou╛ijeme v jednou╛ivatelskΘm prost°edφ, pak tento p°φkaz je v╛dy pou╛it v kontextu transakce k zotavenφ chyb v pr∙b∞hu aktualizace. V╣echny chyby vzniklΘ v pr∙b∞hu tΘto fßze jsou zpracovßny prost°ednictvφm funkcφ zp∞tnΘho volßnφ.
P°φkaz dbiDelayedUpdateCommit provßdφ druhou fßzi. Po ·sp∞╣nΘm volßnφ dbiDelayedUpdPrepare p°φmo nßsleduje p°φkaz dbiDelayedUpdateCommit. Internφ cache zohled≥uje fakt, ╛e aktualizace byly ·sp∞╣n∞ aplikovßny na p°ipojenou databßzi (·sp∞╣n∞ aplikovanΘ zßznamy jsou odstran∞ny z cache).
K vytvo°enφ re╛imu odlo╛en²ch aktualizacφ:
  1. Vytvo°φme vrstvu odlo╛an²ch aktualizacφ volßnφm DbiBeginDelayedUpdates

  2. DBIResult DBIFN EXPORT DbiBeginDelayedUpdates(phDBICur phDbiCur);
    Velikost vyrovnßvacφ pam∞ti zßznam∙ se m∙╛e v re╛imu odlo╛en²ch aktualizacφ zm∞nit. Je vhodnΘ realokovat vyrovnßvacφ pam∞ti zßznam∙ po instalaci vrstvy odlo╛en²ch aktualizacφ.
  3. Aplikovßnφ zm∞n proveden²ch na odlo╛enΘ aktualizace provedeme volßnφm DbiApplyDelayedUpdates

  4. DBIResult DBIFN EXPORT DbiApplyDelayedUpdates (hDBICur
              hDbiCur, DBIDelayedUpdCmd eUpdCmd);
    typedef enum
    {
       dbiDelayedUpdCommit = 0,
       dbiDelayedUpdCancel = 1
       dbiDelayedUpdCancelCurrent = 2
       dbiDelayedUpdPrepare = 3
    } DBIDelayedUpdCmd;
    Kdy╛ pou╛ijeme na vlo╛enΘ, zru╣enΘ nebo modifikovanΘ zßznamy, p°φkaz dbiDelayedUpdCancelCurrent nastavuje souΦasn² zßznam na jeho p∙vodnφ stav.
  5. Po aplikovßnφ zm∞n na databßzi, u╛ivatel m∙╛e odstranit provedenΘ zm∞ny z databßze. Nemßme ukonΦen re╛im odlo╛en²ch aktualizacφ. Po dokonΦenφ dal╣φ dßvky modifikacφ, m∙╛e b²t volßno DbiApplyDelayedUpdates k aplikovßnφ t∞chto zm∞n na databßzi nebo provedenφ ROLLBACK.
  6. UkonΦφme re╛im odlo╛en²ch aktualizacφ volßnφm DbiEndDelayedUpdates.

  7. DBIResult DBIFN EXPORT DbiEndDelayedUpdates(phDBICur phDbiCur);
Mechanismus zp∞tnΘho volßnφ je poskytnut, kdy╛ zßpis modifikovan²ch zßznam∙ do databßze je ne·sp∞╣n². Proto╛e aktualizace nejsou zaslßny do p°ipojenΘ tabulky dokud nejsou detekovßny ╛ßdnΘ chyby p°ed operacφ trvalΘho zßpisu. Pokud chyba nastane v dob∞ COMMIT, pak u╛ivatelΘ jsou dotßzßny s chybovou zprßvou popisujφcφ chybu. Aplikace registruje funkce zp∞tnΘho volßnφ pro odlo╛enΘ aktualizace pomocφ funkce DbiRegisterCallBack (ecbType pro toto zp∞tnΘ volßnφ je cbDELAYEDUPD) k oznßmenφ chyb v pr∙b∞hu COMMIT.
Deskriptor zp∞tnΘho volßnφ pro odlo╛enΘ aktualizace je:
// typ objektu odlo╛enΘ aktualizace
typedef enum
{
      delayupdNONE        = 0,
      delayupdMODIFY      = 1,
      delayupdINSERT      = 2,
      delayupdDELETE      = 3
} DelayUpdErrOpType;
// deskripror zp∞tnΘho volßnφ odlo╛en²ch zm∞n.
typedef struct
{
      DBIResult           iErrCode;
      DelayUpdErrOpType   eDelayUpdErrOpType;
      // Velikost zßznamu (fyzick² zßznam)
      UINT16              iRecBufSize;
      pBYTE               pNewRecBuf;
      pBYTE               pOldRecBuf;
} DELAYUPDCbDesc;
V deskriptoru zp∞tnΘho volßnφ eDelayUpdErrOpType indikuje typ operace (jako je vklßdßnφ, ru╣enφ nebo modifikace) a iErrCode indikuje jak² typ chyby nastal v pr∙b∞hu operace eDelayUpdErrOpType. Klient musφ alokovat dostatek pam∞ti pro pNewRecBuf a pOldRecBuf. Ka╛dß vyrovnßvacφ pam∞╗ zßznam∙ musφ mφt alespo≥ velikost vyrovnßvacφ pam∞ti zßznamu kurzoru odlo╛en²ch aktualizacφ. Novß (po aktualizacφ) a starß (p°ed aktualizaci) v²rovnßvacφ pam∞╗ zßznamu jsou vrßceny klientovi prost°ednictvφm vyrovnßvacφch pam∞tφ  pNewRecBuf a pOldRecBuf.
Klient m∙╛e reagovat na zp∞tn∞ volanou funkci nßsledujφcφmi nßvratov²mi k≤dy:
 
Nßvratov² k≤d V²slednß akce
cbrABORT Celß operace COMMIT je zru╣ena. Je to implicitnφ nßvratov² k≤d, pokud funkce zp∞tnΘho volßnφ nenφ registrovßna.
cbrSKIP Chybnß aktualizaΦnφ operace je p°eskoΦena a proces COMMIT pokraΦuje pro zb²vajφcφ aktualizace.
cbrCONTINUE Chybnß aktualizaΦnφ operace je p°eskoΦena a proces COMMIT pokraΦuje pro zb²vajφcφ aktualizace.
cbrRETRY Chybnß aktualizaΦnφ operace bude zopakovßna.
cbrPARTIALASSIST Zm∞ny u╛ivatele jsou dr╛eny v cache. V tomto p°φpad∞, u╛ivatel aplikuje zm∞ny na p∙vodnφ tabulku.

 
14. API BDE I