第13章 数据库编程

更新时间:2023-08-13 04:24:01 阅读量: 小学教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

delphi数据库编程

第13章 数据库编程

第1节 Delphi自带的数据库简介

Delphi包含一个桌面数据库工具Database Desktop,利用它可以创建基于文件的数据库系统(如dBase、Paradox、Foxpro等)。选择【开始 | 程序 | Borland Delphi7 | Database Desktop】即可启动该工具。 上述数据库通用性较差,目前应用者较少。

第2节 Form Wizard简介

Delphi中提供了一个简单的数据库应用程序向导,即Form Wizard。选择Delphi集成开发环境主菜单中的【Database | Form Wizard】即可打开向导。利用该向导可以创建一个简单的数据库应用程序,实现数据的浏览和简单操作。在该向导中可以选择数据集为Table或者Query、建立单窗体或者主/从窗体,还可以选择窗体的布局方式。

用Form Wizard只能访问基于数据表的文件型数据库,如Paradox(*.DB)、Foxpro(*.DBF)等,因此通用性较差。

第3节 基于BDE的数据库应用程序开发

一、BDE简介

BDE(Borland Database Engine)是Borland公司开发的数据库引擎,

delphi数据库编程

用于操作不同的数据库驱动程序。开发人员只需要以统一的方式和数据库引擎建立联系,就能访问不同的数据库。可以大大简化数据库应用程序的开发。

BDE是访问Paradox或dBASE表的最佳方式。BDE支持的功能范围较宽,但它的配置是最复杂的。在使用前,需要在BDE Administrator中配置BDE,建立数据库别名。

尽管BDE的功能较强,但以下因素限制了它的应用:

BDE的配置步骤较烦琐。

配置BDE时,注册表等系统文件将会被修改。

使用BDE的应用程序发布时需同时发布BDE引擎,致使应用程

序的发行盘很大,通常需要使用安装程序制作软件发布应用程序。

二、常用组件简介

1. 数据集组件

数据集组件是数据库应用程序的核心,此类组件代表来自底层数据库中记录的集合。

数据集中的记录可以是一个完整的表,也可以是一个表中的字段或记录的子集,或者是由多个表中的信息连接构成的一个视图。通过使用数据集,可以将数据库中的一个或多个物理表按特定规则在内存中重建。当底层数据库改变时,可能需要修改数据集组件处理数据的方式,而应用程序的其他部分不必修改。

基于BDE的数据集组件包括Table(表)、Query(查询)、StoredProc(存储过程)等。

(教材误,295页) 教材所列Database(数据库)属于数据连接组件(Connection Component)。

BatchMove是数据批处理组件。

上述组件均位于组件面板BDE页。

2. 数据控制组件

数据控制组件又称数据感知(data-aware)组件、数据控件或数据显示/编辑组件,位于组件面板Data Controls页。该页中含有多种数据感知组件(如DBEdit、DBGrid等),用于显示和编辑数据库信息。

这些组件是数据库应用程序的通用组件,即不仅可以用于BDE,亦可用于其他数据引擎(如ADO等)。

delphi数据库编程

3. 数据访问组件

数据访问组件位于组件面板【Data Access】页,是数据控制组件和数据集组件之间的中介,其作用是连通用户界面和代表数据库信息的数据集。其中最常用的是DataSource(数据源)组件。

用户界面窗体上的多个数据控制(感知)组件可以共用一个数据源,在这种情况下,各数据感知控件同步显示数据,当用户滚动记录(移动记录指针)时,当前记录的对应字段值将显示在每个控件中。

数据访问组件也是数据库应用程序的通用组件,适用于各种数据引擎。

三、使用Table组件开发数据库应用程序 Table作为数据集组件,其作用是连接数据库中的一张表。

使用时需要设置其DatabaseName属性(BDE中的别名)和TableName属性。

教材296~297页表13.4和表13.5分别列出了Table组件的常用属性和方法,其中大部分属性和方法也适用于其他类似的数据集组件(如ADOTable)。

教材297~313页中的例13-1~例13-4以及例13-8所使用的主要属性和方法适用于各种类型的数据集;例13-5~例13-7中所用的GotoKey、FindKey等方法仅用于基于BDE的数据集或客户端数据集(TClientDataSet)。

四、使用Query组件开发数据库应用程序

Query组件的作用是通过SQL命令访问数据库,它也属于数据集组件,通常需要设置其DatabaseName属性和SQL属性。

SQL属性的设置可以在设计期间在对象观察器中进行设置,也可以在代码中动态设置

在代码中对Query的SQL进行动态编程通常需要如下步骤: Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add(‘此处为SQL语句’);

Query1.Open/ExecSQL;

其中,若SQL命令有返回结果集就使用Open方法打开数据集,否则使用ExecSQL方法。

上述步骤也适用于基于ADO的ADOQuery组件。

教材314~320页中的例13-9~例13-12所使用的主要属性和方法也适用于ADOQuery组件。

delphi数据库编程

第4节 基于ADO的数据库应用程序开发◆

基于ADO的数据库应用程序开发的一般步骤如下:

利用ADOConnection组件建立与数据库的连接;

设置ADO的数据集组件,如ADOTable、ADOQuery等,用于从数据库中引入数据;

设置DataSource组件作为数据集组件和数据访问组件之间的桥梁;

利用数据感知组件或其他组件设计用户界面。

一、创建一个最简单的数据库应用程序

如果应用程序的功能较简单,可将数据组件直接放置在窗体上。 新建工程,保存文件。

在窗体上添加一个DataSource组件,一个ADOTable组件,一个DBGrid组件。

设置ADOTable组件属性:

① 选定ADOTable组件,在属性窗口单击ConnectionString属性Use Connection String单选钮,单击Build...按钮,在“数据链接属性”对话框的“提供者”选项卡中选择“Microsoft Jet 4.0 OLE DB Provider”,单击“下一步”,在“连接”选项卡中选择数据库文件(如Stud2K.mdb),测试连接成功后单击“确定”或“OK”关闭对话框。

说明:

为了保证程序移植到其它计算机上仍可正常使用,可将当前工程与数据库保存在同一文件夹中,在数据库测试连接成功后删除数据库名称前面的所有路径。在主窗体的OnCreate事件中加入以下代码:

delphi数据库编程

ChDir(ExtractFilePath(Application.ExeName));

② 在TableName属性右侧的下拉式列表框中选择数据表(如“学籍”)。

③ 将Active属性设置为True。

设置DataSource组件属性:将DataSet属性设置为ADOTable1。 设置DBGrid组件属性:将DataSource属性设置为DataSource1。 经上述设置后,在设计阶段即可看到DBGrid组件中已显示数据表的记录。

二、常用组件简介

组件板ADO(ActiveX Data Objects)页中含有各种ADO组件。ADO通过OLEDB访问数据库,提供多种访问不同数据库的驱动程序。

ADO组件主要包括:

数据库连接组件:ADOConnection

数据集组件:ADOTable、ADOQuery、ADODataset、ADOStoredProc 命令组件:ADOCommand。

这些组件的主要功能见教材320页表13.19。

在以下各小节中将分别介绍上述组件。

三、ADOConnection组件◆

ADOConnection组件用于同数据资源建立连接。该组件类似于BDE的DataBase组件。

由于ADO数据集和命令组件可以通过它们的ConnectionString属性直接与数据资源建立连接,因此,程序中并非必须使用ADOConnection组件。尽管如此,对于稍微复杂一点的数据库应用程序,还是推荐使用ADOConnection组件,因为多个ADO数据集和命令组件可以共享一个连接组件(将各ADO组件的Connection属性设置为该连接组件即可),这样可以节省资源,并且可以建立跨越多个数据集的事务。

1. 重要属性

(1)ConnectionString属性◆

该属性用于设置与数据资源的连接信息。设置方法与ADO数据集的同名属性相同。

delphi数据库编程

(2)LoginPrompt属性◆

打开新连接之前是否显示登录(Login)对话框。默认值为True,通常设置为False。

(3)Connected属性◆

用于设置是否激活连接。

设该属性值为True时,建立与ADO数据资源的连接,但不打开数据集,值为False(默认)时关闭连接。

可以通过该属性判断连接的当前状态。值为True时连接处于活动状态;若值为False,并且KeepConnection属性亦为False,则连接处于非活动状态。

该属性还可用于判断对连接组件的Open方法和Close方法的调用是否成功。例如:

with ADOConnection1 do

begin

Open;

if Connected then

{ 连接成功 }

else

{ 连接不成功 };

end;

(4)KeepConnection属性

该属性用于指定数据集未打开时连接对象是否仍然与数据库保持连接。

属性值为True(默认)时,始终保持与数据库的连接。对于同远程数据库服务器的连接,或者需要频繁打开和关闭数据库的应用程序来说,设该属性为True可以减少网络流量,加快程序运行速度,并避免每次重建连接时重新登录服务器。

属性值为False时,若没有打开的数据集,则断开连接。断开连接将释放分配给该连接的系统资源,如果以后打开使用该数据库的数据集,则必须重建连接并初始化。

2. 重要方法

(1)Open方法

打开与数据库(由ConnectionString属性指定)的连接。

delphi数据库编程

(2)Close方法

关闭连接。

在连接组件失活之前,所有相关的数据集均被关闭。调用Close方法与设置Connected属性为False等效。

如果一个活动连接被关闭后又重新打开,必须重新打开所有相关的数据集,重开连接不会自动重开相关的数据集。

(3)GetTableNames方法◆

① 语法

该方法可以将数据库中所有表的名称构成一个字符串列表。

语法(原型)如下: procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);

参数说明:

List:已有的字符串列表对象,用于存放数据表名称列表。

SystemTables:指定表名称列表中是否包含数据库中的系统表,默认值为False。

注意:调用此方法时,字符串列表对象中的原有内容将被覆盖。 ② 示例

动态显示数据库中各表的数据。

基本思路:利用GetTableNames方法将数据库各表的名称填充到列表框或组合框中,程序运行时在列表框或组合框中选择一个表,通过DBGrid显示该表数据。

按下表在窗体上添加组件并设置属性。

为窗体的OnCreate事件编写如下代码:

delphi数据库编程

procedure TForm1.FormCreate(Sender: TObject);

begin

ADOConnection1.GetTableNames(ListBox1.Items); //用表名填充列表框

end;

为按钮btnShow的单击事件编写如下代码: procedure TForm1.btnShowClick(Sender: TObject);

var i : Integer;

begin

i := ListBox1.ItemIndex; //取列表框中被选项目的索引号

if i = -1 then Exit; //确保已选择项目,避免出错

with ADOTable1 do

begin

Close; //关闭数据集

TableName := ListBox1.Items[i]; //根据用户的选择重新指定表名

Open; //打开数据集

end;

end;

四、ADOTable组件◆

1. 使用ADOTable组件的一般步骤

隶属于ADO的ADOTable组件与隶属于BDE的Table组件由许多相似之处。使用ADOTable组件的一般步骤如下:

将ADOTable组件添加到数据模块或窗体中,为其设置一个惟一

的名称(Name属性)。

定义数据库连接:

方法1:直接使用ADOTable组件的ConnectionString属性。

方法2:通过ADOTable组件的Connection属性指定一个已经与

数据库建立连接的ADOConnection组件。

在ADOTable组件TableName属性的下拉式列表中选择数据库表。 在数据模块或窗体中添加一个数据源组件,将该组件的DataSet

属性设置为ADOTable组件的名称。

在窗体上放置数据感知组件,将其DataSource属性设置为数据源

组件。

在属性窗口或通过代码将ADOTable组件的Active属性设置为

delphi数据库编程

True。

使用表类型的数据集的主要优点是:可利用索引为数据集排序;快速查找记录;限制记录的显示范围;建立主表/细表关系。

2. 数据集的浏览

(1)移动记录指针

调用数据集的First(首记录)、Last(末记录)、Next(下一记录)、Prior(上一记录)和MoveBy方法可移动记录指针。MoveBy方法需要一个整型参数,若为正值,向尾部移动,若为负值,向首部移动。

(2)Bof与Eof◆

Bof和Eof时数据集的两个逻辑型属性(只读),在遍历数据集时常用。 ①Eof

Eof为True时表示指针指向数据集的最后一条记录。下列操作将导致Eof为True:

打开一个空数据集。

调用数据集的Last方法。

调用数据集的Next方法失败(因当前记录是末记录)。

调用SetRange方法,但范围无效。

除上述情况外,Eof均为False。

Eof属性常用于在循环中遍历数据集时,判断是否已到达数据集最后一条记录。

下面的代码段遍历数据集ADOTable1中的所有记录: ADOTable1.DisableControls;

try

ADOTable1.First; { 指向首记录, Eof为False }

while not ADOTable1.Eof do { 循环到Eof为True }

begin

{ 在此处处理每一条记录 }

{...}

{ 调用Next成功时Eof为False;

指针指向末记录时调用Next失败,Eof为True }

ADOTable1.Next;

end;

finally

ADOTable1.EnableControls;

delphi数据库编程

end;

提示:本例还演示了遍历数据集时调用DisableControls方法禁止数据感知控件刷新,以便加快处理速度,并防止闪烁。遍历完成后调用EnableControls方法恢复控件刷新。注意EnableControls方法的调用应放在try...finally语句的finally子句中,以保证即使遍历出现异常,仍能确保控件刷新恢复正常。

②Bof

Bof为True时表示指针指向数据集的首记录。下列操作将导致Bof为True:

打开一个数据集。

调用数据集的First方法。

调用数据集的Prior方法失败(因当前记录是首记录)。

除上述情况外,Bof均为False。

Bof属性亦可用于遍历数据集。下面的代码段遍历数据集ADOTable1中的所有记录: ADOTable1.DisableControls; { 提高处理速度,防止屏幕闪烁 }

try

st; { 指向末记录, Bof为False }

while not ADOTable1.Bof do { 循环至Bof为True }

begin

{ 处理各记录 }

...

{ 调用Prior成功时Bof为False;

指针指向首记录时调用Prior失败,Bof为True }

ADOTable1.Prior;

end;

finally

ADOTable1.EnableControls; { 显示当前记录 }

end;

(3)使用数据库导航组件

数据库导航组件TDBNavigator可用于浏览和处理记录。

delphi数据库编程

上述按钮分别调用数据集的相关方法,从左向右依次为:

首记录(First)

上一记录(Prior)

下一记录(Next)

末记录(Last)

插入(Insert):在当前记录前插入新记录

删除(Delete):删除当前记录

编辑(Edit):进入编辑状态,允许编辑当前记录

发送(Post):将当前记录的修改写入数据库

取消(Cancel):取消对当前记录的编辑,恢复编辑前状态

刷新(Refresh):用数据库最新数据刷新数据集。

3. 记录排序

Sort属性:指定用于排序的一个或多个字段。该属性是一个字符串,可指定升序或降序,格式如下:

'字段名1 ASC|DESC,字段名2 ASC|DESC ...' 例如:

ADOTable1.Sort:='姓名 DESC' //按姓名降序排列

Sort属性仅用于客户端游标(设置CursorLocation属性为clUseClient),设计时无效。若指定的索引不存在,则创建一个临时索引。

说明:

Sort属性可用于所有ADO数据集。

示例:◆

单击DBGrid控件列标头自动排序(在升序和降序之间切换)。

delphi数据库编程

可通过DBGrid控件的OnTitleClick事件实现: procedure TForm1.DBGrid1TitleClick(Column: TColumn); //单击列标头

var

sSort, sTitle: string;

i: integer;

begin

sTitle := Column.FieldName; //取当前列字段名作为修改列标题的基础

with ADOTable1 do

{ 亦可用以下语句,适用于各种ADO数据集(需在本单元中引用ADODB),

不必考虑其类型和名称:

with TCustomADODataSet(Column.Field.DataSet) do } begin

sSort := Sort; //取当前数据集排序字段和方式(升/降)

if sSort = Column.FieldName then //若为升序则改为降序

begin

sSort := sSort + ' DESC';

sTitle := sTitle + '↓'; //预存拟修改的列标题文本

end

else //否则改为升序 begin

sSort := Column.FieldName;

sTitle := sTitle + '↑';

end;

Sort := sSort; //排序

end;

//改变排序列标题的文本

Column.Title.Caption := sTitle;

// 其他列标题均设置为默认格式

for i := 0 to Column.Collection.Count - 1 do with TDBGrid(Column.Grid).Columns[i] do

if FieldName <> Column.FieldName then

delphi数据库编程

Title.Caption := FieldName;

end;

4. 数据集的增、删、改操作概述

数据集有一个由系统设置的只读属性CanModify。通常该属性值为True,即允许修改数据。在数据集的读写权限有限制时,该属性的值可能为False。

当CanModify属性为True时,可以调用数据集的以下方法插入、更新和删除数据:

Edit:使数据集进入dsEdit状态。

Append:在数据集末尾插入新记录,使数据集进入dsInsert状态。 Insert:在当前记录前插入新记录,使数据集进入dsInsert状态。 Post:将用户对数据的修改写入数据库,如果成功,则使数据集进入dsBrowse状态,若不成功,则数据集维持当前状态。

Cancel:取消当前操作,设数据集为dsBrowse状态。

Delete:删除当前记录,并设数据集为dsBrowse状态。

5. 编辑数据

(1)进入dsEdit状态

要编辑数据,必须先进入dsEdit状态。当数据集的CanModify属性为True时,调用数据集的Edit方法可以进入dsEdit状态。

此外,以下三个条件并存时,某些数据感知组件可自动设数据集进入dsEdit状态:

① 数据感知控件的ReadOnly属性为False;

② 与数据感知控件关联的数据源的AutoEdit属性为True;

③ 数据集的CanModify属性为True。

进入

dsEdit状态后,用户即可修改数据感知控件中显示的当前记录字段值。当移动记录指针时,数据感知控件会自动调用数据集的Post方法。

(2)确认和取消修改

① 使用数据导航组件

Post

)按钮(执行后不能取消)。

Cancel)按钮。

delphi数据库编程

② 通过代码

确认修改:调用数据集的Post方法(执行后不能取消)。例如: ADOTable1.Post;

取消修改:调用数据集的Cancel方法。例如:

ADOTable1.Cancel;

在代码中,Edit和Post方法常联合使用。例如:

with ADOTable1 do

begin

Edit;

FieldValues['学号'] := '0108001';

Post;

end;

6. 添加新记录

在添加新记录之前必须进入dsInsert状态。当CanModify属性为True时,调用Insert或Append方法可使数据集进入dsInsert状态。

Append方法:在数据集最后追加一条空记录,并使空记录成为当前记录。

Insert方法:在当前记录之前插入一条空记录,并使空记录成为当前记录。

例如:

procedure TForm1.btnAddClick(Sender: TObject);

begin

ADOTable1.Append;

end;

以上代码只是添加了一条空记录,并进入dsInsert状态,此时应为新记录的相关字段输入数据。

若要使添加记录有效,必须调用Post方法予以确认。调用Cancel方法可取消添加。在dsInsert状态下,若移动记录指针,则数据感知控件会自动调用数据集的Post方法。

7. 发送数据与取消修改◆

上述对记录的编辑、插入、追加操作完成后,必须调用Post方法才能将修改的数据存入数据库。调用Post方法分为显式(直接)调用和隐式(间接)调用。显式调用是指在代码中以“数据集.Post”的形式调用,隐式调用是指在dsEdit或dsInsert状态下移动记录指针时,或者调用

delphi数据库编程

AppendRecord等方法时,自动调用Post方法。

在dsEdit或dsInsert状态下,若尚未直接或间接调用Post方法,则可以调用Cancel方法取消修改。

发送数据时常因数据不合法而引发异常,导致程序崩溃,因此应作适当处理。

例如,以下代码用于处理异常: procedure TForm1.btnPostClick(Sender: TObject);

begin

with ADOTable1 do

begin

if (State <> dsEdit) and (State <> dsInsert) then exit; try //用try...except 结构处理异常

Post;

except

on E: Exception do //发生异常时显示异常信息

if Application.MessageBox(PChar(E.Message +

#13#13 + '是否取消本次操作?'), '提示',

MB_YESNO + MB_ICONWARNING) = IDYES then

Cancel

end;

end;

end;

对于一些能够预知的错误,可利用数据集的BeforePost事件处理。例如:

procedure TForm1.ADOTable1BeforePost(DataSet: TDataSet); begin

if Trim(dbeID.Text) = '' then

begin

Application.MessageBox('学号不得为空!','提示',MB_OK + MB_ICONWARNING);

Abort; //调用全局过程Abort取消操作

dbeID.SetFocus;

delphi数据库编程

end;

end;

8. 删除记录

调用数据集的Delete方法删除当前记录。例如:

ADOTable1.Delete;

注意:

为了避免误删记录,应在数据集的BeforeDelete事件过程中询问用户。例如: procedure TForm1.ADOTable1BeforeDelete(DataSet: TDataSet); begin

if Application.MessageBox('是否删除此记录?', '确认',

MB_YESNO + MB_ICONQUESTION) = IDNO then

Abort; //调用全局过程Abort取消操作

end;

如果采用数据导航组件TDBNavigator删除记录,系统会自动弹出确认对话框,但该对话框显示的是英文界面。将TDBNavigator组件的ConfirmDelete属性设置为False,然后为该组件的BeforeAction事件编写代码,可以显示中文对话框。例如: procedure TForm1.DBNavigator1BeforeAction(Sender: TObject; Button: TNavigateBtn);

begin

if Button = nbDelete then

if Application.MessageBox('是否删除此记录?', '确认',

MB_YESNO + MB_ICONQUESTION) = IDNO then

Abort; //调用全局过程Abort取消操作

end;

除了一般数据集的Delete方法以外,ADO数据集还具有DeleteRecords方法,可一次删除多条记录。调用格式如下:

ADO数据集.DeleteRecords(受影响的记录)

“受影响的记录”可取以下值:

arCurrent:仅删除当前记录。

arFiltered:删除满足当前Filter属性设置的记录。

arAll:删除所有记录。

delphi数据库编程

arAllChapters:删除所有子集记录。

9. 创建主表/细表关系简介

(参见教材311页例13-8)

在数据库应用程序中,常常需要处理数据表之间的“一对多”关系,即对于主表(Master)中的某个记录来说,从表(细表,Detail)中有多个记录与之对应。例如,“学籍”表中含有学生的基本信息,其中“学号”字段一般设置为主键或主索引(惟一);“成绩”表中含有学生的各科成绩,一个学生每门课程的成绩构成一条记录,因此“成绩”表中的“学号”字段肯定会有重复值。这样,“学籍”表与“成绩”表中的“学号”字段就构成了“一对多”关系。另一个典型例子是客户基本信息与客户定单之间的关系。

下面以“学籍”表与“成绩”表为例,说明创建主表/细表关系的一般步骤。

① 在窗体上或数据模块中添加一个ADOConnection组件,与学生数据库建立连接。

② 添加两个ADOTable组件,分别命名为ADOTblMaster和ADOTblDetail。将它们的Connection属性均设置为第①步中建立的连接组件。

③ 将主表ADOTblMaster组件的TableName属性设置为学籍表,将细表ADOTblDetail组件的TableName属性设置为成绩表。

④ 添加两个DataSource组件,分别命名为SrcMaster和SrcDetail。将它们的Dataset属性分别设置为ADOTblMaster和ADOTblDetail。

⑤ 选定ADOTblDetail组件,在属性窗口将其主数据源属性MasterSource设置为SrcMaster。然后单击MasterFields钮,打开字段关联设计器【Field Link Designer】,建立主/细表“学号”字段的关联。

⑥ 添加两个DBGrid组件,将其属性DataSource属性分别设置为SrcMaster和SrcDetail。

⑦ 依次将ADOTblMaster和ADOTblDetail组件的Active属性设置为True。

程序运行时,在主表中移动记录指针,细表中将会显示当前学生的各科成绩。

delphi数据库编程

10. 搜索特定记录(补充)

调用数据集的Locate和Lookup方法可以搜索数据集中的特定记录(记录定位)。

(1)Locate方法◆

调用语法:

数据集.Locate(‘待查字段列表’,字段值,选项集合)

参数说明:

‘待查字段列表’:由一对单引号括起来的字段名。若有多个字段,用分号分隔。

字段值:与字段名对应。若有多个字段,字段值应当是一个变体型数组。

选项集合:搜索记录的附加条件。可取loCaseInsensitive(不区分大小写)和loPartialKey(部分匹配,仅适用于字符串型字段)。

注意:使用选项集合时,必须在本单元中添加对DB单元的引用。 返回值:Boolean。若找到匹配记录,则将第一条匹配记录作为当前记录,并返回True;否则返回False,记录指针位置不变。

示例: If ADOTable1.Locate('姓名', '李', [loPartialKey]) = False then ShowMessage('未找到姓 李 的学生。');

var sName: string;

...

sName := Trim(edtName.Text);

If ADOTable1.Locate('姓名', sName, [loPartialKey]) = False then

ShowMessage('未找到姓名为 ' + sName + ' 的学生。');

ADOTable1.Locate('姓名;出生日期', VarArrayOf(['张三', StrToDate('1981-6-9')]), [loPartialKey]);

ADOTable2.Locate('课程; 分数', VarArrayOf(['英语', 79]),

[loPartialKey]);

关于Locate方法的几点说明:◆

① 若有多条记录符合条件,则只能定位于第一条匹配记录。

delphi数据库编程

② 若搜索条件中包含多个字段,则loPartialKey选项仅对“待查字段列表”中的最后一个字段有效。

③ 如果为数据集设置了过滤器(Filter,见后面的“11. 筛选记录”小节),则应将过滤器中所包含的字段添加到Locate方法的搜索条件中;否则,被过滤掉的记录仍会被列入搜索范围,从而返回错误结果,并导致定位混乱。例如,若过滤器中设置了按性别筛选记录,则应按以下语句构建搜索条件:

ADOTable1.Locate('性别; 姓名', VarArrayOf([cboSex, sName]),

[loPartialKey]);

(2)Lookup方法简介

调用语法:

数据集.Lookup(‘待查字段列表’,字段值,’返回字段列表’) 参数说明:

‘待查字段列表’:与Locate方法相同。

字段值:与Locate方法相同。

’返回字段列表’:拟返回的字段,若有多个字段,用分号分隔。

返回值:Variant。若找到匹配记录,则返回’返回字段列表’中指定字段的值。若有多个字段,则返回值是一个Variant数组。Lookup方法不移动记录指针,只是返回指定字段值。若无匹配记录,返回Null值。

示例:

以下代码查询数据集ADOTable1中姓名为李四的记录,若查到,返回该记录的学号、姓名、性别和班级字段值并显示。 var Lkup: Variant; i:Integer; ss:String;

begin

Lkup:= ADOTable1.Lookup('姓名', '李四', '学号;姓名;性别;班级');

if not VarIsNull(Lkup) then //若有匹配记录

begin

for i:= 0 to VarArrayHighBound(Lkup,1) do

ss:= ss + Lkup[i] + ' '; //将各字段值存入字符串变量 ShowMessage(ss);

end

else

ShowMessage('无匹配记录。');

end;

delphi数据库编程

11. 筛选记录(补充)

设置数据集的Filter和Filtered属性,可按特定条件筛选(过滤)记录,其作用类似于执行含有Where子句的SQL语句。(教材296页表13.4仅对上述二属性作了简要说明)

(1)Filter属性◆

数据集的Filter属性用于指定筛选条件。

语法:

数据集.Filter := 条件表达式

说明:

条件表达式类似于SQL语句中Where子句的条件表达式,其中可包含各种比较运算符(<、>、<=、>=、<>、=、Like)以及逻辑运算符(And和Or)。设置Fiter属性的作用与SQL中Where子句相似。

示例:

ADOTable1.Filter := '性别 = ' + QuotedStr(cboSex.Text); 提示:QuotedStr函数用于为字符串首尾加上单引号。上述语句等价于:

ADOTable1.Filter := '性别 = ''' + cboSex.Text + '''';

注意:

① 在条件表达式中,各种运算符前后均应含有空格。

② 本属性必须与下述Filtered属性配合使用。

(2)Filtered属性◆

数据集的Filtered属性用于决定是否激活Filter属性所指定的筛选条件。

语法:

数据集.Filtered := 逻辑表达式

说明:

若逻辑表达式的值为True,筛选被激活;否则取消筛选。

示例: with ADOTable1 do

begin

DisableControls;

Filtered := False; // 在设置筛选条件前应关闭过滤器

if cboSex.Text <> '全部' then

delphi数据库编程

begin

Filter := '性别 = ' + QuotedStr(cboSex.Text);

Filtered := True; // 激活过滤器

end;

EnableControls;

end;

五、ADOQuery组件◆

1. 使用ADOQuery组件的一般步骤

查询类型(Query-type)的数据集代表一条SQL语句。查询类型的数据集包括TQuery、TADOQuery、TSQLQuery、和TIBQuery。

使用TADOQuery组件的一般步骤如下:

将ADOQuery组件添加到数据模块或窗体中,为其设置一个惟一

的名称(Name属性)。

定义数据库连接:

方法1(推荐):通过ADOQuery组件的Connection属性指定一

个已经与数据库建立连接的ADOConnection组件。

方法2:直接使用ADOQuery组件的ConnectionString属性。

设置ADOQuery组件SQL属性,指定要执行的SQL语句。

在数据模块或窗体中添加一个数据源组件,将该组件的DataSet

属性设置为ADOQuery组件的名称。

在窗体上放置数据感知组件,将其DataSource属性设置为数据源

组件。单字段显示组件还需设置DataField属性。

激活查询组件:

对于返回结果集的查询,使用ADOQuery组件的Active属性(设

置为True)或Open方法。

对于不返回结果集的查询(又称动作查询,action query),调用

ADOQuery组件的ExecSQL方法。

2. 执行查询

查询语句必须符合所使用的数据库服务器的规范。数据集既不检测也不执行SQL命令,只是将SQL语句传送到数据库服务器,由服务器执行。

(1)指定查询语句

对于纯查询类型的数据集(如ADOQuery),使用SQL属性指定SQL

本文来源:https://www.bwwdw.com/article/mqij.html

Top