4. 解決一般的聯(lián)接問(wèn)題
如果用SQL Links建立與InterBase服務(wù)器的連接有問(wèn)題可采用下列步驟來(lái)分離問(wèn)題原因:
、 通過(guò)Windows ISQL工具測(cè)試能否與InterBase服務(wù)器聯(lián)接
如果成功,狀態(tài)信息會(huì)出現(xiàn),并繼續(xù)步驟⑵。
如果不成功,詢問(wèn)數(shù)據(jù)庫(kù)管理員。
⑵ 檢驗(yàn)InterBase SQL Links 驅(qū)動(dòng)程序是否正確安裝。
⑶ 重新安裝SQL Links。
、 檢查SERVICES,文件中應(yīng)有行:
gds_db 3050/tcp
如果不能正確安裝,就請(qǐng)?jiān)儐?wèn)數(shù)據(jù)庫(kù)管理員,否則繼續(xù)步驟⑸。
、 測(cè)試底層協(xié)議
、 輸入TELNET命令,確認(rèn)TCP庫(kù)是否正確安裝。
如果TCP庫(kù)正確安裝,注冊(cè)提示符會(huì)出現(xiàn)。注冊(cè)入網(wǎng)檢查數(shù)據(jù)庫(kù)是否存在。
如果消息是“can't resolve hostname” 出現(xiàn),檢查工作站的HOSTS文件是否有你 的主機(jī)名和IP地址的人口。如:
128.127.50.12 mis_server
如果用TELNET是成功的,但仍然無(wú)法正確聯(lián)接,則沒(méi)有正確安裝InterBase。請(qǐng)尋
求數(shù)據(jù)庫(kù)管理員的幫助。
② PING到服務(wù)器服務(wù)器上,測(cè)試InterBase服務(wù)器是否正常運(yùn)行并且為桌面應(yīng)用可見(jiàn)
(如果PING是成功的,消息“servername is alive”被顯示)。
PING成功但TELNET不成功,則inet daemon可能有問(wèn)題。
如果PING到服務(wù)器上不成功,則有網(wǎng)絡(luò)路徑問(wèn)題,將問(wèn)題報(bào)給網(wǎng)絡(luò)管理員。
如果底層協(xié)議不正常,請(qǐng)?jiān)儐?wèn)數(shù)據(jù)庫(kù)管理員,否則繼續(xù)幫助⑹。
、 確認(rèn)是否有InterBase服務(wù)器的訪問(wèn)權(quán),如果有請(qǐng)繼續(xù)步驟⑺。
、 檢查BDE應(yīng)用程序的InterBase別名是否正確安裝。
如果能夠直接從工作站上聯(lián)接,但不能從BDE應(yīng)用程序中,那么很有可能你的
IDAPI32.CFG別名設(shè)置有問(wèn)題。運(yùn)行BDE配置工具檢查InterBase別名。
18.3 Delphi Client/Server編程
本節(jié)介紹如何運(yùn)用Delphi可視化開(kāi)發(fā)工具和ObjectPascal語(yǔ)言開(kāi)發(fā)Client\Server的數(shù)據(jù)庫(kù)應(yīng)用程序,采用的例子是CSDEMOS。這是Delphi2.0自帶的演示Client\Server開(kāi)發(fā)的例子,它安裝在C:\Program Files\Borland\Delphi 2.0\Demos\DB\CSDemos中(缺省安裝)。
本節(jié)將包含以下內(nèi)容:
● 使用TDatabase部件連接SQL服務(wù)器
● 用DataSet部件(又稱數(shù)據(jù)集部件),如TTable和TQuery,聯(lián)接TDatabase部件并訪問(wèn)數(shù)據(jù)庫(kù)以及各種表之間如何切換
● 使用數(shù)據(jù)庫(kù)連接
● 觸發(fā)器的使用方法
● TStoredProc部件的使用方法
● 客戶和服務(wù)器之間的事務(wù)控制
● TStoredProc部件的使用方法
18.3.1 使用TDatabase部件聯(lián)接SQL服務(wù)器
18.3.1.1 TDatabase部件概述
TDatabase部件處理應(yīng)用程序與單個(gè)數(shù)據(jù)庫(kù)的聯(lián)接。如果不需要控制數(shù)據(jù)庫(kù)聯(lián)接,可以不用創(chuàng)建TDatabase部件。當(dāng)應(yīng)用程序試圖打開(kāi)數(shù)據(jù)庫(kù)表(Table)時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)臨時(shí)的TDatabase部件。但如果你想控制數(shù)據(jù)庫(kù)的持續(xù)聯(lián)接、進(jìn)入數(shù)據(jù)庫(kù)服務(wù)器的注冊(cè)和數(shù)據(jù)庫(kù)別名的值或事務(wù)控制,那么你就必須為每個(gè)所需的聯(lián)接創(chuàng)建一個(gè)TDatabase部件。
1. 創(chuàng)建TDatabase部件
TDatabase 部件在Component Palette中的Data Access頁(yè)上,你能將其拖放在數(shù)據(jù)模塊(Data module)或窗體中。在設(shè)計(jì)時(shí)創(chuàng)建TDatabase 部件,用戶可以設(shè)置初始值和編寫(xiě)OnLogin事件處理過(guò)程(Event Handle)。OnLogin事件給用戶提供了第一次注冊(cè)數(shù)據(jù)庫(kù)服務(wù)器時(shí)定制服務(wù)器安全參數(shù),如口令,的能力。
2. TDatabase的關(guān)鍵屬性
、 DatabaseName屬性
DatabaseName是所要聯(lián)接的數(shù)據(jù)庫(kù)名,并且用于DataSet軟件,它將出現(xiàn)在DataSet部件的DatabaseName屬性的下拉式列表框中。設(shè)置DataBaseName屬性是定義數(shù)據(jù)庫(kù)應(yīng)用的特定別名。DataSet部件能引用該名字以取代直接使用BDE別名。當(dāng)TDatabase部件的Connected屬性為T(mén)rue時(shí)不能修改該屬性。
、 AliaName屬性
AliasName是BDE配置工具定義的BDE別名的名字。TDatabase 從中獲取其缺省的設(shè)置。如果設(shè)置DriveName屬性,則該屬性將被清除,如果當(dāng)Connected為T(mén)rue 時(shí)強(qiáng)行設(shè)置DriveName屬性將引發(fā)異常。
、 DriveName屬性
DriveName是BDE驅(qū)動(dòng)程序,如STANDARD 、ORACLE、SYBASE、INFORMIX或INTERBASE的名字。如果設(shè)置AliasName,則該屬性值將被清除。
、 Params屬性
Params屬性包含了打開(kāi)SQL服務(wù)器上數(shù)據(jù)庫(kù)時(shí)所需的參數(shù)。在缺省情況下,這些參數(shù)由BDE配置工具設(shè)置;用戶也可以用數(shù)據(jù)庫(kù)參數(shù)編輯器(Database Parameters Editor)修改這些參數(shù)。對(duì)于數(shù)據(jù)庫(kù)服務(wù)器而言,Params將描述一系列的參數(shù),如服務(wù)器名、 數(shù)據(jù)庫(kù)名、用戶名和口令。
⑸ Connected屬性
Connected屬性指明是否建立數(shù)據(jù)庫(kù)的聯(lián)接,當(dāng)應(yīng)用程序打開(kāi)數(shù)據(jù)庫(kù)中的一個(gè)表時(shí)Connected將被置為T(mén)rue;反之,關(guān)閉數(shù)據(jù)庫(kù)表,Connected將被置為False,除非KeepConnection為T(mén)rue。而將Connected置為T(mén)rue則可不需打開(kāi)數(shù)據(jù)庫(kù)表即可建立數(shù)據(jù)庫(kù)聯(lián)接。TDatabase的KeepConnection屬性描述當(dāng)數(shù)據(jù)庫(kù)中沒(méi)有表打開(kāi)時(shí)是否維持?jǐn)?shù)據(jù)庫(kù)聯(lián)連。
、 KeepConnection屬性
KeepConnection屬性描述當(dāng)數(shù)據(jù)庫(kù)中沒(méi)有打開(kāi)表時(shí)是否要保持與服務(wù)器的聯(lián)連, 如果數(shù)據(jù)庫(kù)應(yīng)用需要打開(kāi)和關(guān)閉單個(gè)數(shù)據(jù)庫(kù)中的多個(gè)表時(shí),將KeepConnection 設(shè)置為T(mén)rue是很有用的,那樣,即使沒(méi)有打開(kāi)任何表,應(yīng)用仍能保持與數(shù)據(jù)庫(kù)的聯(lián)接,它能夠重復(fù)地打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)表,而不需要重復(fù)執(zhí)行聯(lián)接過(guò)程。如果KeepConnection置為False,當(dāng)每次將Connected置為T(mén)rue,數(shù)據(jù)庫(kù)都必須執(zhí)行注冊(cè)過(guò)程。
、 LoginPrompt屬性
LoginPrompt屬性用于控制如何處理SQL數(shù)據(jù)庫(kù)的安全性問(wèn)題。如置為T(mén)rue,當(dāng)應(yīng)用程序試圖建立數(shù)據(jù)庫(kù)聯(lián)接時(shí)屏幕上將出現(xiàn)標(biāo)準(zhǔn)Delphi注冊(cè)對(duì)話框。用戶必須輸入正確的用戶名和口令。如果置為False,則應(yīng)用程序?qū)ふ襎Database部件的Params 屬性中的注冊(cè)參數(shù)。下面是USERNAME和PASSWORD參數(shù)的例子:
USERNAME = SYSDBA
PASSWORD = masterkey
、 TransIsolation屬性
TransIsolation屬性描述SQL服務(wù)器所有的事務(wù)控制獨(dú)立級(jí)別。 tiDirtyRead使所有修改都被返回,而不管記錄是否已被提交。tiReadCommitted將只返回提交的記錄,而提交的修改將不會(huì)在結(jié)果中反映出來(lái)。tiRepeatableRead 將只返回事務(wù)過(guò)程中最初的記錄,即使另一個(gè)應(yīng)用程序?qū)⑺鞯男薷奶峤弧?/P>
各種數(shù)據(jù)庫(kù)服務(wù)器可能不同程度地支持這些獨(dú)立級(jí)別,或者根本不支持。 如果需要的獨(dú)立級(jí)別不被服務(wù)器支持,那么Dephi將使用下一個(gè)更高的獨(dú)立級(jí)別,如下表所示:
表18.10 各類服務(wù)器TransIsolation設(shè)置
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
獨(dú)立級(jí)別 Oracle Sybase和 InterBase
Microsoft SQL
──────────────────────────────────────
Dirty Read Read Committed Read Committed Read Committed
Read Committed Read Committed Read Committed Read Committed
Repeatable read Repeatable read Not Supported Repeatable Read
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
各個(gè)獨(dú)立級(jí)別的含義請(qǐng)見(jiàn)表18.12。
3. TDatabase的關(guān)鍵方法
、 StartTransaction方法
StartTransartion方法在由TaransIsolation屬性指定的獨(dú)立級(jí)別下開(kāi)始事務(wù)控制。如果在一個(gè)事務(wù)已被激活的情況下調(diào)用該方法,Delphi將引發(fā)異常。
調(diào)用了該方法后,對(duì)數(shù)據(jù)庫(kù)所做的修改一直由數(shù)據(jù)庫(kù)服務(wù)器維持到調(diào)用Commmit方法提交數(shù)據(jù)或調(diào)用Rollback方法取消修改為止。只有當(dāng)聯(lián)接數(shù)據(jù)庫(kù)服務(wù)器時(shí),才能調(diào)用該方法。
⑵ Rollback方法
Rollback方法返轉(zhuǎn)當(dāng)前事務(wù)控制,并且取消自最近一次調(diào)用StartTransaction以來(lái)對(duì)數(shù)據(jù)庫(kù)所做的所有修改。
⑶ Commit方法
Commit方法提交當(dāng)前事務(wù)控制,并且將自最近一次調(diào)用StartTransaction以來(lái)所有數(shù)據(jù)修改存入數(shù)據(jù)庫(kù)。
4. TDatabase的OnLogin事件的處理
OnLogin事件的觸發(fā)條件是當(dāng)聯(lián)接SQL數(shù)據(jù)庫(kù)的TDatabase部件被打開(kāi)并且LoginPrompt屬性為T(mén)rue。使用OnLogin事件處理過(guò)程可以在運(yùn)行時(shí)設(shè)置注冊(cè)參數(shù)。OnLogin 事件處理過(guò)程得到TDatabase的注冊(cè)參數(shù)數(shù)組Params,并且使用Values屬性改變這些參數(shù)。
例如:
LoginParams.Vaiues['SERVER NAME'] := 'MYSERVERNAME';
LoginParams.Values['USER NAME'] := 'MYUSERNAME';
LoginParams.Values[PASSWORD'] := 'MYAPSSWORD';
當(dāng)控制從OnLogin事件處理過(guò)程中返回時(shí),應(yīng)用程序用這些參數(shù)來(lái)建立聯(lián)接。
OnLogin事件處理過(guò)程的聲明是這樣的:
TLoginEvent = procedure(Database: TDatabase; LoginParam: TStrings) of Object;
property OnLogin: TLoginEvent;
TLoginEvent類型是處理OnLogin事件的方法頭。Database參數(shù)是要聯(lián)接的數(shù)據(jù)庫(kù)。LoginParams是TStrings類型的對(duì)象,包含用戶名和口令,以及打開(kāi)數(shù)據(jù)庫(kù)時(shí)所用的其它參數(shù)。用戶名是形如USER NAME = John.Doe的字符串,口令是形如PASSWORD = is_Password的字符串。當(dāng)OnLogin事件處理過(guò)程被調(diào)用時(shí)應(yīng)當(dāng)在LoginParams中加入用戶名和口令。
18.3.1.2 定制數(shù)據(jù)庫(kù)服務(wù)器的注冊(cè)參數(shù)
大多數(shù)數(shù)據(jù)庫(kù)服務(wù)器都包含限制數(shù)據(jù)庫(kù)訪問(wèn)的安全特征。通常,在用戶能訪問(wèn)數(shù)據(jù)庫(kù)之前,服務(wù)器都要求注冊(cè)的用戶名和口令。
如果服務(wù)器需要注冊(cè),在設(shè)計(jì)階段,Delphi 會(huì)在你試圖聯(lián)接時(shí)提示你,諸如在會(huì)TTable部件描述數(shù)據(jù)庫(kù)表名時(shí)。
在缺省情況下,Delphi應(yīng)用在打開(kāi)數(shù)據(jù)庫(kù)服務(wù)器的聯(lián)接時(shí),顯示標(biāo)準(zhǔn)注冊(cè)對(duì)話框。如果聯(lián)接已建立,則注冊(cè)對(duì)話框不會(huì)出現(xiàn)。
可以用下列方法處理服務(wù)器注冊(cè):
1. 將TDatabase部件的LoginPrompt屬性置為T(mén)rue。這樣,當(dāng)應(yīng)用程序試圖建立數(shù)據(jù)庫(kù)聯(lián)接時(shí),標(biāo)準(zhǔn)注冊(cè)對(duì)話框會(huì)打開(kāi)。
2. 將LoginPrompt屬性置為False,在TDatabase部件的Params屬性中包含用戶名和口令參數(shù)。例如:
USERNAME = SYSDBA
PASSWORD = mosterkey
但不推薦使用該方法,因?yàn)檫@會(huì)危害數(shù)據(jù)庫(kù)安全
3. 使用TDatabase部件的OnLogin事件設(shè)置注冊(cè)參數(shù)。OnLogin事件得到TDatabase 注冊(cè)參數(shù)數(shù)組的拷貝,并利用Values屬性改變這些參數(shù)。如:
LoginParams.Values['SERVER NAME'] := 'MYSERVERNAME';
LoginParams.Values['USER NAME'] := 'MYUERNAME';
LoginParams.Values['PASSWORD'] := 'MYPASSWORD';
當(dāng)控制從數(shù)據(jù)庫(kù)注冊(cè)事件處理過(guò)程中返回時(shí),這些參數(shù)被用來(lái)建立聯(lián)接。
18.3.1.3 建立應(yīng)用程序特定的別名
TDatabase的Aliases描述了數(shù)據(jù)庫(kù)表的位置和數(shù)據(jù)庫(kù)服務(wù)器的聯(lián)接參數(shù)。通常都是在Delphi之外,運(yùn)用BDE配置工具(BDECFG32.EXE)創(chuàng)建別名,并且別名被存在BDE 配置文件IDAPI32.CFG中。
用戶也可以用TDatabase創(chuàng)建只在應(yīng)用程序中可用的別名,用TDatabase 創(chuàng)建的別名不會(huì)加進(jìn)BDE配置文件中。任何DataSet部件可通過(guò)描述DatabaseName 屬性來(lái)使用這些別名。為了定制這些局部別名的參數(shù),用鼠標(biāo)左鍵雙擊TDatabase部件或從TDatabase部件中選擇Database Editor,Delphi就會(huì)打開(kāi)數(shù)據(jù)庫(kù)屬性編輯器(Database Properties Editor)。
18.3.1.4 控制數(shù)據(jù)庫(kù)的聯(lián)接
TDatabase部件的Connected屬性,指示TDatabase部件是否建立與數(shù)據(jù)庫(kù)服務(wù)器的聯(lián)接。當(dāng)應(yīng)用程序打開(kāi)數(shù)據(jù)庫(kù)中的表時(shí),Connected被設(shè)置為T(mén)rue。將Connected 設(shè)為T(mén)rue就建立了數(shù)據(jù)庫(kù)的聯(lián)接。
1. 保持?jǐn)?shù)據(jù)庫(kù)聯(lián)接
TDatabase的KeepConnection屬性描述當(dāng)沒(méi)有數(shù)據(jù)庫(kù)表打開(kāi)時(shí)是否要與保持?jǐn)?shù)據(jù)庫(kù)的聯(lián)接。
如果應(yīng)用程序需要在單個(gè)數(shù)據(jù)庫(kù)中多次打開(kāi)關(guān)閉多個(gè)表時(shí),將KeepConnection 置為T(mén)rue能使應(yīng)用程序具備更好的性能。
當(dāng)KeepConnection為T(mén)rue時(shí),即使沒(méi)有表打開(kāi),應(yīng)用程序也能保持?jǐn)?shù)據(jù)庫(kù)的聯(lián)接。那么就能重復(fù)打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)表而不需每次進(jìn)行聯(lián)接注冊(cè)。
2. 使用TSesstion控制聯(lián)接
TSesstion部件有一個(gè)面向整個(gè)應(yīng)用程序的KeepConnections屬性。如果Session.KeepConnections為T(mén)rue,那么用于所有TDatabase部件的數(shù)據(jù)庫(kù)聯(lián)接都是持久的。
TSession為應(yīng)用程序提供數(shù)據(jù)庫(kù)聯(lián)接的全局控制。TSession中的Databases 屬性是Session中所有活躍數(shù)據(jù)庫(kù)組成的數(shù)組,DatabasesCount屬性描述活躍數(shù)據(jù)庫(kù)的數(shù)目。
3. 描述Net和Private目錄
TSession的NetFileDir屬性描述BDE網(wǎng)絡(luò)控制目錄的路徑。TSession的PrivateDir屬性描述存儲(chǔ)諸述處理局部SQL表達(dá)式的臨時(shí)文件的目錄的路徑。
18.3.1.5 獲取數(shù)據(jù)庫(kù)信息
TSession擁有許多讓用戶獲取數(shù)據(jù)庫(kù)有關(guān)的信息,每個(gè)方法都以TStringList 部件作為傳入?yún)?shù),并將信息返回TStringList中。
1. GetAliasNames方法
聲明:procedure GetAliasNames(List: TStringList);
GetAliasNames方法消除List中的參數(shù),并將所有已定義的BDE別名的名字寫(xiě)入List。應(yīng)用程序生成的別名不包括在內(nèi)。
2. GetAliasParams方法
聲明:procedure GetAliasParams(const AliasName: String; List: TStringList);
GetAliasParams方法清除List的內(nèi)容,并將BDE別名為AliaName的參數(shù)寫(xiě)入List。
3. GetDatabaseNames方法
聲明:procedure GetDatabaseNames(List: TStrings);
GetDatabaseNames方法清除List的內(nèi)容并將所有BDE別名和應(yīng)用程序定義的別名的名字寫(xiě)入List。
4. GetDriverNames方法
聲明:procedure GetDriverNames(List: TStrings);
GetDriverNames方法清除List中的內(nèi)容,并將BDE當(dāng)前安裝的驅(qū)動(dòng)程序名寫(xiě)入List。
5. GetDriverParams方法
聲明:procedure GetDriverParams(const DriverName: String; List: TStrings);
GetDriverParams方法消除List中的內(nèi)容,并將名為DriveName驅(qū)動(dòng)程序缺省參數(shù)寫(xiě)入List。
6. GetTableNames方法
聲明:procedure GetTableNames(const DatabaseName, Pattern: Strings;
Extensions, SystemTable: Boolean; List: TStrings);
GetTableNames方法消除List中的內(nèi)容,并將名為DatabaseName的數(shù)據(jù)庫(kù)中的所有表的名字寫(xiě)入List。Pattern參數(shù)將限制表名。對(duì)于SQL服務(wù)器,將SystemeTables設(shè)為T(mén)rue將獲取系統(tǒng)表和用戶表。對(duì)非SQL數(shù)據(jù)庫(kù),將Extensions設(shè)為T(mén)rue將在表名中包含擴(kuò)展名。
18.3.2 處理Client/Server事務(wù)控制
使用隱式控制和顯示控制的數(shù)據(jù)庫(kù)應(yīng)用中有兩種方法管理事務(wù)控制:
● 運(yùn)用TDatabase部件的屬性和方法進(jìn)行顯式控制
● 運(yùn)用TQuery部件的傳遞式SQL控制事務(wù)
Delphi還支持Paradox和dBASE表的局部事務(wù)處理
18.3.2.1 事務(wù)控制概述
當(dāng)用Delphi創(chuàng)建數(shù)據(jù)庫(kù)應(yīng)用時(shí),Delphi提供了用為所有數(shù)據(jù)庫(kù)訪問(wèn)的事務(wù)控制。
事務(wù)是這樣一組操作,在被提交前,它們對(duì)一個(gè)或多個(gè)數(shù)據(jù)庫(kù)的操作,必須全部執(zhí)行成功。如果其中一個(gè)操作失敗,則所有操作失敗,即事務(wù)具有原子性。
即使發(fā)生硬件失敗,事務(wù)也要保證數(shù)據(jù)庫(kù)一致性。當(dāng)允許多用戶并發(fā)訪問(wèn)時(shí),事務(wù)還要維持?jǐn)?shù)據(jù)完整性。
例如:一個(gè)應(yīng)用程序可能更新ORDERS表以指明接受購(gòu)買(mǎi)某一項(xiàng)目的定單,那么也要更新INNENTORY表以反映庫(kù)存的減少。如果在第一個(gè)更新之后,第二個(gè)更新之前發(fā)生硬件錯(cuò)誤,數(shù)據(jù)庫(kù)就會(huì)處于不一致?tīng)顟B(tài),因?yàn)閹?kù)存情況沒(méi)有反映定單情況。在事務(wù)控制下,兩個(gè)表達(dá)式將在同一時(shí)間提交,如果其中一個(gè)表達(dá)式失敗,則被返轉(zhuǎn)(Rolled Back)。
18.3.2.2 使用隱式控制
在缺省情況下,Delphi通過(guò)BDE為應(yīng)用程序提供隱式事務(wù)控制。當(dāng)應(yīng)用程序處于隱式事務(wù)控制時(shí)Delphi為DataSet中的寫(xiě)每個(gè)記錄進(jìn)行隱式事務(wù)控制。它提交每一個(gè)獨(dú)立的寫(xiě)操作,如Post和Append Record。
使用隱式事務(wù)控制是容易的,它保證最小的記錄更新沖突和數(shù)據(jù)庫(kù)的一致性視圖。另一方面,因?yàn)閷?xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)的每一行都要進(jìn)行事務(wù)控制, 所以隱式事務(wù)控制將導(dǎo)致網(wǎng)絡(luò)過(guò)忙和應(yīng)用程序性能下降。
如果采用顯式事務(wù)控制,就能選擇最有效的時(shí)機(jī)來(lái)開(kāi)始、提交和終止事務(wù),特別是在開(kāi)發(fā)多用戶環(huán)境下的客戶應(yīng)用程序運(yùn)行訪問(wèn)遠(yuǎn)程SQL服務(wù)器,就更應(yīng)該采用顯式控制。
18.3.2.3 使用顯式事務(wù)控制
有兩種協(xié)作又獨(dú)立的方式可運(yùn)用于Delphi數(shù)據(jù)庫(kù)應(yīng)用的事務(wù)控制:
● 使用TDatabase部件的方法和屬性
● 使用TQuery部件中的傳遞式SQL。這種方式只有在Delphi Client/Server Suite版中才有效,SQL Links將SQL表達(dá)式直接傳給過(guò)程SQL或ODBC服務(wù)器
使用TDatabase部件的方法和屬性的好處是提供了清晰的、輕便的、與特定數(shù)據(jù)庫(kù)或服務(wù)器無(wú)關(guān)的應(yīng)用能力。
使用傳遞式SQL的主要好處在于可以運(yùn)用特定服務(wù)器的先進(jìn)事務(wù)管理能力。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |