第 14章 数据库应用开发本章要点:
数据库的基本概念
Delphi中的 Database Desktop应用程序的使用
TTable组件的常用属性,方法,事件及其使用
TQuery组件的常用属性,方法,事件及其使用
常用的数据控制组件
SQL语言编程
14.1 循序渐进学理论
14.1.1 数据库的基本概念
1.数据库应用概述目前,人类社会已经进入了信息社会,用,信息爆炸,来描述这个社会的信息之多并不过分。对于非专业人员来说,没有必要区分信息和数据的概念,通常所说的信息处理也可以看成是数据处理,用计算机进行数据处理已经成为很多行业日常工作不可缺少的一个环节。数据库技术可以简单地理解为最新的数据处理技术,它已经深入到我们生活的方方面面,如果缺少了它,很难想象世界将会变成什么模样。
2.数据库的基本概念所谓数据库( Database DB),其实就是存放在计算机的外存储器中的相关数据的集合,可以形象地看作是数据的,仓库,,它是通过文件或类似于文件的数据单位组织起来的。数据库只是数据的集合,建立数据库的目的是为了使用数据库,为了对数据库中的数据进行存取,必须要使用一种软件 ——数据库管理系统( Database System Management——DBMS)。
一个完整的数据库系统由数据库、数据库管理系统、数据库应用程序、计算机软件和硬件系统以及
DBA组成。
3.数据模型与关系数据库有关表的性质:
( 1) 表中的每一列均不可再分;
( 2) 表中的每一列数据的数据类型是相同的;
( 3) 表中的两列不能取相同的名字;
( 4) 表中不允许有完全相同的两行,即任两条记录必须能够区分;
( 5)交换行和列的顺序,不改变表的含义。
14.1.2 利用数据库桌面创建数据库
1.数据库桌面的作用
Database Desktop(数据库桌面)是 Delphi 7.0自带的一个数据库管理工具,Database Desktop的主要作用如下:
( 1)创建和维护数据库
( 2)维护数据库别名
( 3)创建 SQL文件和执行 SQL命令
2 数据库的建立本节通过一个实际的通讯录数据库的建立来讨论在 Delphi中建立数据库的方法。
字段名 字段类型 字段宽度 说明好友号 Alpha 8 Alpha相当于字符型姓名 Alpha 10
好友类别 Alpha 10
年龄 Short 系统默认为 2 短整型出生日期 Date 由系统指定 日期型通讯地址 Alpha 30
邮政编码 Alpha 6
电话号码 Alpha 15
电子邮件 Alpha 15
QQ号码 Alpha 10
交往大事 Memo 系统默认 备注型存放大量文字创建一个 Paradox数据库表的步骤如下:
( 1)在,Database Desktop”应用程序中,执行 【 File】
→ 【 New】 → 【 Table】 命令,将会出现如图 14-2所示的选择表类型的对话框。在 【 Table type】 下面的列表框中可以选择表的类型。
图 14-2,选择表类型,对话框
( 2)选择默认的类型,Paradox 7”并单击 【 OK】
按钮,系统将弹出如图 14-3所示的创建表结构对话框。
在该对话框中可以定义表的结构,即表的每个字段的字段名、字段类型、字段宽度和主键等,并可建立索引。
( 3)在,Field Name”列的下面输入字段名,如
,好友号,,然后在,Type”列的下面单击右键,将会出现如图 14-4所示的,字段类型,下拉菜单。
图 14-3 【 创建表结构 】 对话框图 14-4 【 字段类型 】 下拉菜单创建了的多个字段
【 定义辅助索引 】 对话框 【 保存索引 】 对话框输入了几条记录的 【 通讯录 】 表数据库别名有两种:公共别名( Public Alias)和项目别名( Project Alias)。本书只讲公共别名,该别名保存在 BDE配置文件 IDAPI32.CFG中,在任何工作目录中都能访问,并且对任何使用 BDE的应用程序都是可见的。
通过为子目录,D:\DelphiApp\14”建立一个公共数据库别名 App14来说明数据库别名的创建方法。创建步骤如下:
( 1)在 Database Desktop应用程序中执行
【 Tools】 → 【 Alias Manager】 命令,将会出现如图
14-10所示的 【 Alias Manager】 对话框 。
3.数据库别名的建立图 14-10 【 Alias Manager】 对话框图 14-11 新建数据库别名的 【 Alias Manager】 对话框
14.1.3 利用 BDE组件开发数据库应用程序的模式
1,BDE组件
2,Data Access组件
3,Data Controls组件
14.1.4 TTable组件
1,TTable组件的常用属性
( 1) DatabaseName属性该属性用来指定要连接的物理数据库的名字,可以是数据库别名、数据表文件所在的磁盘路径。
( 2) TableName属性该属性用来设定 TTable组件所操作的数据表名称,
通常在 DatabaseName属性设置后设置。
( 3) TableType属性该属性用来设定与 TTable组件相连接的数据库表的类型。
( 4) Active属性该属性用来打开或关闭 TTable组件形成的数据集合,是一个逻辑型属性。
( 5) ReadOnly属性该属性是逻辑型属性,用来决定 TTable组件形成的数据集是否可以修改。
( 6) Modified属性该属性是一个只读属性,只能在程序运行中使用。
该属性用来表示数据表中的数据是否被修改过。
( 7) Fields属性该属性是一个数组属性,它的每一个元素代表着数据集的一个字段,是 Tfield类型的,本属性又称
Fields集合。
( 8) Bof属性该属性用来指示记录指针是否指向数据集的第一条记录。
( 9) Eof属性该属性用来指示记录指针是否指向数据集的最后一条记录。
2,TTable组件的常用方法
( 1) FieldByName方法该方法用于引用数据集中的某个字段,该方法的函数形式如下:
Function FieldByName(Const FieldName:string):Tfield
( 2)记录指针移动方法
TTable组件是一种数据集组件,数据集中有一个记录指针,它指向的记录称当前记录。可以通过移动记录指针来改变当前记录,用户一般对当前记录进行操作。记录指针移动的相关方法如表 14-2所示。
记录指针移动方法功 能
First方法将记录指针移到第一条记录的位置
Last方法将记录指针移到最后一条记录的位置
Prior方法将记录指针移到上一条记录的位置
Next方法将记录指针移到下一条记录的位置
MoveBy方法将记录指针从当前记录开始向前或向后移到若干条记录,格式为:
Function MoveBy(Distance:Integer):Integer;
参数 Distance可以为正负整数,如果为正整数则指针向表尾方向移动 Distance条记录,为负数则表示向表头方向移动 Distance的绝对值条记录表 14-2 TTable组件记录指针移动方法
( 3)查询记录的相关方法
① GotoKey方法该方法用于精确查找,GotoNearest方法用于不精确查找,是一个过程,没有返回值,它把记录指针定位于最接近于查找值的记录位置上。处理过程基本同 GotoKey。
② FindKey方法其格式如下,function FindKey(const
KeyValues,array of const),Boolean;
与 GotoKey方法的区别在于,GotoKey不带参数,
而 FindKey带有参数,其参数就是要索引查找的值。
( 4)数据操作的相关方法数据操作方法名称功能说明
Append 在数据表的末尾追加一条空记录,并将记录指针指向该记录
Insert 在当前记录之后插入一条空记录,并将记录指针指向该记录
Delete 删除当前记录,并将指针移向下一条记录
Edit 将数据表置于编辑状态,此时用户可以修改数据表中的数据
Poast 把对数据表数据的修改结果和新添加的数据保存到数据表中
Cancel 取消对数据表中数据的修改和添加
Refresh 根据数据表中的数据刷新界面,即重新从数据表中获取数据
EmptyTale 将数据表清空,即删除数据表中的所有记录
3,TTable组件的常用事件
( 1) Before××× 事件事 件 发生时机及作用
BeforeCancel 该事件在调用数据集的 Cancel方法时,在取消操作发生之前触发,是调用 Cancel方法发生的第一个动作
BeforeClose 在关闭数据集之前发生,是在数据集关闭之前发生的第一个动作
BeforeDelete 该事件在调用数据集的 Delete方法时,在删除操作发生之前触发,是调用 Delete方法发生的第一个动作,
通常用来对删除进行确认BeforeEdit 该事件在调用数据集的 Edit方法时,在把数据表置为编辑模式之前触发,是调用 Edit方法发生的第一个动作BeforeInsert 该事件在调用数据集的 Append或 Insert方法时,在插入或添加操作发生之前触发,是调用 Append或 Insert
方法发生的第一个动作BeforeOpen
在数据集被打开之前发生的第一个动作
BeforePost 该事件在调用数据集的 Post方法时,在更新操作发生之前触发,是调用 Post方法发生的第一个动作
( 2) After××× 事件事 件 发生时机和作用
AfterCancel 在调用 Cancel方法之后发生
AfterClose 在关闭数据集之后发生
AfterDelete 在数据集调用 Delete方法删除记录之后发生
AfterEdit 在数据集调用 Edit方法之后发生
AfterInsert 在数据集对 Insert或 Append方法调用之后发生
AfterOpen 在数据集被打开之后发生
AfterPost 在数据集调用 Post方法保存数据之后发生
( 3) On××× 事件事 件 发生时机和作用
OnNewRecor
d
在 添 加 一 个 新 的 记 录 时 被 触 发 。 该 事 件 在
BeforeInsert事件之后发生,在 AfterInsert事件之前发生 。
OnFilterRe
cord
该事件当数据集过滤器处于激活状态 ( Filter属性为
True) 并且将记录指针移到其他记录时发生
14.1.5 TDataSource组件的使用
TDataSource组件是使用最多的数据访问组件,
用来连接数据集组件和数据控制组件 。
TDataSource组件的属性比较少,最重要的是
DataSet属性。该属性指出要与哪一个数据集组件建立联系,它的属性值是某一个数据集组件的对象名称,
如,TTable,TQuery等组件的名称。 TDataSource组件通过 DataSet属性与数据集组件建立连接后,数据控制组件就可以借助 TDataSource组件与数据集组件(如
DBEdit和 DBGrid等组件)建立连接,这样就可以成功地访问数据库中的数据了。
14.1.6 常用的数据控制组件
1,TDBNavigator组件
TDBNavigator组件中各种按钮的功能如表
First
Prior
Next
Last
Insert
Deletee
Edit
Post
Cancel
Refresh
图 14-16 TDBNavigator组件及其按钮名称按钮名称 按钮功能
First 将数据集的记录指针移到第一条记录
Prior 将数据集的记录指针移到前一条记录
Next 将数据集的记录指针移到后一条记录
Last 将数据集的记录指针移到最后一条记录
Insert 在当前记录之后插入一条记录
Delete 删除当前记录,当 ConfirmDelete属性设置为 true时,会弹出删除确认对话框
Edit 使数据集处于编辑状态
Post 把对数据集的修改 ( Insert或 Edit),保存到实际的数据表中
Cancel 取消对数据集的修改
Refresh 根据数据表的内容,刷新数据组件中的数据
2,TDBGrid组件
TDBGrid组件是用于显示和编辑数据库表中记录信息的重要组件,该组件以列表的形式来显示数据库中的数据记录。它包含了数据的行和列。在网格中每一行代表数据集中的一行,每一列代表数据集中的一个字段。它的用法很简单,是最常用的数据控制组件之一。组件图标为,,。
3,TDBListBox组件 TDBComboBox组件
TDBListBox组件 TDBComboBox组件类似于
TListBox组件和 TComboBox组件,TDBListBox组件用于在一个列表中显示或设置字段的值,
TDBComboBox用来在一个文本框中显示或设置字段的值。
4,TDBImage组件该组件用来显示图像字段内容。它有三个重要属性,DataSource,DataField和 Stretch。
5,TDBCheckBox组件
( 1) ValueChecked属性该属性是字符串属性,当字段的内容与该属性值匹配时,该组件被选中 。
( 2) ValueUnchecked属性该属性也是字符串属性,当字段的内容与该属性值匹配时,该组件被清除。
6,TDBRadioGroup组件
( 1) Columns属性该属性用来设置排列单选按钮的列数,默认值为
1 。
( 2) Items属性用来设置单选按钮显示的文字。
( 3) Values属性与 Items属性一样,也是一个字符串列表,设置方法也是与 Items属性一样。表示相应单选按钮的值。
【 例 14-1】 编写一个通讯录维护程序,程序的设计界面如图
14-17所示,程序运行时单击 TDBNavigator组件的相应按钮将对通讯录表实现相应的操作,程序运行界面如图 14-18所示。
[实现分析 ]
可使用 TTable组件和数据控制组件来维护和操作数据库中的内容,使用 TTable组件和数据控制组件维护与操作数据库中数据的方法步骤如下:
( 1 ) 在 界 面 上 添 加 一 个 TTable 组件,通 过 设 置 它 的
DatabaseName和 TableName属性使它与某一个数据表联系在一起,
然后把它的 Active属性设置为 True;
( 2) 在界面上添加一个 TDataSource组件,设置它的 DataSet属性值为 ( 1) 中添加的 TTable组件的名称,以便能够通过它访问数据库中的数据;
( 3)在界面上添加数据控制组件,设置它的 DataSource属性值为( 2)中添加的 TDataSource组件的各称,设置它的 DataField
属性为要显示和设置的字段名称。
图 14-17 程序设计界面 图 14-18 程序运行界面
14.1.7 SQL语言
SQL语言是结构查询语言,是一种标准的关系数据库语言,
Delphi中提供了对 SQL语言的支持。对一般用户而言,在 Delphi
中使用的 SQL语言的功能主要有:
1.数据查询
[格式 ],SELECT [ALL | DISTINCT |TOP N|TOP N PERCENT]
*|列名 1或表达式 1 [AS 列标题 1 ] [,列名 2或表达式 2 [AS 列标题 2]… ]
FROM 表名 1 [ IN 数据库名 1] 别名 1[,表名 2 [ IN 数据库名 2]
别名 2 … ]
[WHERE 条件 ]
[GROUP BY列名 1 [,列名 2]… ]
[HAVING 条件 ]
[ORDER BY 列名 1 [ASC | DESC] [,列名 2 [ASC | DESC]…]]
例如,有语句:
Select 学号,姓名,年级 from 学生 Where 专业 ="自动化 "
其作用是,列出自动化专业的全部学生的学号,姓名和年级,。
又如,有语句:
SELECT 学生,学号,学生,姓名,必修课成绩,课号,必修课成绩,成绩
FROM 学生,必修课成绩 WHERE 学生,学号 =必修课成绩,
学号其作用是,查询出所有学生的必修课的学习情况,查询结果中包含学号、姓名、课号和成绩,。
2.插入记录
[格式 ],INSERT INTO 表名 [(字段名 1 [,字段名
2,… ])]
VALUES (表达式 1 [,表达式 2,…])
例如,有下列语句:
INSERT INTO 学生 ( 学号,姓名,专业 )
VALUES("040501","朱碧春 ","计算机软件 ")
其功能是向学生表中插入一条记录,并给学号、姓名和专业字段赋值。
3.修改记录
[格式 ],UPDATE 表名 SET 字段名 1 = 表达式 1[,字段名
2=表达式 2…] [WHERE 条件 ]]
例如,有以下语句:
UPDATE 必修课成绩 SET 成绩 =成绩 +3 WHERE 课号
="02"
其作用是将,必修课成绩,表中的,02”号课的所有成绩增加 3分。
4.删除记录
[格式 ],DELETE FROM 表名 [WHERE 条件 ]
例如,有以下语句:
DELETE FROM 学生 WHERE 专业 ="经济管理 "
其作用是从,学生,表中删除所有的,经济管理,专业的学生。
14.1.8 TQuery组件
1,TQuery组件的常用属性
( 1) DataBaseName属性该属性用来与数据库建立连接,可以是某个数据库别名或数据表所在的路径。
( 2) SQL属性与 TTable组件不同,TQuery组件是通过执行 SQL
语句来对数据表进行操作的,SQL属性中存放的就是
TQuery组件要执行的 SQL语句。
( 3) Active属性当该属性设置为 True时,将执行 SQL属性中存放的 SQL语句。
2,TQuery组件的常用方法
( 1) Open方法该方法用于打开或激活 TQuery组件的数据集。
( 2) ExecSQL方法该方法也是执行 TQuery组件中的 SQL语句。
( 3) Close方法该方法用来关闭数据集。
( 4) Prepare方法。
调用该方法,Delphi会将带参数的 SQL语句传送给对应的数据库引擎,对 SQL语句进行语法分析和优化,从而大大提高动态 SQL语句的执行性能 。
( 5) SQL属性的两个基本方法
① Add方法 该方法的语法格式如下:
Query.SQL.Add(SQLState);
例如有以下语句:
Query1.SQL.Add('Select * From 通讯录 ')
Query1.SQL.Add(' Where 好友类别 =''朋友 ''');//在前面 SQL语句基础上追加 SQL语句
② Clear方法例如:
Query1.Close;
//先关闭数据集
Query1.SQL.Clear;
//将 SQL属性值清空
Query1.SQL.Add('Select * From 通讯录 Where 姓名
=''李建东 ''');
//添加 SQL语句,在字符串里面用两个单引号表示一个单引号 。
Query1.Open;
//打开数据集,即执行 SQL语句
3.使用 TQuery组件实现参数查询的方法
( 1)使用 Params属性实现参数查询如有下列语句:
Query1.SQL.Add('Select * From 通讯录 ');
Query1.SQL.Add('Where姓名 =:XM'); //注意参数的前面有 ":"号
Query1.Params[0].AsString,='李建东 ';//给参数赋值
Query1.Open ; //打开查询结果数据集
( 2)使用 ParamByName方法实现参数查询如上述的语句也可以写成:
Query1.SQL.Add('Select * From 通讯录 ');
Query1.SQL.Add('Where姓名 =:XM'); //注意参数的前面有 ":"号
Query1.ParamsByName(''XM' ).AsString,='李建东 ';//给参数赋值
Query1.Open ; //打开查询结果数据集
【 例 14-2】 给定出生日期范围,查询通讯录表中出生日期在该范围内的好友的通讯录信息。程序的设计界面如图
14-19所示,程序的运行界面如图 14-20
所示。程序运行时在两个文本框中输入起始日期,然后按 【 查询 】 按钮将把出生日期在该范围之内的好友的通讯录信息显示在网格组件中,如图 14-20所示。
图 14-19 程序设计界面图 14-20 程序运行界面
14.2 典型实例练能力
14.2.1 典型实例一:通讯录浏览与维护程序
(使用数据控制组件)
【 实例题目 】
建立一个应用程序,用来对本章建立的,通讯录,
表进行维护和管理,该程序能够实现数据库日常操作功能,这些功能包括:通讯录数据的浏览、添加一个新朋友的通讯信息、修改通讯信息、查询某人的通讯信息、删除某人的通讯信息等。程序的主界面设计时和运行时的情况分别如图 14-21和图 14-22所示。要求显示数据库中的数据采用 Data Controls组件板上的相应组件,查询采用 SetKey方法按姓名进行查询。
图 14-21 程序设计界面 图 14-22 程序运行界面(修改时)
14.2.2 典型实例二,SQL语句执行演示程序
【 实例题目 】
编写一个 SQL语言的语句执行演示程序,程序的设计界面如图 14-23所示,程序的运行界面如图 14-24所示。程序操作的数据库为,通讯录,数据库。程序执行时,选中 【 Select语句 】 单选钮,可在 Memo1组件中输入 Select语句,输入完毕后,单击 【 执行 】 按钮,查询的结果将显示在图上面的 DBGrid1组件中。如果选中 【 其它数据操纵语句 】 单选钮,将在 DBGrid1中显示,通讯录,表中的信息,然后可在 Memo1组件中输入 SQL-Delete、
SQL-Update,SQL-Insert等 SQL语句,输入完毕后单击 【 执行 】
按钮,将把执行的结果立即显示在 DBGrid1中。单击 【 清空 】 按钮,将把 Memo1中输入的内容清空,单击 【 退出 】 按钮将退出应用程序。
图 14-23 程序设计界面 图 14-24 程序运行界面
14.3 上机练习重应用
14.3.1 上机练习一:登录界面的设计
【 练习 题目 】
一般的软件系统都有登录系统用来验证访问者的身份(用户名和口令),这是一个比较通用的模块。
请设计一个登录程序,完成的功能如下:合法的用户提供合法的口令就可进入系统,非法用户只能尝试三次,若不能够进入系统则应用程序自动结束。程序的设计界面如图 14-25所示,程序的运行界面如图 14-26
所示。
图 14-25 程序设计界面图 14-26 用户名和口令均输入正确时的程序运行界面
14.3.2 上机练习二:用 SQL语句实现通讯录的浏览和维护
【 练习 题目 】
使用 SQL语句实现通讯录的浏览和维护,实现的功能与典型实例一基本相同,但有以下几点不同:
( 1)显示各字段的内容的组件不再使用 Data Controls
组件板上的组件,而是使用像 TEdit,TComboBox、
TMemo等的一般组件;( 2)各按钮实现的功能基本上与上一个实验相同,不同之处只是 【 增加 】,【 删除 】,【 修改 】 等操作均要使用 SQL语句来实现;
( 3)为了能够执行 SQL语句,本例增加了一个
TQuery组件用来执行 SQL语句;( 4)为了能够使表中数据的变化能够立即显示出来,本实例增加了一个
TDBGrid组件,用来显示通讯录表的内容。
图 14-29 程序设计界面图 14-30 程序运行界面