18.3.1.2 定制數據庫服務器的注冊參數
大多數數據庫服務器都包含限制數據庫訪問的安全特征。通常,在用戶能訪問數據庫之前,服務器都要求注冊的用戶名和口令。
如果服務器需要注冊,在設計階段,Delphi 會在你試圖聯接時提示你,諸如在會TTable部件描述數據庫表名時。
在缺省情況下,Delphi應用在打開數據庫服務器的聯接時,顯示標准注冊對話框。如果聯接已建立,則注冊對話框不會出現。
可以用下列方法處理服務器注冊:
1. 將TDatabase部件的LoginPrompt屬性置為True。這樣,當應用程序試圖建立數據庫聯接時,標准注冊對話框會打開。
2. 將LoginPrompt屬性置為False,在TDatabase部件的Params屬性中包含用戶名和口令參數。例如:
USERNAME = SYSDBA
PASSWORD = mosterkey
但不推薦使用該方法,因為這會危害數據庫安全
3. 使用TDatabase部件的OnLogin事件設置注冊參數。OnLogin事件得到TDatabase 注冊參數數組的拷貝,並利用Values屬性改變這些參數。如:
LoginParams.Values['SERVER NAME'] := 'MYSERVERNAME';
LoginParams.Values['USER NAME'] := 'MYUERNAME';
LoginParams.Values['PASSWORD'] := 'MYPASSWORD';
當控制從數據庫注冊事件處理過程中返回時,這些參數被用來建立聯接。
18.3.1.3 建立應用程序特定的別名
TDatabase的Aliases描述了數據庫表的位置和數據庫服務器的聯接參數。通常都是在Delphi之外,運用BDE配置工具(BDECFG32.EXE)創建別名,並且別名被存在BDE 配置文件IDAPI32.CFG中。
用戶也可以用TDatabase創建只在應用程序中可用的別名,用TDatabase 創建的別名不會加進BDE配置文件中。任何DataSet部件可通過描述DatabaseName 屬性來使用這些別名。為了定制這些局部別名的參數,用鼠標左鍵雙擊TDatabase部件或從TDatabase部件中選擇Database Editor,Delphi就會打開數據庫屬性編輯器(Database Properties Editor)。
18.3.1.4 控制數據庫的聯接
TDatabase部件的Connected屬性,指示TDatabase部件是否建立與數據庫服務器的聯接。當應用程序打開數據庫中的表時,Connected被設置為True。將Connected 設為True就建立了數據庫的聯接。
1. 保持數據庫聯接
TDatabase的KeepConnection屬性描述當沒有數據庫表打開時是否要與保持數據庫的聯接。
如果應用程序需要在單個數據庫中多次打開關閉多個表時,將KeepConnection 置為True能使應用程序具備更好的性能。
當KeepConnection為True時,即使沒有表打開,應用程序也能保持數據庫的聯接。那麼就能重復打開和關閉數據庫表而不需每次進行聯接注冊。
2. 使用TSesstion控制聯接
TSesstion部件有一個面向整個應用程序的KeepConnections屬性。如果Session.KeepConnections為True,那麼用於所有TDatabase部件的數據庫聯接都是持久的。
TSession為應用程序提供數據庫聯接的全局控制。TSession中的Databases 屬性是Session中所有活躍數據庫組成的數組,DatabasesCount屬性描述活躍數據庫的數目。
3. 描述Net和Private目錄
TSession的NetFileDir屬性描述BDE網絡控制目錄的路徑。TSession的PrivateDir屬性描述存儲諸述處理局部SQL表達式的臨時文件的目錄的路徑。
18.3.1.5 獲取數據庫信息
TSession擁有許多讓用戶獲取數據庫有關的信息,每個方法都以TStringList 部件作為傳入參數,並將信息返回TStringList中。
1. GetAliasNames方法
聲明:procedure GetAliasNames(List: TStringList);
GetAliasNames方法消除List中的參數,並將所有已定義的BDE別名的名字寫入List。應用程序生成的別名不包括在內。
2. GetAliasParams方法
聲明:procedure GetAliasParams(const AliasName: String; List: TStringList);
GetAliasParams方法清除List的內容,並將BDE別名為AliaName的參數寫入List。
3. GetDatabaseNames方法
聲明:procedure GetDatabaseNames(List: TStrings);
GetDatabaseNames方法清除List的內容並將所有BDE別名和應用程序定義的別名的名字寫入List。
4. GetDriverNames方法
聲明:procedure GetDriverNames(List: TStrings);
GetDriverNames方法清除List中的內容,並將BDE當前安裝的驅動程序名寫入List。
5. GetDriverParams方法
聲明:procedure GetDriverParams(const DriverName: String; List: TStrings);
GetDriverParams方法消除List中的內容,並將名為DriveName驅動程序缺省參數寫入List。
6. GetTableNames方法
聲明:procedure GetTableNames(const DatabaseName, Pattern: Strings;
Extensions, SystemTable: Boolean; List: TStrings);
GetTableNames方法消除List中的內容,並將名為DatabaseName的數據庫中的所有表的名字寫入List。Pattern參數將限制表名。對於SQL服務器,將SystemeTables設為True將獲取系統表和用戶表。對非SQL數據庫,將Extensions設為True將在表名中包含擴展名。
18.3.2 處理Client/Server事務控制
使用隱式控制和顯示控制的數據庫應用中有兩種方法管理事務控制:
● 運用TDatabase部件的屬性和方法進行顯式控制
● 運用TQuery部件的傳遞式SQL控制事務
Delphi還支持Paradox和dBASE表的局部事務處理
18.3.2.1 事務控制概述
當用Delphi創建數據庫應用時,Delphi提供了用為所有數據庫訪問的事務控制。
事務是這樣一組操作,在被提交前,它們對一個或多個數據庫的操作,必須全部執行成功。如果其中一個操作失敗,則所有操作失敗,即事務具有原子性。
即使發生硬件失敗,事務也要保證數據庫一致性。當允許多用戶並發訪問時,事務還要維持數據完整性。
例如:一個應用程序可能更新ORDERS表以指明接受購買某一項目的定單,那麼也要更新INNENTORY表以反映庫存的減少。如果在第一個更新之後,第二個更新之前發生硬件錯誤,數據庫就會處於不一致狀態,因為庫存情況沒有反映定單情況。在事務控制下,兩個表達式將在同一時間提交,如果其中一個表達式失敗,則被返轉(Rolled Back)。