多層資料庫開發五:串連資料庫

來源:互聯網
上載者:User
第五章 串連資料庫
  在資料庫應用程式中,TDatabase構件是很有用的。它能夠管理和操縱資料庫的串連,控制資料庫連接的持久性。TDatabase構件還提供了管理事務和申請更新資料的功能。
  第三章已經詳細介紹了TSession與TDatabase的關係,所有的資料庫連接都在TDatabase構件的控制之下,而所有的TDatabase構件又在BDE會話期對象的管理之下。
5.1 永久和臨時的TDatabase構件
  很多情況下,其實並沒有必要顯式地使用TDatabase 構件。當應用程式試圖開啟一個資料庫時,會自動建立一個臨時的TDatabase構件。當然,這個臨時的TDatabase 構件只在資料庫連接期間是有效,一旦關閉了資料庫,這個臨時的TDatabase 構件將被刪除。
  不過,在有的資料庫應用程式尤其是兩層或多層的Client/Server應用程式中,最好還是顯式地使用TDatabase構件。凡是在設計期加到表單或資料模組上的TDatabase構件,我們稱為永久的TDatabase構件,這是相對臨時的TDatabase構件而言的。
  使用永久的TDatabase構件的好處是,可以建立永久的串連,具有管理事務的能力,可以建立應用程式專用的BDE別名,還可以響應OnLogin事件。
  臨時的TDatabase構件的功能就有某種程度的局限,它的有些關鍵屬性受制於它所屬的BDE會話期對象,例如,BDE會話期對象的KeepConnections屬性決定了當所有資料集都關閉後資料庫是否繼續維持在串連狀態。而永久的TDatabase構件的KeepConnections 屬性則不受BDE會話期對象的KeepConnections屬性的影響。
  有時候,往往很難確定到底需要用幾個TDatabase構件,而您又不希望用臨時的TDatabase構件來代替,這時候,就需要在運行期動態地建立TDatabase構件。
  要在運行期動態地建立TDatabase構件,首先要聲明一個TDatabase類型的變數,然後調用TDatabase的Create函數來建立TDatabase的對象執行個體。程式樣本如下:
Function RunTimeDbCreate(const DatabaseName, SessionName: string): TDatabase;
var
TempDatabase: TDatabase;
Begin
TempDatabase := nil;
Try
Sessions.OpenSession(SessionName);
With Sessions Do
Begin
With FindSession(SessionName) Do
Result := FindDatabase(DatabaseName);
If Result = nil then
Begin
TempDatabase := TDatabase.Create(Self);
TempDatabase.DatabaseName := DatabaseName;
TempDatabase.SessionName := SessionName;
TempDatabase.KeepConnection := True;
End;
Result := OpenDatabase(DatabaseName);
End;
Except
TempDatabase.Free;
Raise;
End;
End;
  可以這樣調用RunTimeDbCreate函數:
var
MyDatabase: array [1..10] of TDatabase;
MyDbCount: Integer;
Begin
MyDbCount := 1;
...
MyDatabase[MyDbCount]:=RunTimeDbCreate('MyDb'+IntToStr(MyDbCount),'');
Inc(MyDbCount);
...
End;
5.2 控 制 連 接
  無論是永久的TDatabase構件還是臨時的TDatabase構件,都可以通過它們的屬性、方法和事件來控制有關串連資料庫的行為,這也是使用TDatabase構件的主要目的。
5.2.1 指定一個BDE會話期
  所有的TDatabase構件都必須指定一個它所屬的BDE會話期,這就要用到兩個屬性,一個是SessionName,另一個是Session。
  SessionName屬性用於指定一個BDE會話期的名稱。當在設計期把一個TDatabase構件放到表單或資料模組上時,它的SessionName屬性自動設為“Default”,這是預設的BDE會話期的名稱。如果您已經在表單或資料模組上放了若干個TSession構件,您就可以從一個下拉式清單中選擇SessionName屬性的值。
  Session屬性是唯讀,用於返回TDatabase構件所屬的BDE會話期對象。如果SessionName屬性設為空白或“Default”,Session屬性就返回預設的BDE會話期對象。
  通過Session屬性返回BDE會話期對象後,您就可以訪問TSession的屬性、方法和事件,即使您不知道該BDE會話期對象的實際名稱。
5.2.2 指定要訪問的資料庫
  要指定一個資料庫,就要用到AliasName屬性或DriverName屬性。這兩個屬性是互斥的,設定其中一個,另一個就被清空。修改AliasName、DriverName、DatabaseName等屬性之前都要先把Connected屬性設為False,否則將觸發異常。
  AliasName屬性用於指定一個資料庫的別名,只能設為已有的BDE別名如DBDEMOS、DefaultDB、IBLOCAL等。
  資料庫的別名一般是用SQL Explorer或BDE管理程式定義的。不過,也可以用DatabaseName屬性定義一個應用程式專用的別名。DatabaseName屬性可以設為一個已有的BDE別名。對於Paradox和dBASE表來說,也可以設為表所在的路徑。
  用DatabaseName屬性定義的別名只限於在本應用程式中使用,它將出現在TTable、TQuery、TStoredProc構件的DatabaseName屬性的下拉式清單中。
  DriverName屬性用於指定一個資料庫驅動程式的類型,可以設為STANDARD(用於dBASE和Paradox)、MSSQL、INTERBASE、ORACLE、SYBASE、INFormIX等。設定了DriverName屬性後,還得設定Params屬性指定串連參數。
  資料庫驅動程式其實是BDE別名的一個參數。因此,設定了AliasName屬性後,DriverName就會自動清空。反之,設定了DriverName 屬性後,AliasName屬性也會自動清空,否則就會出現矛盾。這樣看來,DriverName屬性似乎作用不大,只要設定AliasName屬性就夠了。不過,當DatabaseName屬性定義一個應用程式專用的別名時,需要設定DriverName屬性指定該別名使用什麼驅動程式。
  在設計期,要指定一個BDE別名或者資料庫驅動程式或者定義一個專用的別名,既可以在對象觀察器中進行,也可以雙擊TDatabase構件開啟資料庫屬性編輯器,然後在“Name”框內設定DatabaseName屬性的值,在“Alias Name”框內設定Alias屬性的值,在“Driver Name”框內設定DriverName屬性的值。
  也可以在運行期設定DatabaseName、AliasName或DriverName屬性的值,例如:
  Database1.DatabaseName := Edit1.Text;
5.2.3 設定BDE別名的參數
  要設定BDE別名的參數,如路徑、伺服器名、緩衝長度、語言驅動程式、使用者名稱、口令等,就要用到Params屬性。
  在設計期,要設定BDE別名的參數有三種方式:
  一是使用SQL Explorer或BDE Administrator來定義或修改別名以及參數。
  二是在對象觀察器中單擊Params屬性邊上的省略符號按鈕開啟字串列表編輯器,然後按格式鍵入參數的名稱和值。
  三是雙擊TDatabase構件開啟資料庫屬性編輯器,5.1所示。
  圖5.1 設定BDE別名的參數
  單擊“Defaults”按鈕將在“Parameter Overrides”框內列出與驅動程式所對應的預設參數,對於dBASE和Paradox來說,預設的參數主要是路徑,對於遠程伺服器來說,預設的參數就多了,包括伺服器名、使用者名稱和口令、語言驅動程式等。
  單擊“Clear”按鈕可以把“Parameter Overrides”框實際上就是Params屬性清空。
  可以直接在“Parameter Overrides”框內修改參數,也可以添加新的參數。
  要在運行期設定BDE別名的參數,就要用到TStrings對象。從圖5.1也可以看出,Params屬性實際上是一個字串列表,每個字串的格式是“名稱=值”。程式樣本如下:
With Database1 Do
Begin
Params.Clear;
Params.Add('UserName = Sysdba');
Params.Add('Password = 1234');
LoginPrompt := False;
Open;
End;
5.2.4 登入到伺服器
  大多數伺服器都有嚴密的安全措施,以防止未授權的訪問。對於使用者來說,他面臨的第一道關卡就是登入,即輸入使用者名稱和口令。
  在設計期,當試圖串連一個遠程伺服器時,Delphi 4會推出一個標準的登入對話方塊,讓您輸入使用者名稱和口令。
  在運行期,有三種方式進行登入:
  第一種方式是把LoginPrompt屬性設為True,這樣,當需要串連遠程伺服器時,就會自動彈出一個標準的登入對話方塊,讓使用者輸入使用者名稱和口令。
  第二種方式是把LoginPrompt屬性設為False,並且設定Params屬性,其中應包含“USER NAME”和“PASSWORD”參數,例如:
  USER NAME=SYSDBAPASSWORD=masterkey
  注意:在程式中通過代碼提供使用者名稱和口令容易泄密,建議最好不要用這種方式。
  第三種方式就是在處理OnLogin事件的控制代碼中設定LoginParams參數,程式樣本如下:
  LoginParams.Values['USER NAME'] := UserName;
  LoginParams.Values['PASSWORD'] := PasswordSearch(UserName);
  當退出處理OnLogin事件的控制代碼時,LoginParams參數的值就被賦給Params屬性。
5.2.5 開始串連資料庫伺服器
  要開始串連資料庫伺服器,可以調用Open函數或者把Connected屬性設為True。實際上,把Connected屬性設為True會自動調用Open。此時,會觸發OnLogin事件。如果程式沒有處理OnLogin事件,就會彈出一個標準的登入對話方塊讓使用者登入。
  如果在沒有串連伺服器的情況下試圖開啟一個資料集,將首先調用Open函數串連伺服器,並根據需要自動建立一個臨時的TDatabase構件。
  一旦與伺服器建立了串連,只要至少有一個資料集是活動的,串連就會一直保持。如果所有的資料集都不處於活動狀態,是否中斷連線取決於KeepConnections屬性的值。
  如果KeepConnections屬性設為True,即使沒有一個資料集處於活動狀態,也保持串連,對於那些頻繁地開啟和關閉資料集的應用程式來說,可以避免老是登入。如果KeepConnections屬性設為False,當所有的資料集都關閉了時,將斷開與伺服器的串連。
  要中斷連線,就要調用Close或者把Connected屬性設為False。實際上,把Connected屬性設為False會自動調用Close。
  Close會自動關閉所有的資料集,然後中斷連線。如果只想關閉所有的資料集,但不想中斷連線,首先要把KeepConnections屬性設為True,然後調用CloseDataSets函數。
  注意:即使KeepConnections屬性設為True,調用Close函數總是能中斷連線。
5.2.6 網路通訊協定和ODBC
  Delphi 4用BDE和SQL Links驅動程式來串連資料庫伺服器,其中,BDE還可以驅動ODBC訪問更廣泛的資料來源。
  在配置SQL Links和ODBC驅動程式時要注意網路通訊協定的問題。大部分情況下,網路通訊協定由資料庫伺服器的用戶端軟體來配置,但對於ODBC來說,還需要在專門的ODBC管理程式中配置網路通訊協定。
  剛開始串連伺服器時往往很難成功,這時候首先要檢查用戶端軟體是否正確配置,如果使用TCP/IP協議的話,要檢查是否安裝了支援TCP/IP協議的軟體如WINSOCK.DLL,伺服器的IP地址是否在用戶端的HOSTS檔案中註冊,網域名稱服務 (DNS)是否正確配置。
5.3 遍曆一個資料庫的所有資料集
  TDatabase構件的DataSets屬性和DataSetCount屬性配合起來使用可以遍曆一個資料庫的所有資料集。
  DataSets屬性是一個數組,它的每一個元素是一個活動的資料集如TTable、TQuery或TStoredProc,每個資料集都可以通過序號來訪問。
  DataSetCount屬性返回DataSets數組中元素的個數,程式樣本如下:
var
I: Integer;
Begin
For I := 0 to DataSetCount - 1 Do
If DataSets[I] is TTable then
DataSets[I].CachedUpdates := True;
End;
5.4 TDatabase與TSession的關係
  TDatabase構件主要用於管理資料庫的串連,而TSession則用於對一個應用程式中的TDatabase構件進行全域控制,包括臨時的TDatabase構件。
  TSession的方法往往是針對所有的TDatabase構件的,它不考慮TDatabase構件的狀態。例如,TSession的DropConnections函數將關閉所有的資料集,並斷開所有的資料庫,即使這些TDatabase構件的KeepConnections屬性設為True。
  而TDatabase只能管理它所串連的資料庫,例如,TDatabase的CloseDataSets函數只關閉某個資料庫的所有資料集,不關閉其他資料庫的資料集。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.