国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

多層數據庫開發五:連接數據庫

2019-11-18 18:11:18
字體:
來源:轉載
供稿:網友
  第五章 連接數據庫
  在數據庫應用程序中,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文件中注冊,域名服務是否正確配置。
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函數只關閉某個數據庫的所有數據集,不關閉其他數據庫的數據集。

上一篇:多層數據庫開發六:什么是數據集

下一篇:多層數據庫開發四:BDE會話期

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 修文县| 开阳县| 西和县| 瑞丽市| 青龙| 分宜县| 资中县| 博客| 海宁市| 张掖市| 启东市| 黑水县| 三江| 保康县| 荆门市| 乌兰浩特市| 资源县| 永靖县| 赤壁市| 平远县| 肥城市| 长汀县| 元氏县| 卓资县| 富宁县| 禹城市| 勐海县| 达州市| 广昌县| 贵南县| 阳城县| 上林县| 封丘县| 德州市| 滦南县| 夏邑县| 游戏| 浦北县| 河东区| 湘阴县| 云林县|