在这一章里我们主要介绍Delphi的数据访问部件的层次结构、多部件之间的关系、部件的属性、方法、事件以及各部件的应用。这些部件包括: ● TSession部件
● 数据集部件(TTable和TQuery)
● TDatasource部件
● 字段对象TField
● 字段编辑器的使用
● TReport部件和TBatchMove部件
我们对这些部件的属性、方法和事件进行一般性的描述,读者在实际使用Delphi开发应用程序时,还可以通过联机帮助获得有关部件更详细的信息。
15.1 Delphi数据访问部件的层次结构
Delphi提供了强大的开发数据库应用程序的能力,它给用户提供了大量的数据访问部件。以方便程序设计人员开发数据库应用程序。这些部件中,有些部件继承了另一些部件的属性、方法和事件,也就是说多部件之间存在着继承和被继承的关系,各部件的这种关联便构成了一个层次结构
图15.1 Delphi数据访问部件的层次结构
TSession是全局性的部件,在应用程序运行时,它自动地建立,在设计阶段和运行过程中它是一个不可见的部件。
TDatabase部件是为开发客户/服务器数据库应用程序时,设置登录的数据库的有关参数的,它在数据访问部件页上。
TDataset部件是不可见的,TTable和TQuery部件是由它派生而来的,这两个部件一般被称为数据集部件,它们在数据访问部件页上。
TDatasource部件是连接数据集部件和数据浏览部件的桥梁,它在数据访问部件页上。
TFields部件对应于数据库表中的实际字段,它既可以在应用程序的运行过程中动态地生成也可以在程序设计阶段用字段编辑器创建。它是不可见的部件,在程序中我们可以通过TField部件来访问数据库记录的各个字段值。
15.2 Tsession部件及其应用
TSession部件一般用得较少,但它对于一些特殊的应用是很有用的,在每一个数据库应用程序运行时Delphi自动地创建一个TSession部件。程序设计人既不能看见该部件也不能显示地创建一个TSession 部件,但是我们可以在应用程序中全局性地使用TSession部件的属性、方法。
15.2.1 TSession部件的重要属性及作用
TSession部件的许多重要属性是用于控制数据库应用程序与数据库的连接的,在一个应用程序中,可以全局性地设置TSession的有关属性值,对与之相连接的磁盘上的数据库进行控制。TSession部件主要有下列属性:
Database属性:是TSession中可以进行连接的所有数据库的数据库名字列表,这些数据库的名字常常是实际数据库的别名,包括数据库的路径、用户名、用户登录口令等参数。
DatabaseCount属性:是TSession中可以进行连接的所有数据库的数量,它是一个整数。
KeepCounnections属性:是一个布尔型属性,用它说明应用程序是否保持与一个非活动数据库的连接。因为对于一个数据库,当该数据库中没有相应的数据集部件(TTable或TQuery)被打开时,该数据库将自动地变成非活动的数据库。缺省情况下,KeePcounnections的值是True,就是说应用程序总是保持着与数据库的连接,即使数据库变成了非活动的数据库时,也是如此。如果将KeepConnections属性设置成False,那么当数据库由活动状态变成非活动状态时,应用程序与该数据库的连接也随之中断。
NetFileDir属性:说明BDE网络控制文件的路径名。
PrivateDir属性:说明存取临时文件的路径名。
15.2.2 TSession部件的方法:
TSession部件中的大部分方法是用于向用户提供与应用程序相连接的数据库的信息,如数据库的名字及别名,数据库中的表名以及数据库引擎BDE的有关参数等,在设计数据库应用程序时,想要获取有关数据库的信息,调用TSession部件的下列方法,将会大大简化程序的设计。
GetAliasNames方法:调用该方法,我们可以获得数据库引擎BDE中定义的数据库别名。
GetAliasParams方法:该方法主要用于获取我们在BDE中定义数据库别名时所说明的参数值,如BDE所在的目录路径以及实际名称等。
GetDatabaseNames 方法:调用该方法可以帮助我们获得当前应用程序可以进行连接的所有数据库的名字,数据库的名字是用户使用BDE工具定义的实际数据库的别名。
GetDriverNames方法:数据库引擎BDE可以与多种数据库管理系统相连接,如客户/服务器数据库管理系统Oracle、Sybase以及本地数据库管理系统dBASE,Paradox等,BDE与每一种数据库管理系统进行连接时,都有相应的驱动程序,而且这些驱动程序都可以选择地安装。通过调用GetDriverNames方法。我们可以获得当前BDE安装的数据库驱动程序的名字。
GetDriverParams方法:BDE的数据库驱动程序中包含着多个参数,如支持的民族语言、DBMS的版本号、文件块大小等,对于服务器上的DBMS,还有数据库服务器的名字等等。
GetTableNames方法:因为每一个数据库都是由多个数据库表组成的,我们通过说明数据库名,然后调用GetTableNames方法,便可以获得该数据库中全部的数据库表的名字。
上述这些方法在调用时都需要一个字符串列表作为参数,而且都返回一个字符串列表的值。
TSession部件还有一个叫DropConnections的方法用于控制应用程序与数据库的连接,当调用DropConnections方法时,应用程序与所有的数据库的连接将会切断。
15.2.3 TSession部件应用举例
例15.1:我们创建一个应用程序,通过调用TSession有关的方法获取当前应用程序可以进行连接的数据库的名字以及获取其中任意一个数据库中的全部数据库表的名字。
通过TSession部件获取数据库的有关信息
窗体中主要使用了两个列表框,其中列表框DatabaselistBox用于显示数据库的名字,列表框TablelistBox用于显示数据库中的表名。程序运行完后数据库的名字显示在DatabaselistBox列表框中,当用户单击DatabaselistBox列表框中的数据库名时,该数据库全部的数据库表的名字将会显示在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] 下一页
|