18.3.1 使用TDatabase部件聯接SQL服務器
18.3.1.1 TDatabase部件概述
TDatabase部件處理應用程序與單個數據庫的聯接。如果不需要控制數據庫聯接,可以不用創建TDatabase部件。當應用程序試圖打開數據庫表(Table)時,會自動創建一個臨時的TDatabase部件。但如果你想控制數據庫的持續聯接、進入數據庫服務器的注冊和數據庫別名的值或事務控制,那麼你就必須為每個所需的聯接創建一個TDatabase部件。
1. 創建TDatabase部件
TDatabase 部件在Component Palette中的Data Access頁上,你能將其拖放在數據模塊(Data module)或窗體中。在設計時創建TDatabase 部件,用戶可以設置初始值和編寫OnLogin事件處理過程(Event Handle)。OnLogin事件給用戶提供了第一次注冊數據庫服務器時定制服務器安全參數,如口令,的能力。
2. TDatabase的關鍵屬性
⑴ DatabaseName屬性
DatabaseName是所要聯接的數據庫名,並且用於DataSet軟件,它將出現在DataSet部件的DatabaseName屬性的下拉式列表框中。設置DataBaseName屬性是定義數據庫應用的特定別名。DataSet部件能引用該名字以取代直接使用BDE別名。當TDatabase部件的Connected屬性為True時不能修改該屬性。
⑵ AliaName屬性
AliasName是BDE配置工具定義的BDE別名的名字。TDatabase 從中獲取其缺省的設置。如果設置DriveName屬性,則該屬性將被清除,如果當Connected為True 時強行設置DriveName屬性將引發異常。
⑶ DriveName屬性
DriveName是BDE驅動程序,如STANDARD 、ORACLE、SYBASE、INFORMIX或INTERBASE的名字。如果設置AliasName,則該屬性值將被清除。
⑷ Params屬性
Params屬性包含了打開SQL服務器上數據庫時所需的參數。在缺省情況下,這些參數由BDE配置工具設置;用戶也可以用數據庫參數編輯器(Database Parameters Editor)修改這些參數。對於數據庫服務器而言,Params將描述一系列的參數,如服務器名、 數據庫名、用戶名和口令。
⑸ Connected屬性
Connected屬性指明是否建立數據庫的聯接,當應用程序打開數據庫中的一個表時Connected將被置為True;反之,關閉數據庫表,Connected將被置為False,除非KeepConnection為True。而將Connected置為True則可不需打開數據庫表即可建立數據庫聯接。TDatabase的KeepConnection屬性描述當數據庫中沒有表打開時是否維持數據庫聯連。
⑹ KeepConnection屬性
KeepConnection屬性描述當數據庫中沒有打開表時是否要保持與服務器的聯連, 如果數據庫應用需要打開和關閉單個數據庫中的多個表時,將KeepConnection 設置為True是很有用的,那樣,即使沒有打開任何表,應用仍能保持與數據庫的聯接,它能夠重復地打開和關閉數據庫表,而不需要重復執行聯接過程。如果KeepConnection置為False,當每次將Connected置為True,數據庫都必須執行注冊過程。
⑺ LoginPrompt屬性
LoginPrompt屬性用於控制如何處理SQL數據庫的安全性問題。如置為True,當應用程序試圖建立數據庫聯接時屏幕上將出現標准Delphi注冊對話框。用戶必須輸入正確的用戶名和口令。如果置為False,則應用程序將尋找TDatabase部件的Params 屬性中的注冊參數。下面是USERNAME和PASSWORD參數的例子:
USERNAME = SYSDBA
PASSWORD = masterkey
⑻ TransIsolation屬性
TransIsolation屬性描述SQL服務器所有的事務控制獨立級別。 tiDirtyRead使所有修改都被返回,而不管記錄是否已被提交。tiReadCommitted將只返回提交的記錄,而提交的修改將不會在結果中反映出來。tiRepeatableRead 將只返回事務過程中最初的記錄,即使另一個應用程序將所作的修改提交。
各種數據庫服務器可能不同程度地支持這些獨立級別,或者根本不支持。 如果需要的獨立級別不被服務器支持,那麼Dephi將使用下一個更高的獨立級別,如下表所示:
表18.10 各類服務器TransIsolation設置
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
獨立級別 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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
各個獨立級別的含義請見表18.12。
3. TDatabase的關鍵方法
⑴ StartTransaction方法
StartTransartion方法在由TaransIsolation屬性指定的獨立級別下開始事務控制。如果在一個事務已被激活的情況下調用該方法,Delphi將引發異常。
調用了該方法後,對數據庫所做的修改一直由數據庫服務器維持到調用Commmit方法提交數據或調用Rollback方法取消修改為止。只有當聯接數據庫服務器時,才能調用該方法。
⑵ Rollback方法
Rollback方法返轉當前事務控制,並且取消自最近一次調用StartTransaction以來對數據庫所做的所有修改。
⑶ Commit方法
Commit方法提交當前事務控制,並且將自最近一次調用StartTransaction以來所有數據修改存入數據庫。
4. TDatabase的OnLogin事件的處理
OnLogin事件的觸發條件是當聯接SQL數據庫的TDatabase部件被打開並且LoginPrompt屬性為True。使用OnLogin事件處理過程可以在運行時設置注冊參數。OnLogin 事件處理過程得到TDatabase的注冊參數數組Params,並且使用Values屬性改變這些參數。
例如:
LoginParams.Vaiues['SERVER NAME'] := 'MYSERVERNAME';
LoginParams.Values['USER NAME'] := 'MYUSERNAME';
LoginParams.Values[PASSWORD'] := 'MYAPSSWORD';
當控制從OnLogin事件處理過程中返回時,應用程序用這些參數來建立聯接。
OnLogin事件處理過程的聲明是這樣的:
TLoginEvent = procedure(Database: TDatabase; LoginParam: TStrings) of Object;
property OnLogin: TLoginEvent;
TLoginEvent類型是處理OnLogin事件的方法頭。Database參數是要聯接的數據庫。LoginParams是TStrings類型的對象,包含用戶名和口令,以及打開數據庫時所用的其它參數。用戶名是形如USER NAME = John.Doe的字符串,口令是形如PASSWORD = is_Password的字符串。當OnLogin事件處理過程被調用時應當在LoginParams中加入用戶名和口令。