本章要点
Delphi的数据库开发功能
数据库组件
数据库应用程序开发步骤
数据库应用程序设计举例
QReport组件和报表的制作
具有强大的数据库应用程序开发功能,是Delphi的一大特色,也是Delphi受到普遍欢迎的重要原因之一。
本章介绍Delphi的数据库功能和进行数据库应用程序设计的方法。
12.1Delphi数据库功能概述
12.1.1数据库系统
信息技术的发展使得数据库的应用越来越普及,数据库应用系统的开发成为软件开发的重要领域。
数据库系统主要由三大部分组成:
数据库;
数据库管理系统(DBMS);
数据库应用程序。
这3部分的关系如图12-1所示。
数据库是按某种形式组织在一起的相关数据的集合,由很多数据文件和辅助文件组成。
按数据库的模型分,数据库有3种类型:关系数据库、网状数据库和层次数据库。现在用得最多的是关系数据库。
在关系数据库中,一个数据库是由若干个表、索引及视图等其他数据库元素组成的。
一个表就是一组相关数据的按行排列,就像是一张二维表格一样,每一行是一个数据记录。
同一个表中的记录都有相同的结构,都由若干个相同的字段组成,表的每一列是一个字段,每个字段有各自的属性。
数据库管理系统负责数据库信息的管理和维护。现在应用的数据库管理系统有若干种,个人桌面数据库管理系统有dBASE、FoxPro及VisualFoxPro、Access、Paradox等,大型数据库管理系统有Sybase、Oracle、Informix、SQLServer等。
数据库应用程序是用某种开发工具开发的获取、处理、显示、更新数据库数据信息的应用程序。现在比较流行的数据库应用程序开发工具有VisualBasic、VisualC++、PowerBuilder、Delphi等。
数据库应用程序可以通过数据库管理系统,对数据表中的数据记录进行选择、插入、删除、修改等操作。对关系数据库来说,操作是用专门的数据库语言SQL(StructuredQueryLanguge,结构化查询语言)完成的。
12.1.2Delphi的数据库功能
Delphi编程环境具有强大的数据库应用程序开发功能。在效率方面,它比VisualBasic高得多;在编程方面,它比VisualC++简单、快速。因此,Delphi成为越来越多的人进行数据库应用程序开发工具的首选。
Delphi强大的数据库功能主要体现在以下几个方面。
1.Delphi通过BDE支持几乎所有的数据库类型Delphi数据库应用程序不能直接访问数据库,而是通过Delphi带有的BDE(BorlandDatabaseEngin,Borland数据库引擎)对数据库资源进行访问的。
BDE可以对一些本地数据库进行直接的访问,如dBASE、FoxPro、Paradox、Access、InterBase等;也可以与SQLLinks连接,访问一些远程数据库,如Oracle、Sybase、Informix、SQLServer、DB2、Interbase等;还可以通过ODBC(OpenDatabaseConnectivity,开放式数据库连接)访问具有ODBC接口的数据库系统。因此,Delphi应用程序通过BDE,就可以访问几乎所有的数据库类型。
于是Delphi数据库应用程序的体系结构,可以表示为图12-2。
2.Delphi编程环境集成了多种数据库开发工具
为了便于用户开发Delphi数据库应用程序,Delphi编程环境集成了多种数据库开发工具,可用于各个阶段应用程序的开发。这些开发工具除了BDE之外,还有DatabaseDesktop、DatabaseExplorer或SQLExplorer、SQLMonitor、DatabaseFormWizard等。这些工具中,DatabaseFormWizard只能从Delphi集成开发环境菜单栏的【Database】→【FormWizard】
菜单项启动,其他工具既可以从Delphi集成开发环境菜单栏的【Database】或【Tools】中的相应菜单项启动,也可以直接从系统菜单【开始】→【程序】→【BorlandDelphi6】中的相应菜单项启动。
1)DatabaseDesktop(数据库桌面)
【DatabaseDesktop】是一个很有用的数据库管理工具,可以用来建立数据表,输入、修改、删除、查询数据表中的数据。
执行【Tools】→【DatabaseDesktop】菜单命令,就可以启动【DatabaseDesktop】。
关于【DatabaseDesktop】的使用,后面还要做详细介绍,这里就不赘述了。
2)DatabaseExplorer(数据库浏览器)
在Delphi企业版或专业版中,【DatabaseExplorer】被称为【SQLExplorer】。
这是一个功能较强的数据库实用工具,可以对数据库进行访问,也可以对数据库的别名进行维护。
执行【Database】→【Explorer】菜单命令,就可以启动【SQLExplorer】,如图12-3所示。
3)SQLMonitor(SQL监视器)
【SQLMonitor】是一个SQL指令监视器,可以记录SQL指令执行时的信息。
执行【Database】→【SQLMonitor】菜单命令,就可启动【SQLMonitor】,如图12-4所示。
4)DatabaseFormWizard(数据库窗体向导)
【DatabaseFormWizard】是高效、简便进行数据库应用程序设计的工具,利用它可以生成满足一般要求的数据库应用程序框架。
执行【Database】→【FormWizard】菜单命令,就可以启动【DatabaseFormWizard】,如图12-5所示。
3.Delphi提供了大量的数据库组件
为了方便地实现数据库访问的各种功能,Delphi提供了大量的数据库组件,而且随着Delphi版本的升级,数据库组件的数量越来越多。到Delphi6,在组件模板中共有9个选项卡、90多个组件是用于数据库的。按传统叫法,其中用得最多的组件有两大类:数据访问组件和数据控制组件。
顾名思义,数据访问组件是用于访问数据库的,它们通过BDE和数据库链接,实现对数据库的访问。数据访问组件是不可视组件。
常用的数据访问组件有Table(表)组件、Query(查询)组件、StoredProc(存储过程)组件和DataSource(数据源)组件。
通常,其中的Table(表)组件、Query(查询)组件和StoredProc(存储过程)组件又被称为DataSet(数据集)组件,它们位于组件模板的【BDE】选项卡中。每个数据集组件都通过BDE和一个数据表相连接,把从BDE取得的数据提供给DataSource组件。
DataSource(数据源)组件位于组件模板的【DataAccess】选项卡中,负责连接数据集组件和数据控制组件,每个数据源组件要有一个数据集组件与之相连,把从数据集组件传送来的数据传送给相应的数据控制组件。
这一点Delphi5和Delphi6不同。在Delphi5中,数据访问组件位于组件模板的【DataAccess】(数据访问)选项卡中(Delphi5中,没有BDE选项卡)。从组件在Delphi6组件模板中的位置分类,似乎应该分别称为BDE组件和数据访问组件更合适。为同以前版本的叙述一致,本书仍一并称为数据访问组件。
数据控制组件位于【DataControl】选项卡中,是可视组件。数据控制组件用于设计数据库应用程序界面,把从数据访问组件取得的数据,以各种可视的方式提供给用户浏览、修改、删除等。
综上所述,数据访问组件和数据控制组件在数据库应用程序中的位置如图12-6所示。
图12-6数据访问组件和数据控制组件在数据库应用程序中的位置掌握数据库组件的功能及它们的使用方法,是设计数据库应用程序的基础,后面有关章节将专门介绍这些内容。
12.2常用数据库组件
本节将介绍最常用的数据访问组件和数据控制组件,另外一些组件放到后面有关章节再进行介绍。
12.2.1DataSet(数据集)组件
1.Table组件
Table组件在组件模板的【BDE】选项卡中(Delphi5中是在【DataAccess】选项卡),它通过BDE直接与数据表连接,实现对数据表的访问,是数据库应用程序中最常用的组件之一。
1)Table组件的属性
(1)DatabaseName属性
DatabaseName属性用于指定Table组件要访问的数据库,可以是数据库的名字,也可以是BDE定义的数据库的别名。该属性的属性值可以在对象检查器的属性值栏的编辑框中直接输入,也可以在其下拉列表中选择。
(2)TableName属性
TableName属性用于指定由DatabaseName属性确定的数据库中Table组件要访问的数据表的名称。该属性的属性值可以在对象检查器的属性值栏编辑框中直接输入,也可以在其下拉列表中选择。
(3)Active属性
Active属性决定Table组件的状态。该属性为布尔型属性,若属性值为True,则Table组件被激活,可以访问数据表;若其值为False,则不能访问数据表。在Table组件的DatabaseName属性和TableName属性设定之前,不能将该属性设置为True;反之,在将该属性设置为True之后,若修改DatabaseName属性或TableName属性,该属性自动变为False。
该属性可以在设计时设置,也可以在程序中设置,格式为:Table1.ActiveTrue或False。其默认值为False。
(4)IndexName属性
IndexName属性指定数据表的索引字段名。只有在设置了TableName属性后才能设置该属性。
(5)ReadOnly属性
ReadOnly属性决定是否可以对数据表中的数据进行修改。该属性为布尔型属性,若其值为False,则可以修改数据表中的数据;若其值为True,则不能修改数据表中的数据,而只能查看数据表中的数据。其默认值为False。
(6)Exclusive属性
Exclusive属性决定Table组件是否以独占方式打开数据表。该属性为布尔型属性,当其值为True时,则以独占方式打开数据表,即其他应用程序不能同时操作数据表;当其值为False时,则其他应用程序可以同时操作数据表。其默认值为False。
(7)RecordCount属性
RecordCount属性用于记录数据表中数据记录的个数。该属性为只读属性。
(8)FieldCount属性
FieldCount属性用于记录数据表的字段数。该属性为只读属性。
(9)BOF属性
一个数据表中有若干记录,对数据表的操作要用指针指明是针对表中哪个记录进行的。
数据表刚打开时,或者调用Table组件的First方法后,指针指向表的首记录,操作完一个记录,自动将指针指向下一个记录。
BOF属性指明当前指针是否指向数据表的首记录。该属性为只读布尔型属性,若当前指针指向数据表的首记录,则其值为True;否则,为False。
(10)EOF属性
EOF属性指明当前指针是否指向数据表的末记录。该属性为只读布尔型属性,若当前指针指向数据表的末记录,则其值为True;否则,为False。数据表的所有记录操作完,或者调用Table组件的Last方法后,指针指向末记录。
(11)MasterSource属性
当需要链接主数据表和明细数据表时,Table组件用该属性指定主数据表。
(12)MasterField属性
当需要链接主数据表和明细数据表时,Table组件用该属性指定链接数据表的字段。
2)Table组件的方法
(1)Open方法
Open方法打开Table组件中的数据表。相当于把Table组件的Active属性设置为True。
Table组件方法的调用格式同其他组件一样:Table1.Open;后面介绍的方法用同样的调用格式。
(2)Close方法
Close方法关闭Table组件中的数据表。相当于把Table组件的Active属性设置为False。
(3)Refresh方法
Refresh方法刷新Table组件中的数据表,重新从表中读取数据。
(4)First方法
First方法将指针移到数据表的首记录上。
(5)Last方法
Last方法将指针移到数据表的末记录上。
(6)Prior方法
Prior方法将指针向前移动一个记录。
(7)Next方法
Next方法将指针向后移动一个记录。
(8)MoveBy方法
MoveBy方法将指针移动到一个指定的位置,该方法的声明格式为:
functionMoveBy(Distance:Integer):Integer;参数Distance指定新的位置与当前指针的相对位置,返回指针实际的移动距离。
(9)AppendRecord方法
AppendRecord方法在数据表的最后添加一个新的记录,并将指针指向该记录。
该方法的声明格式为:
functionAppendRecord(constValues:arrayofconst);参数Values为记录的各个字段值。
(10)Append方法
Append方法在数据表的最后添加一个新的空记录,并将指针指向该记录。
(11)Insert方法
Insert方法在指针当前指向的记录前插入一个新的空记录,并将指针指向该记录。
(12)Delete方法
Delete方法删除当前指针指向的记录,并将指针指向下一个记录。
(13)Edit方法