1. 使用TDatabase的方法和屬性
下表中列出了TDatabase部件中用于事務(wù)管理的方法和屬性以及它們的使用方法:
表18.11 TDatabase用于事務(wù)顯式控制的方法表
━━━━━━━━━━━━━━━━━━━━━━━━
方法或?qū)傩浴∽?用
────────────────────────
Commit 提交數(shù)據(jù)的修改并終止事務(wù)
Rollback 取消數(shù)據(jù)的修改并終止事務(wù)
StartTransaction 開始一個(gè)事務(wù)
TransIsolation 表述事務(wù)的獨(dú)立性級(jí)別
━━━━━━━━━━━━━━━━━━━━━━━━
StartTransaction,Commit和Rollback是供應(yīng)用程序在運(yùn)行時(shí)調(diào)用開始事務(wù),控制事務(wù)并且保存或放棄所做數(shù)據(jù)修改的方法。
TransIsolation是TDatabase部件的用于控制作用于相同表的不同事務(wù)之間如何交互的屬性。
⑴ 開始一個(gè)事務(wù)
當(dāng)你開始一個(gè)事務(wù)時(shí),后來(lái)的所有讀寫數(shù)據(jù)庫(kù)的表達(dá)式都發(fā)生在那次事務(wù)的環(huán)境中。每個(gè)表達(dá)式都是其中一部分。任何表達(dá)式所做的修改,要么成功地提交給數(shù)據(jù)庫(kù),要么每一個(gè)修改都被取消。考慮一個(gè)在ATM上的銀行傳輸問(wèn)題。當(dāng)顧客決定將錢從存款帳戶轉(zhuǎn)到支付帳戶時(shí),在銀行數(shù)據(jù)庫(kù)記錄上必須發(fā)生兩個(gè)修改:
● 存款帳戶必須記入借方
● 支付帳戶必須記入貸方
如果出于某種原因,其中的一個(gè)操作不能被完成,那么任何一個(gè)操作都不應(yīng)該發(fā)生。因?yàn)檫@些操作是相關(guān)的,它們應(yīng)該發(fā)生在同一個(gè)事務(wù)中。
為了開始Delphi應(yīng)用程序中的一個(gè)事務(wù),需要調(diào)用TDatabase部件中的StartTransaction方法:
DatabaseInterBase.StartTransaction;
此后的所有數(shù)據(jù)操作都發(fā)生在最近一個(gè)事務(wù)的環(huán)境中,直到該次事務(wù)通過(guò)調(diào)用Commit或Rollback顯式地終止為止。
那么,應(yīng)當(dāng)將事務(wù)保持多久呢?理想狀態(tài)下,只要需要,多久都行。事務(wù)的活躍狀態(tài)越長(zhǎng),同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)的用戶越多,在你的事務(wù)的生命其中,更多的并發(fā)、同時(shí)的事務(wù)開始和終止,于是當(dāng)試圖提交修改時(shí),與其它事務(wù)沖突的可能性更大。
、 提交一個(gè)事務(wù)
為了做永久性修改,事務(wù)必須使用TDatabase部件的Commit方法提交。執(zhí)行提交表達(dá)式將保存數(shù)據(jù)庫(kù)的修改并終止事務(wù)。例如,下列表達(dá)式將終止在上例中開始的事務(wù):
DatabaseInterBase.Commit
Commit的調(diào)用應(yīng)當(dāng)置于try…except表達(dá)式中。如果一個(gè)事務(wù)不能成功提交,你就能處理錯(cuò)誤,并重試操作。
、 返轉(zhuǎn)一個(gè)事務(wù)
為了取消數(shù)據(jù)庫(kù)修改,必須用Rollback方法返轉(zhuǎn)一個(gè)事務(wù)。Rollback 復(fù)原一個(gè)事務(wù)的修改,并終止事務(wù),例如:下列表達(dá)式將返轉(zhuǎn)一個(gè)事務(wù):
DatabaseInterBase.Rollback;
Rollback通常發(fā)生在:
● 異常處理代碼
● 按鈕或菜單事件代碼,如用戶點(diǎn)按了Cancel按鈕
、 使用TransIsolation屬性
TransIsolation屬性描述TDatabase部件事務(wù)的獨(dú)立級(jí)別,事務(wù)的獨(dú)立級(jí)別決定了事務(wù)與其它作用于相同表的事務(wù)是如何相互作用的。在改變或設(shè)置TransIsolation 的值之前,應(yīng)當(dāng)相當(dāng)熟悉Delphi中的事務(wù)和事務(wù)管理。
TransIsolation的缺省值是tiReadCommitted。下表中總結(jié)了TransIsolation的可能值并描述了它們的含義:
表18.12 TransIsolation屬性值的含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
獨(dú)立級(jí)別 含 義
──────────────────────────────────────
tiDirtyRead 允許讀由其它同時(shí)事務(wù)寫入數(shù)據(jù)庫(kù)的未提交的修改。未提交的
修改不是永久性的,可能在任何時(shí)候被復(fù)原。 在這個(gè)級(jí)別你
的事務(wù)與其它事務(wù)所做的修改具有最低獨(dú)立度。
tiReadCommitted 只允許讀由其它同時(shí)事務(wù)提交的數(shù)據(jù)庫(kù)修改。這是缺省的獨(dú)
立級(jí)別。
tiRepeatableRead 允許單個(gè)的數(shù)據(jù)庫(kù)讀事務(wù)無(wú)法看見其它同時(shí)事務(wù)對(duì)相同數(shù)據(jù)做
的修改。這個(gè)獨(dú)立級(jí)別保證了你的事務(wù)一次讀一個(gè)記錄,記錄
的視圖不會(huì)改變, 在這個(gè)級(jí)別你的事務(wù)與其它事務(wù)做的修改完
全獨(dú)立。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
各種數(shù)據(jù)庫(kù)服務(wù)器不同程度地支持這些獨(dú)立級(jí)別,有的根本不支持。 如果請(qǐng)求的隔離級(jí)別不被服務(wù)器支持,Delphi將采用更高的獨(dú)立級(jí)別。各種服務(wù)器支持的獨(dú)立級(jí)別請(qǐng)參見表18.10。
如果應(yīng)用程序使用ODBC與服務(wù)器交互,ODBC驅(qū)動(dòng)程序必須支持獨(dú)立級(jí)別。
2. 使用傳遞式SQL
為了能使用傳遞式SQL控制事物,必須:
● 使用Delphi Client/Server Suite
● 安裝正確的SQL Links驅(qū)動(dòng)程序
● 正確配置網(wǎng)絡(luò)協(xié)議
● 訪問(wèn)遠(yuǎn)程服務(wù)器上數(shù)據(jù)庫(kù)的能力
● 用BDE配置工具將SQLPASSTHROUGH MODE設(shè)置為NOT SHARED
通過(guò)傳遞式SQL,你可以使用TQuery、TStoredProc、或TUpdateSQL部件直接發(fā)送一個(gè)SQL事務(wù)控制表達(dá)式給遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器;BDE本身并不處理SQL表達(dá)式,采用傳遞式SQL可使用戶直接獲得SQL服務(wù)器提供了事務(wù)控制優(yōu)點(diǎn),尤其是當(dāng)那些控制是非標(biāo)準(zhǔn)的時(shí)。
SQL PASS THROUGHMODE 描述BDE和傳遞式SQL是否共享相同的數(shù)據(jù)庫(kù)聯(lián)接。在大多數(shù)情況下,SQLPASSTHROUGHMODE被設(shè)置SHARED AUTOCOMMIT。然而,如果你想將SQL事務(wù)控制傳遞給服務(wù)器,你就必須用BDE配置工具,將BDE的SQLPASSTHROUGHMODE 設(shè)置為NOT SHARED。此外,還必須為傳遞SQL事務(wù)控制表達(dá)式的TQuery部件建立獨(dú)立的TDatabase 部件。
3. 使用本地事務(wù)
BDE還支持Paradox和dBASE上的本地事務(wù)。從代碼角度而言,在本地事務(wù)和遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器的事務(wù)之間沒有什么差別。
當(dāng)作用于本地?cái)?shù)據(jù)庫(kù)表的事務(wù)開始時(shí),更新操作被記錄在日志中,每個(gè)日志記錄包含舊的記錄緩沖區(qū)。當(dāng)事務(wù)處于活躍狀態(tài),更新的記錄被鎖定,直到事務(wù)被提交或返轉(zhuǎn),在返轉(zhuǎn)過(guò)程中,舊的記錄被應(yīng)用于將更新的記錄恢復(fù)到原先的狀態(tài)。
18.3.3 使用存儲(chǔ)過(guò)程
18.3.3.1 TStoredProc部件概述
存儲(chǔ)過(guò)程是以數(shù)據(jù)庫(kù)服務(wù)器為基礎(chǔ)的接受輸入?yún)?shù),并將結(jié)果返回給應(yīng)用程序的一段程序。TStoredProc部件操作遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程是一連串表達(dá)式的集合,作為服務(wù)器的一部分存儲(chǔ)。存儲(chǔ)過(guò)程在服務(wù)器上執(zhí)行一系列重復(fù)性的與數(shù)據(jù)庫(kù)相關(guān)的任務(wù),并將結(jié)果傳給客戶應(yīng)用程序,如Delphi數(shù)據(jù)庫(kù)應(yīng)用程序。
TStaredProc部件使Delphi數(shù)據(jù)庫(kù)應(yīng)用程序能執(zhí)行服務(wù)器上的存儲(chǔ)過(guò)程。
通常,作用于數(shù)據(jù)庫(kù)表中大量記錄并且使用統(tǒng)計(jì)或數(shù)學(xué)函數(shù)的操作都是存儲(chǔ)過(guò)程的首選對(duì)象。通過(guò)將這些重復(fù)計(jì)算任務(wù)轉(zhuǎn)移到服務(wù)器,可以提高數(shù)據(jù)庫(kù)應(yīng)用程序的性能。
● 充分利用服務(wù)器的處理能力和速度
● 減少網(wǎng)絡(luò)傳輸?shù)臄?shù)量
例如,考慮一個(gè)需要計(jì)算單個(gè)值的應(yīng)用程序,在大批記錄中的標(biāo)準(zhǔn)差值。如果在Delphi應(yīng)用程序中執(zhí)行這項(xiàng)功能就必須從服務(wù)器中得到所有在計(jì)算中用到的記錄,這必將導(dǎo)致網(wǎng)絡(luò)擁塞。因?yàn)閼?yīng)用程序所需的只是代表標(biāo)準(zhǔn)差的最終返回值。因此,由服務(wù)器上的存儲(chǔ)過(guò)程來(lái)讀數(shù)據(jù),執(zhí)行計(jì)算和將值傳給應(yīng)用程序?qū)⒏行А?/P>
1. TSoredProc的關(guān)鍵屬性
、 DatabaseName屬性
DatabaseName屬性描述要訪問(wèn)的數(shù)據(jù)庫(kù)的名字。該屬性可以為:
● 已定義的BDE別名
● 本地型數(shù)據(jù)庫(kù)的目錄
● Local InterBase服務(wù)器的目錄路徑和文件名
● TDatabase定義的應(yīng)用程序別名
在改變DatabaseName之前要使用Close方法將Dataset部件置為非活躍狀態(tài)。
、 StoredProcName屬性
StoredProcName屬性表示服務(wù)器上的存儲(chǔ)過(guò)程名。Oracle服務(wù)器允許多個(gè)具有相同名字的存儲(chǔ)過(guò)程。因此要設(shè)置Overload屬性來(lái)描述執(zhí)行在Oracle服務(wù)器上的存儲(chǔ)過(guò)程名。
⑶ Overload屬性
Oracle服務(wù)器允許Oracle軟件包中存儲(chǔ)過(guò)程的重載。就是說(shuō)具有相同名字的不同過(guò)程,設(shè)置Overload屬性用來(lái)描述執(zhí)行在Oracle服務(wù)器上的存儲(chǔ)過(guò)程。如果Overload值為零,則假定沒有重載,如果Overload為1,則Delphi執(zhí)行具有同名的第一個(gè)存儲(chǔ)過(guò)程;如果值為2,則執(zhí)行第二個(gè)存儲(chǔ)過(guò)程。
、 Params屬性
Params屬性包含傳給存儲(chǔ)過(guò)程的參數(shù)。
2. 關(guān)鍵方法
⑴ ParamByName方法
聲明:function ParamByName(const Value: String): TParam;
ParamByName方法返回Params屬性中具有名為Value的元素值。一般用該方法在動(dòng)態(tài)查詢中給參數(shù)賦值。
、 Prepare方法
PrePare方法準(zhǔn)備要執(zhí)行的存儲(chǔ)過(guò)程,這允許服務(wù)器載入存儲(chǔ)過(guò)程,否則準(zhǔn)備處理異常。
、 ExecProc方法
ExecProc方法執(zhí)行服務(wù)器上的存儲(chǔ)過(guò)程。
、 Open方法
Open方法打開DataSet部件,并將其置于瀏覽狀態(tài)。這相當(dāng)于將Active屬性置為True。對(duì)于TStoredProc如果存儲(chǔ)過(guò)程返回一個(gè)結(jié)果集,則使用Open執(zhí)行存儲(chǔ)過(guò)程。如果存儲(chǔ)過(guò)程返回單行,早使用ExecProc執(zhí)行存儲(chǔ)過(guò)程。
18.3.3.2 TStoreProc使用方法
1. 建立一個(gè)StoredProc部件
為數(shù)據(jù)庫(kù)服務(wù)器上的存儲(chǔ)過(guò)程建立一個(gè)TStoredProc部件的步驟如下:
、 從Component Palette的Data Access頁(yè)選擇TStoredProc部件放在數(shù)據(jù)模塊上。
、 將TStoredProc部件的DatabaseName屬性設(shè)置為存儲(chǔ)過(guò)程所在的數(shù)據(jù)庫(kù)名。
DatabaseName必須是BDE別名。
⑶ 將TStoredProc部件的StoredProcName屬性設(shè)為所用的存儲(chǔ)過(guò)程名,或者從下拉式
列表框中選擇。
、 在TStoredProc部件的Params屬性中描述輸入?yún)?shù)?梢允褂脜(shù)編輯器來(lái)設(shè)置輸
入?yún)?shù)。參數(shù)編輯器也可讓用戶察看存儲(chǔ)過(guò)程返回給應(yīng)用程序的值。
2. 設(shè)置存儲(chǔ)過(guò)程的輸入?yún)?shù),察看輸出結(jié)果參數(shù)
許多存儲(chǔ)過(guò)程需要給它們傳入一系列的輸入?yún)?shù),以確定處理什么和怎樣處理,在Params屬性中描述這些參數(shù)。所描述的輸入?yún)?shù)的順序是很重要的,它由服務(wù)器上的存儲(chǔ)過(guò)程來(lái)確定。在設(shè)計(jì)時(shí),最容易和最安全的方法是激活TStoredProc參數(shù)編輯器,編輯輸入?yún)?shù)。參數(shù)編輯器以正確的次序列出輸入?yún)?shù),讓你給它們賦值。
要激活TStoredProc的參數(shù)編輯器:
、 選擇TStoredProc部件。
、 按鼠標(biāo)右鍵激活加速菜單(Speed Menu)。
、 選擇Define Parameters。
參數(shù)名列表框顯示過(guò)程的所有輸入,輸出和結(jié)果參數(shù)。有關(guān)輸入、輸出參數(shù)的信息從服務(wù)器中獲得。對(duì)于某些服務(wù)器而方,參數(shù)信息是不可訪問(wèn)的,如Sybase,在這種情況下,列表框是空的,因此必須自己按過(guò)程要求的順序增加輸入輸出參數(shù)。
參數(shù)類型復(fù)選框中描述所選的參數(shù)是輸入、輸出,還是結(jié)果參數(shù)。如果服務(wù)器支持參數(shù)可以既是輸入又是輸出。如果在列表框中增添參數(shù),就必須設(shè)置參數(shù)類型。
數(shù)據(jù)類型復(fù)選框,列出列表框中所選參數(shù)的數(shù)據(jù)類型。如果給列表框真善美參數(shù),必須設(shè)置數(shù)據(jù)類型。
在值編輯框中給輸入?yún)?shù)賦值。
如果服務(wù)器不傳遞存儲(chǔ)過(guò)程信息給Delphi,則可以用Add按鈕給存儲(chǔ)過(guò)程增添參數(shù)。Delete按鈕則是將增添的參數(shù)刪除,Clear按鈕將清除列表框中所有參數(shù)。
設(shè)置完參數(shù)后,選擇OK按鈕。
3. 在運(yùn)行時(shí)建立參數(shù)和參數(shù)值
在運(yùn)行時(shí)建立參數(shù),可直接訪問(wèn)Params屬性。Params屬性是參數(shù)字符串的數(shù)組。例如,下列代碼將編輯框的文本賦給數(shù)組的第一個(gè)字串:
StaredProc1.Params[0].Asstring := Edit1.Text
也能夠用ParamsByName方法通過(guò)名字訪問(wèn)參數(shù):
StoredProc1.ParamsByName('Company') Asstring := Edit1.Text;
4. 準(zhǔn)備和執(zhí)行存儲(chǔ)過(guò)程
要使用存儲(chǔ)過(guò)程還必須準(zhǔn)備并執(zhí)行它?梢杂袃煞N方式準(zhǔn)備一個(gè)存儲(chǔ)過(guò)程:
● 在設(shè)計(jì)時(shí),通過(guò)選擇參數(shù)編輯器的OK按鈕
● 在運(yùn)行時(shí),通過(guò)調(diào)用TStoredProc的Prepare方法
例如,下面的代碼準(zhǔn)備存儲(chǔ)過(guò)程的執(zhí)行:
StoredProc1.Prepare;
要執(zhí)行準(zhǔn)備好的存儲(chǔ)過(guò)程,調(diào)用TStroedProc部件的ExecProc方法。下列代碼演示了準(zhǔn)備和執(zhí)行存儲(chǔ)過(guò)程:
StoredProc1.Params[0] Asstring := Edit1.Text;
StoredProc1.prepare;
StoredProc1.ExecProc;
當(dāng)你執(zhí)行一個(gè)存儲(chǔ)過(guò)程,它返回輸出參數(shù)或結(jié)果集,有兩種可能的返回類型:?jiǎn)蝹(gè)返回,如單值或值集,和一群結(jié)果集,返回很多值。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |