在這一章里我們主要介紹Delphi的數(shù)據(jù)訪問部件的層次結(jié)構(gòu)、多部件之間的關系、部件的屬性、方法、事件以及各部件的應用。這些部件包括: ● TSession部件
● 數(shù)據(jù)集部件(TTable和TQuery)
● TDatasource部件
● 字段對象TField
● 字段編輯器的使用
● TReport部件和TBatchMove部件
我們對這些部件的屬性、方法和事件進行一般性的描述,讀者在實際使用Delphi開發(fā)應用程序時,還可以通過聯(lián)機幫助獲得有關部件更詳細的信息。
15.1 Delphi數(shù)據(jù)訪問部件的層次結(jié)構(gòu)
Delphi提供了強大的開發(fā)數(shù)據(jù)庫應用程序的能力,它給用戶提供了大量的數(shù)據(jù)訪問部件。以方便程序設計人員開發(fā)數(shù)據(jù)庫應用程序。這些部件中,有些部件繼承了另一些部件的屬性、方法和事件,也就是說多部件之間存在著繼承和被繼承的關系,各部件的這種關聯(lián)便構(gòu)成了一個層次結(jié)構(gòu)
圖15.1 Delphi數(shù)據(jù)訪問部件的層次結(jié)構(gòu)
TSession是全局性的部件,在應用程序運行時,它自動地建立,在設計階段和運行過程中它是一個不可見的部件。
TDatabase部件是為開發(fā)客戶/服務器數(shù)據(jù)庫應用程序時,設置登錄的數(shù)據(jù)庫的有關參數(shù)的,它在數(shù)據(jù)訪問部件頁上。
TDataset部件是不可見的,TTable和TQuery部件是由它派生而來的,這兩個部件一般被稱為數(shù)據(jù)集部件,它們在數(shù)據(jù)訪問部件頁上。
TDatasource部件是連接數(shù)據(jù)集部件和數(shù)據(jù)瀏覽部件的橋梁,它在數(shù)據(jù)訪問部件頁上。
TFields部件對應于數(shù)據(jù)庫表中的實際字段,它既可以在應用程序的運行過程中動態(tài)地生成也可以在程序設計階段用字段編輯器創(chuàng)建。它是不可見的部件,在程序中我們可以通過TField部件來訪問數(shù)據(jù)庫記錄的各個字段值。
15.2 Tsession部件及其應用
TSession部件一般用得較少,但它對于一些特殊的應用是很有用的,在每一個數(shù)據(jù)庫應用程序運行時Delphi自動地創(chuàng)建一個TSession部件。程序設計人既不能看見該部件也不能顯示地創(chuàng)建一個TSession 部件,但是我們可以在應用程序中全局性地使用TSession部件的屬性、方法。
15.2.1 TSession部件的重要屬性及作用
TSession部件的許多重要屬性是用于控制數(shù)據(jù)庫應用程序與數(shù)據(jù)庫的連接的,在一個應用程序中,可以全局性地設置TSession的有關屬性值,對與之相連接的磁盤上的數(shù)據(jù)庫進行控制。TSession部件主要有下列屬性:
Database屬性:是TSession中可以進行連接的所有數(shù)據(jù)庫的數(shù)據(jù)庫名字列表,這些數(shù)據(jù)庫的名字常常是實際數(shù)據(jù)庫的別名,包括數(shù)據(jù)庫的路徑、用戶名、用戶登錄口令等參數(shù)。
DatabaseCount屬性:是TSession中可以進行連接的所有數(shù)據(jù)庫的數(shù)量,它是一個整數(shù)。
KeepCounnections屬性:是一個布爾型屬性,用它說明應用程序是否保持與一個非活動數(shù)據(jù)庫的連接。因為對于一個數(shù)據(jù)庫,當該數(shù)據(jù)庫中沒有相應的數(shù)據(jù)集部件(TTable或TQuery)被打開時,該數(shù)據(jù)庫將自動地變成非活動的數(shù)據(jù)庫。缺省情況下,KeePcounnections的值是True,就是說應用程序總是保持著與數(shù)據(jù)庫的連接,即使數(shù)據(jù)庫變成了非活動的數(shù)據(jù)庫時,也是如此。如果將KeepConnections屬性設置成False,那么當數(shù)據(jù)庫由活動狀態(tài)變成非活動狀態(tài)時,應用程序與該數(shù)據(jù)庫的連接也隨之中斷。
NetFileDir屬性:說明BDE網(wǎng)絡控制文件的路徑名。
PrivateDir屬性:說明存取臨時文件的路徑名。
15.2.2 TSession部件的方法:
TSession部件中的大部分方法是用于向用戶提供與應用程序相連接的數(shù)據(jù)庫的信息,如數(shù)據(jù)庫的名字及別名,數(shù)據(jù)庫中的表名以及數(shù)據(jù)庫引擎BDE的有關參數(shù)等,在設計數(shù)據(jù)庫應用程序時,想要獲取有關數(shù)據(jù)庫的信息,調(diào)用TSession部件的下列方法,將會大大簡化程序的設計。
GetAliasNames方法:調(diào)用該方法,我們可以獲得數(shù)據(jù)庫引擎BDE中定義的數(shù)據(jù)庫別名。
GetAliasParams方法:該方法主要用于獲取我們在BDE中定義數(shù)據(jù)庫別名時所說明的參數(shù)值,如BDE所在的目錄路徑以及實際名稱等。
GetDatabaseNames 方法:調(diào)用該方法可以幫助我們獲得當前應用程序可以進行連接的所有數(shù)據(jù)庫的名字,數(shù)據(jù)庫的名字是用戶使用BDE工具定義的實際數(shù)據(jù)庫的別名。
GetDriverNames方法:數(shù)據(jù)庫引擎BDE可以與多種數(shù)據(jù)庫管理系統(tǒng)相連接,如客戶/服務器數(shù)據(jù)庫管理系統(tǒng)Oracle、Sybase以及本地數(shù)據(jù)庫管理系統(tǒng)dBASE,Paradox等,BDE與每一種數(shù)據(jù)庫管理系統(tǒng)進行連接時,都有相應的驅(qū)動程序,而且這些驅(qū)動程序都可以選擇地安裝。通過調(diào)用GetDriverNames方法。我們可以獲得當前BDE安裝的數(shù)據(jù)庫驅(qū)動程序的名字。
GetDriverParams方法:BDE的數(shù)據(jù)庫驅(qū)動程序中包含著多個參數(shù),如支持的民族語言、DBMS的版本號、文件塊大小等,對于服務器上的DBMS,還有數(shù)據(jù)庫服務器的名字等等。
GetTableNames方法:因為每一個數(shù)據(jù)庫都是由多個數(shù)據(jù)庫表組成的,我們通過說明數(shù)據(jù)庫名,然后調(diào)用GetTableNames方法,便可以獲得該數(shù)據(jù)庫中全部的數(shù)據(jù)庫表的名字。
上述這些方法在調(diào)用時都需要一個字符串列表作為參數(shù),而且都返回一個字符串列表的值。
TSession部件還有一個叫DropConnections的方法用于控制應用程序與數(shù)據(jù)庫的連接,當調(diào)用DropConnections方法時,應用程序與所有的數(shù)據(jù)庫的連接將會切斷。
15.2.3 TSession部件應用舉例
例15.1:我們創(chuàng)建一個應用程序,通過調(diào)用TSession有關的方法獲取當前應用程序可以進行連接的數(shù)據(jù)庫的名字以及獲取其中任意一個數(shù)據(jù)庫中的全部數(shù)據(jù)庫表的名字。
通過TSession部件獲取數(shù)據(jù)庫的有關信息
窗體中主要使用了兩個列表框,其中列表框DatabaselistBox用于顯示數(shù)據(jù)庫的名字,列表框TablelistBox用于顯示數(shù)據(jù)庫中的表名。程序運行完后數(shù)據(jù)庫的名字顯示在DatabaselistBox列表框中,當用戶單擊DatabaselistBox列表框中的數(shù)據(jù)庫名時,該數(shù)據(jù)庫全部的數(shù)據(jù)庫表的名字將會顯示在TablelistBox列表框中。有關的程序代碼如下:
程序清單15.1
unit unit31;
interface
uses
SysUtils, Windows, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, DB, DBTables, Buttons, ComCtrls, Tabnotbk;
type
TQueryForm = class(TForm)
BitBtn1: TBitBtn;
DataSource1: TDataSource;
Table1: TTable;
GroupBox1: TGroupBox;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
ListBox3: TListBox;
TabSheet2: TTabSheet;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure ListBox2Click(Sender: TObject);
end;
var
QueryForm: TQueryForm;
implementation
{$R *.DFM}
uses RSLTFORM;
procedure TQueryForm.FormCreate(Sender: TObject);
begin
Screen.Cursor := crHourglass;
{ Populate the alias list }
with ListBox1 do
begin
Items.Clear;
Session.GetAliasNames(Items);
end;
{ Make sure there are aliases defined }
Screen.Cursor := crDefault;
if ListBox1.Items.Count < 1="" then="">
MessageDlg( 'There are no database aliases currently defined. You ' +
'need at least one alias to use this demonstration.',
mtError, [mbOK], 0 );
end;
procedure TQueryForm.ListBox1Click(Sender: TObject);
var
strValue: string; { Holds the alias selected by the user }
bIsLocal: Boolean; { Indicates whether or not an alias is local }
slParams: TStringList; { Holds the parameters of the selected alias }
iCounter: Integer; { An integer counter variable for loops}
begin
{ Determine the alias name selected by the user }
with ListBox1 do
strValue := Items.Strings[ItemIndex];
{ Get the names of the tables in the alias and put them in the
appropriate list box, making sure the user's choices are reflected
in the list. }
ListBox2.Items.Clear;
Session.GetTableNames(strValue, { alias to enumerate }
'', { pattern to match }
[1] [2] 下一頁
|