版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库编程
Delphi具有强大的数据库应用程序开发功能,它能适应各种大型数据库,如Oracle、DB2、SyBase和SQLServer等Delphi数据库应用程序基于Borland强大的数据库引擎(BDE)和流行的数据库接口、丰富的数据库组件。数据库系统概述数据库设计BDE组件ADO组件数据控制组件数据库编程8.1数据库系统概述
数据库系统为我们提供了一种把与我们的工作和生活紧密相关的信息集合在一起的方法,它还提供了在某个集中的地方存储和维护这些信息的方法。数据库系统主要由三大部分组成。
一、数据库管理系统(DBMS,它是专门负责组织和管理数据信息的程序)。
二、数据库应用程序(它使我们能够获取、显示和更新由DBMS存储的数据)。
三、数据库(按一定结构组织在一起的相关数据的集合)。8.1.1数据库管理系统(DBMS)
数据库管理系统(DBMS)是用于描述、管理和维护数据库的程序系统,是数据库系统的核心组成部分。其主要功能有:1.描述数据库:描述数据库的逻辑结构、存储结构、语义信息和保密要求等。2.管理数据库:控制整个数据库系统的运行,控制用户的并发性访问,检验数据的安全、保密与完整性,执行数据检索、插入、删除、修改等操作。3.维护数据库:控制数据库初始数据的装入,记录工作日志,监视数据库性能,修改更新数据库,重新组织数据库,恢复出现故障的数据库。4.数据通信:组织数据的传输。DBMS主要有四种类型:1、文件管理系统;2、层次数据库系统;3、网状数据库系统;4、关系数据库系统。
因为目前关系数据库系统应用最为广泛,所以我们重点对关系数据库系统中的几个概念进行介绍。8.1.2关系数据库(RelationalDatabase)
一个关系数据库由若干个表组成。
表(Table):一个表就是一组相关的数据按行排列,象一张表格一样。
字段(Field):在表中,每一列称为一个字段。
每一个字段都有相应的描述信息,如数据类型、数据宽度等。
记录(Record):在表中,每一行称为一条记录。
索引(Index):为了加快访问数据库的速度,许多数据库都使用索引。8.1.3数据库应用程序
数据库应用程序是一个允许用户插入、修改、删除并报告数据库中的数据的计算机程序。8.1.4Delphi数据库的体系结构
Delphi的数据库应用程序不能直接访问数据。
而是使用附带的BDE(BorlandDatabaseEngine,Borland数据库引擎)、ADO接口或ODBC接口等来对数据资源直接进行访问。
通常情况下,使用数据库(Database)来表示数据表(Table)的集合。
一个数据表有很多记录,因此数据表又称为记录集(RecordSet)。
一个表有很多列,对应于记录的每个字段。Delphi为开发数据库应用程序提供了两类组件。
一类是数据库的数据访问组件(DataAccess类组件)。另一类是数据库的数据控制组件(DataControl类组件)。
这两类组件分别在组件板的[DataAccess]和[DataControls]选项卡上。DataAccess类组件负责和BDE(或ADO等)进行数据交换。它首先通过BDE(或ADO等)将数据库文件的数据提供给应用程序。最后将被修改过的数据经BDE(或ADO等)传送到数据库文件中。
其中和BDE(或ADO等)直接打交道的是DataSet类型的组件。DataSet类型的组件包括Table组件、Query组件等。
每个DataSet类型的组件都和一个数据库文件链接,并且为DataSource组件提供数据。数据库访问的工作方式Table等组件|BDE/ADO等数据访问组件(如DataSource组件)数据库文件数据控制组件(如DBGrid组件)界面
每个DataSource组件都应指定一个DataSet组件。
DataSource组件负责将DataSet组件和数据控制组件链接起来。
它首先从DataSet组件中接收数据,然后再传递给DataControl组件,待用户查询或修改完数据后。
再把被修改的数据经DataSet组件传给BDE(或ADO等),由BDE(或ADO等)将数据返回到数据库文件。
使用DatabaseDesktop创建数据表的结构。
启动Delphi从[Tools]菜单中选取[DatabaseDesktop]命令,打开DatabaseDesktop对话框,然后:(1).定义表的类型建立一个新表首先要定义表的类型,选择File菜单中的[New]菜单项下[Table]子菜单项。在出现的CreateTable对话框中选择Paradox7。(2).定义表的结构定义完表的类型,可以创建表的结构。(3).定义关键字双击[Key]空白处,出现“*”。
若关键字是多字段的可以在多个字段中都选中Key。
创建好表的结构,单击[SaveAs…]按钮,将表命名,存放在指定的路径下。(4).为数据表添加数据打开指定数据表,并按下[EditData]按钮,使它处于编辑状态,这时可以逐条输入数据。(5).为数据表设定别名为了数据库的移植,通常使用别名(Alias)。这样,在数据库的位置改动后,不必修改应用程序,只需重新设定别名就可以了。
在DataBaseDeskTop窗口中,选择菜单Tools中的AliasManager菜单项,这时会出现AliasManager对话框。
单击[New]按钮,然后在DataBasealias文本框中输入别名。
并在Path文本框中输入路径(或通过单击[Browse]设置路径),最后按下[OK]按钮。这样就完成了数据库别名的设置。8.2BDE组件
数据库引擎BDE(BorlandDatabaseEngine)是Delphi、C++Builder、IntraBuilder、ParadoxforWindows和VisualdBASE中特有的用于访问数据库的一种机制,它可以让多个应用程序共享。BDE提供了强大的API调用函数库,可以对本地及远程数据库进行操作并且提供了几乎所有数据库的驱动程序,
通过SQLLinks驱动程序又可以访问远程数据库,并且还可以通过ODBC适配器来访问数据库。Delphi中使用BDE建立数据库应用程序,可以通过BDE组件面板的各个组件实现。
8.2.1TTable组件介绍
TTable组件是Delphi开发数据库应用程序中最常用的组件,也是最重要的组件之一。它在应用程序访问数据库时起着极其重要的作用。
TTable、TQuery和TStoreProc同属于数据集(DataSet)组件,它们从数据集继承而来,有着许多共同的属性、方法和事件。
一、数据集组件的基本知识
在Delphi中,访问数据的基本单元是数据集对象。应用程序正是通过数据集组件来访问数据库的。
一个数据集对象就代表了数据库的一张表格,或者是访问数据库的一个查询或存储的过程。
所有在应用程序中使用的数据集对象都是由实际的数据集组件TDataSet派生而来的。
数据集组件DataSet作为TTable、TQuery和TStoreProc的基类,具有它们的属性、方法和事件以及它们的派生关系。二、TTable组件的主要属性
1.DatabaseNameDatabaseName属性是用来说明当前数据集的来源,即应用程序所利用的数据库的名字。
它可以是BDE定义的数据库别名,也可以是数据库文件,还可以是由TDataBase组件定义的数据库名。应用最多的还是用BDE定义的数据库别名。
因为这样可以避免在应用程序所操作的数据库发生变化时修改整个应用程序,而只需重新设置一下BDE定义的数据库别名即可。这一属性的设置通常是在设计阶段。2.TableTypeTableType属性是用来说明当前应用程序所操作的数据库表格的类型。在对象观察器中该属性框有一个下拉列表,可以用来确定数据库文件的类型。
在对象观察器中该属性框有一个下拉列表,可以用来确定数据库文件的类型。3.TableNameTableName是TTable最重要的属性之一。
它是用来说明这个TTable组件所对应的是数据库中的哪一张数据库表格。
它和DataBaseName一样,是在设计阶段给定的,它在DataBaseName设定后给出.
其值在使用数据表别名时是数据表名,不使用别名时是包含路径在内的数据表全称,如‘d:\program\mytable.db’。
该属性可以在执行时改变如:Table1.tablename:=‘d:\program\mytable.db’;
一般在DataBaseName设定后,如果有符合将打开表格的文件格式(TableType)的,会自动在TableName的属性框中生成一个下拉列表,包含所有符合该文件格式的数据库文件。4.ActiveActive属性是用来说明数据库文件的打开状态。
应用Active属性来决定及设定一个数据集组件与数据库数据之间的联系。
它的属性值是用一个布尔数(Ture/False)来表示的。
注意:用Open和Close方法对数据库文件操作的效果与改变Active属性的效果是一样的。
如语句table1.open;与table1.active:=ture;作用相同.table1.close;与table1.active:=false;作用相同.
调用Open方法会将Active属性值设为True;调用Close方法会将Active属性值设为False。
在属性值DataBaseName和TableName发生改变时,Active属性值会自动变为False,所以使用时必须重新将它改成Ture。5.BOf和EOfBOf(beginningoffile)属性值为一个布尔值,表明当前记录指针所处的位置是否为数据集的第一个记录。
如:iftable1.bofthenshowmessage(‘当前是该表的第一个记录.’);
如果Bof为True,表明当前记录指针所处的位置确实是数据集的第一行记录。
EOf(endoffile)属性值为一个布尔值,表明当前记录指针所处的位置是否为数据集的最后一个记录。
如果Eof为True,表明当前记录指针所处的位置确实是数据集的最后一行记录。
如果Bof和Eof都为True的话,则数据集为空。6.FieldsFields属性是用来指出数据集的字段列表。应用Fields属性可以访问数据库表格中的字段。如:procedureTForm1.Button1Click(Sender:TObject);vars:string;begins:=table1.Fields.FieldByName('gender').Value;showmessage(s);//显示当前记录的’gender’字段的值end;7.Filter与FilteredFilter属性允许用户定义一个数据集过滤器。
当‘过滤’被数据集应用时,只有那些满足过滤器条件的记录才会被显示。如:gender=‘男’,则只显示表中’gender’属性值为男的记录.
在定义过滤条件时,允许使用“*”作为通配符,而且可以在运行时定义。Filtered属性是用来表明数据集的过滤是否被激活。
通过检测Filtered属性值来确定一个数据集的过滤是否有效。
如果Filtered属性为True,那么过滤是激活的。否则,Filtered属性值为False。
为了应用在Filter属性栏或在OnFilterRecord事件处理程序当中定义的过滤条件,将Filtered的属性值设为True。8.IndexFieldNamesIndexFieldNames属性显示了表格索引的字段名。
IndexFieldNames用来作为指明表格索引的一种方法,其中字段的排序非常重要。9.IndexFieldsIndexFields属性是数据库中的字段名列表,其格式如下。propertyIndexFields[Index:Integer]:TField;
每一个字段对象都对应着一个当前索引中的字段。
需要注意的是,不要直接设置IndexField属性,而应用IndexFieldNames属性在运行过程中对数据集排序。10.IndexNameIndexName属性用来指明一个数据库表格的附属索引。
如果IndexName为空,一个表格就会根据它的主索引排序,如果IndexName包含了一个有效的索引名,这个索引将决定记录的顺序。
注意IndexFieldNames属性与IndexName属性是相互排斥的,设置一个就会清除另一个。三、TTable组件的重要方法
1.表格组件的CreateTable方法
CreateTable方法是用来应用新的结构信息建立一个新表格的方法。
如果FieldDefs属性包含数值,那么这些数值将被用来建立字段定义。否则,就将应用Fields属性的值。
这二者至少有一个必须有值以保证数据集的重建。
如果IndexDefs属性包含数值,它们将被用来创建数据集的索引定义。2.数据集打开和关闭的方法:Open/Close
调用Open方法将Active属性设置为True。
只有当Active属性为True时,可以从数据库中读取数据或向数据库中写数据。调用Close设置Active属性值为False。
当Active属性值为False时,数据集将被关闭,无法对数据库进行读/写操作。3.浏览数据库中数据的方法•First
将记录指针移至数据集的第一条记录处,并使之成为当前记录。
将Bof属性值置为True,触发数据集的change事件。•Last
将记录指针移至数据集的最后一条记录处,并使之成为当前记录。
它是将Eof属性值置为True,触发数据集的change事件。•MoveByMoveBy函数的基本格式如下:functionMoveBy(Distance:Integer):Integer。
用MoveBy方法将记录指针指向数据集中与当前记录相关的一条记录处,距离(Distance)是指需要移动的记录数目。
距离是正值表明在数据集中朝前移动,负值表明是往回移动。Moveby(2)按钮单击事件中程序:Table1.moveby(2);•Next
将记录指针置于数据集中的下一条记录,并使之成为当前记录。
table1.next;
如果记录指针早已处于数据集的最后一条记录,就将Eof属性值置为True。procedureTForm1.Button1Click(Sender:TObject);Varb:boolean;Begintable1.last;//将记录指针置为数据集的最后一条记录
table1.next;b:=table1.eof;ifb=truethenshowmessage('组件table1的eof属性为真。');end;•Prior
将记录指针指向数据集中的前一条记录,并使之成为当前记录。
当记录指针早已处于数据集的起始记录时,将Bof属性值置为True。4.在数据库中查询记录的方法•SetKey
将数据集置于dsSetKey状态并清除查询值缓冲区的当前内容,也就是将TTable组件置于查询状态。
在执行查询前可以调用FieldByName方法来提供新的查询值。如果要更改一个查询值或检索范围时可以调用EditKey方法。•FieldByNameFieldByName函数的基本格式如下:
functionFieldByName(constFieldName:string):TField。
FieldByName方法是根据一个特定的字段名查询一个字段。•FindKeyFindKey函数的基本格式如下:functionFindKey(constKeyValues:arrayofconst):Boolean。
FindKey方法相当于将设置表格组件的查找状态、设置查询值以及在数据集中查询这三个步骤的功能集中在一个方法调用中实现。
如果查询成功,FindKey将记录指针置于匹配的记录处,返回True值。否则,记录指针不发生移动,返回False值。•FindNearestFindNearest方法与FindKey方法很相似,不同之处在于FindNearest方法不要求精确查询。
调用FindNearest方法将移动记录指针到数据集中与查询值精确符合的一个特定的记录或数据集中与查询值最相近的记录。
KeyExclusive属性限定了检索范围,同样,它也决定了调用FindNearest方法查询记录的范围。•GotoKey
调用GotoKey方法可以用来查询一条特定记录,查询值是已经用SetKey或EditKey方法与Fields属性值确定了的。
如果调用GotoKey方法找到了匹配记录,它会将记录指针移动到这条记录处并返回True值。否则,记录指针的位置比会发生改变,GotoKey返回False值。•GotoNearest
调用GotoNearest方法是移动记录指针到当前查询值缓冲区精确定义的查询值。如果没有找到与查询值精确匹配的记录,它会将记录指针移动到与查询值最相近的记录上。•LocateLocate方法用来查找一个匹配的记录。Locate函数的定义格式如下:FunctionLocate(const
KeyFields:string;constKeyValues:Variant;Options:TlocateOptions):Boolean;
通过调用Locate方法,可以在数据集中查询一个特定的记录并将记录指针指向它。
Options是在搜索字符串字段时限定搜索范围的附加条件。
如果Options的设置包含loCaseInsensitive,那么Locate函数在匹配字段时将忽略case。
如果Options的设置包含loPartialKey,那么Locate函数将允许对KeyValues中字符串的部分匹配。
如果Options设置为空或KeyFields不包含任何字符串字段,Options的设置将被忽略。
如果找到匹配的记录,Locate将返回True值,并使该匹配的记录成为当前记录。否则返回False值。
例:iftable1.Locate(‘name’,‘张三’,[])thenshowmessage(‘数据库中有张三的记录.’);elseMessageDlg(‘没有张三的记录!’,mtInformation,[mbOk],0);
5.编辑修改数据库数据的方法•Append调用Append方法可以:(1)在数据集的末尾建立一个新的空记录。(2)将新的记录置为当前记录。
在调用Append方法后,应用程序允许用户向记录的字段中输入数据。并且能够通过调用Post方法将这些更改提交给数据库。•Post
调用Post方法用来向数据库提交一个修改的记录。
数据集中编辑修改数据库数据的方法,例如:Edit、Insert或Append方法。以及浏览数据库中数据的方法,例如:First、Last、Next和Prior会自动地调用Post方法。•Insert调用Insert方法可以:(1)在数据集中打开一个新的空记录。(2)将新记录作为当前记录。
在调用Insert方法以后,应用程序允许用户向记录的字段中输入数据。能够通过调用Post方法将这些更改提交给数据库。•Edit
调用Edit方法用来编辑数据集中的当前记录,Edit方法决定了数据集的当前状态。如果数据集是空的,那么,Edit方法将调用Insert方法。提交的方法也是用post方法。•Cancel
调用Cancel方法用来取消对当前记录中一个或多个字段的修改。在这些更改还未提交给数据库时,Cancel方法使记录恢复到修改前的状态,并将数据集置于dsBrowse状态。
典型的Cancel方法是针对用户的需要取消修改,或者在使字段生效的格式中取消非法的字段值。
在数据控制组件TDBNavigator中包含了一个调用Cancel方法的取消按钮。•Delete
调用Delete方法用来将当前记录从数据库中删除。如果该数据集处于激活状态,Delete方法将产生一个异常事件。•InsertRecordInsertRecord过程的基本格式如下。
ProcedureInsertRecord(constValues:arrayofconst)。Values参数说明的是新记录的字段值数组。
调用InsertRecord方法用来在数据集中建立一个新的记录,它与Insert方法类似。
只不过InsertRecord方法直接将新记录的字段值以参数形式传给数据库,而不用再调用Post方法。
如果插入记录中字段的数目小于Table1中的字段数目,InsertRecord方法会将缺少的字段值处理成Null。•SetFieldsSetFields方法是用来在当前记录中一次修改多个字段值。SetFields过程的定义如下:
procedureSetFields(constValues:arrayofconst);
在调用SetFields方法前,必须先调用Edit方法将数据集置于dsEdit状态。在调用SetFields方法后,需要调用Post方法将更改提交给数据库。•Refresh
调用Refresh方法用来从数据库中取出数据来更新数据集的内容。它保证了应用程序拥有数据库的最新数据。
例如,当应用程序关闭了一个对数据集的过滤,它必须立即调用Refresh方法来显示数据集中的所有记录,而不只是符合原先过滤条件的记录。四、TTable组件的重要事件
8.2.2TQuery组件介绍
TQuery是一个建立在SQL基础上,专门用于对数据库中的数据进行查询的组件。
TQuery组件使用SQL语言,可以一次访问数据库中的一个或多个表格。
TQuery组件访问的表格可以是在远程服务器的数据库中,也可以是当地的表格,还可以是ODBC从属数据库。SQL语言作为关系数据库管理系统中的一种通用的结构查询语言,已经被众多的数据库管理系统所采用。Delphi与使用SQL语言的数据库管理系统兼容,在使用Delphi开发数据库应用程序时,我们可以使用SQL语言编程。一、结构化查询语言(SQL)
SQL(StandardQueryLanguage)是最重要的数据库操作语言。SQL是过程性语言,允许用户提交一组命令查询或定义数据。SQL查询语句:SELECT选择选项[INTO表]FROM表[WHERE表达式][GROUPBY分组字段]IHAVING分组表达式][ORDERBY排序字段[DESC,ASC]][WHERE表达式][GROUPBY分组字段]IHAVING分组表达式][ORDERBY排序字段[DESC,ASC]]1.查询单个表(1).投影:从一个表中显示部分列(字段)。
下面是用SQL进行投影的例子,ZG指的是例程8-2的数据表。SELECTGH,XMFROMZG(2).过滤:从一个表中显示部分行(记录)
下面的查询将找出XB为“男”的所有员工。SELECT*FROMZGWHEREXB='男'
Where子句可以使用通配符%,以模糊查询,如查询所有姓“张”的职员。SELECT*FROMZGWHEREXMLike'张%'(3).排序可以对查询的结果按照一个或者多个字段排序。
例如:SELECT*FROMZGWHEREXB='男'ORDERBYXMASC
排序列必须出现在投影列(就是选择的列)中,上面按XM的升序对结果数据集排序。降序用DESC。(4).内制函数
SQL提供了5个内制函数:COUNT、SUM、AVG、MAX和MIN。COUNT计算结果数据集的行数;SUM对结果数据集的某一列求和;AVG计算平均值;MAX和MIN计算最大值和最小值。
例如:SELECTCOUNT(*)FROMZG上面查询了ZG的行数。(5).分组分组是根据数据集列的值进行分类。
例如:SELECTzc,SUM(gz)FROMZGGROUPBYZC
上面按照ZC(职称)进行分组,即“工程师”的记录分组一起,“助理工程师”的记录行分组一起。2.查询多个表我们要用到下面的关系数据表。ZG(GH,BMDM,XM,XB,CSRQ,ZC,GZ)BM(BMDM,BMMC,FZR,BMDH)//意思为:部门(部门代码,部门名称,负责人,部门电话)。(1)子查询如果打算查询”人事处”的职员姓名,假如知道部门代码是0020,可以使用下面的SQL语句查询职员姓名。SELECTXMFROMZGWHEREBMDMIN[‘0020’]
通常,我们不知道部门代码,因此常常用下面的方法查找部门代码。SELECTBMDMFROMBMWHEREBMMC="人事处"
把两个语句结合起来,可以查找出“人事处”的职员姓名。SELECTXMFROMZG
WHEREBMDMIN(SELECTBMDMFROMBMWHEREBMMC="人事处")
括弧里的查询就称为子查询。(2)连接假如想得到职员的姓名和他们的负责人,即GH(工号)、XM(姓名)和FZR(负责人)。
这时,子查询就无法胜任了,因为字段来自两个不同的数据库表。可以使用连接完成这个功能。
例如:SELECTZG.GH,ZG.XM,BM.FZRFROMZG,BMWHEREZG.BMDM=BM.BMDM
上面的WHERE语句完成了连接运算。3.添加数据可以向数据库插入记录:
INSERTINTOZG(GH,XM,ZC,GZ)VALUES(‘0027’,’罗德祥’,’技术员’,1300)4.删除记录下面是从数据库中删除工号为’0027’的记录DELETEZGWHEREGH=’0027’
上面的WHERE子句指明了删除记录需要满足的条件。5.修改记录如果将ZG数据库表中GH=’0005’的记录的姓名字段由”郑幼秋”修改为”郑美棠”,可以使用如下的SQL语句。UPDATEZGSETXM="郑美棠"WHEREXM="郑幼秋"
上面的SET子句完成赋值功能,而WHERE子句的功能与前面的相同,即过滤功能。SQL语句还有其它许多功能,这里只介绍较常用的。二、TQuery组件和TTable组件的比较
•可同时访问多张表格•自动访问基本表格的子集,而不是访问所有的数据。
TQuery组件和TTable组件同属于数据集组件,它们有着许多相似的地方,但有各自特殊的地方。二、TQuery组件和TTable组件的比较
本节首先将TQuery组件和TTable组件作一个比较,然后再对TQuery组件特殊的属性、方法和事件做详细介绍。
由TQuery组件和TTable组件的继承关系易知,TQuery组件和TTable组件同属于数据集组件。
所以TTable组件继承来的属性、方法和事件,TQuery组件都具有。
TQuery组件和TTable组件在很多地方是相似的,但二者又有区别。主要表现在以下几点。
•TQuery组件主要功能是用来支持SQL语言访问本地或远程数据库。
所以,TQuery组件提供了一系列与TTable组件不同的属性、方法和事件。
•TQuery组件允许用户同时访问多个表,而TTable组件一次只能访问一个表格。
•TQuery组件和TTable组件以不同的方式与SQL服务器进行交互。
在执行数据定义语句(DDL)时,应当使用TQuery组件。
而在以非集中方式访问数据库时应当使用TTable组件。
•TQuery组件访问的是表格中的特定数据内容。
而TTable组件只有提供过滤或限定检索范围才能访问表格中的特定数据内容。
否则,TTable组件访问的将是表格中的全部数据。三、TQuery组件的重要属性
TQuery组件和TTable组件同属于数据集组件,所以数据集组件具有的属性、方法和事件,TQuery组件都具有。1.SQLSQL属性是TQuery组件最重要的属性之一。
它是用来设置在TQuery组件调用ExecSQL或Open方法执行查询时所需的选择条件的。
在设计阶段,可以通过单击对象观察器中的SQL属性栏激活StringListEditor窗口,然后在该窗口中编辑SQL语句。
除了在StringListEditor窗口中编辑SQL语句可以设置SQL属性以外。SQL属性也可以在运行时动态的设置,看下面的一个例子。Query1.Close;Query1.SQL.Clear;Query1.SQL.Add('Select*fromZGwhereXM=''周强''');Query1.Open;
从例子里不难看出,SQL属性是一个TStrings对象。
如果要在代码中实现对SQL属性的设置,必须按以下步骤。1)调用TQuery的Close方法关闭TQuery对象。2)调用TStrings的Clear方法清除TQuery中的SQL属性值。3)调用TStrings的Add方法向TQuery的SQL属性中添加SQL语句。4)调用TQuery的Open方法或者ExecSQL方法恢复TQuery对象的打开状态。
注意:当SQL语句中使用Select语句时,Query组件使用Open方法。
使用Insert、Delete、Update等语句时,Query组件使用ExecSQL方法。
另外,Client/Server应用程序开发者还可以通过激活VisualQueryBuilder窗口来设置SQL属性值。Query组件中的SQL语句一个字符串,在运行时除了本身需要字符串的分隔符“’”外,还需要描述嵌套字符串的分隔符“’”。
在Delphi字符串中可以用“’’”表示“’”,因为单个“’”会与原字符串的分隔符号相混。
如:Query1.SQL.Add(‘Select*fromZGwhereXM=’‘周强’‘’);中的SQL语句实际执行效果是“Select*fromZGwhereXM=‘周强’”。2.DataSource
设置DataSource属性可以自动地将另一个数据集的字段值赋给当前查询的参数,但这些参数必须具有与该数据集相同的字段名。
DataSource属性必须是指向一个链接另一个数据集的TDataSource组件。
DataSource属性可以在运行时设定,也可以在设计阶段通过对象观察器在该属性栏的下拉列表中选择适当的TDataSource组件名。3.Params和ParamCountParams属性的基本格式如下:PropertyParams[Index:Word]:TParams;
在运行时可以访问Params来动态地观察和设置参数名、参数值和数据类型,在设计阶段可以通过编辑Params属性来设置参数的形式。
从Params属性的格式易知,Params参数值是Tparams参数记录的数组。
在SELECT语句中使用Parameters属性不能为NULL,但在UPDATE和INSERT语句中可以。4.Prepared
通过检查Prepared的属性值来确定是否准备好查询。
如果Prepared属性值为True,说明已经准备好查询;反之,说明没有准备好。
设置Prepared属性值为True与调用Prepare方法的效果是一样的。
设置Prepared属性值为False与调用UnPrepare方法的效果是一样的。
在程序运行时调用Prepare方法和UnPrepare方法会自动地更新Prepared的属性值。5.RequestLive
设置RequestLive属性来说明执行查询时,是否允许BDE即时向应用程序返回对数据结果的修改。
如何通过设置TQuery组件的重要属性在应用程序中使用TQuery组件。
在应用程序中使用TQuery组件,其创建步骤如下。1)从DataAccess组件板中选取TQuery组件放置在窗体或数据模块中,并指定它在应用程序中的名字。2)设置DatabaseName属性为需查询的数据库名。
DatabaseName属性值可以是一个BDE数据库别名,一个当地数据库的直接路径。
还可以是应用程序中Tdatabase组件的DatabaseName属性值。3)设置SQL属性中的SQL语句,并设置Params属性中的参数。4)如果查询的数据是通过数据控制组件来显示的。
还要在窗体或数据模块中放置一个数据源组件TDataSource,并将其DataSet属性设置为该查询组件。
它是用来返回查询结果并显示在数据浏览组件中的。
通过设置数据浏览组件中DataSource和DataField属性来联系数据浏览组件和数据源组件。5)激活查询组件。
通过设置Active属性,或者调用Open方法或ExecSQL方法来使TQuery组件处于活动状态。
四、TQuery组件的重要方法除了数据集组件共有的方法外,TQuery组件有自己特有的方法。1.Create
调用Create方法在运行时开始一个查询,TQuery组件会自动地放置在窗体或数据模块中。Create方法会自动调用它派生的CreateConstructor,产生一个新的SQL语句空列表和一个空的参数列表。
为SQL语句列表触发OnChange事件,建立数据联系。
设置RequestLive属性值为False,设置ParamCheck属性值为True,并设置RowsAffected属性值为-1。2.Destroy
与Create方法正好相反,调用Destroy方法来取消与服务器之间的联系。
撤销SQL语句列表、参数列表、数据联系以及SQL的存储区域,然后再调用它派生的destructor。3.ExecSQL
调用ExecSQL方法来执行当前SQL属性中的SQL查询语句。
ExecSQL用于不需要返回记录指针的数据访问,例如执行INSERT、UPDATE、DELETE和CREATETABLE语句。
而对于SELECT语句,则应调用Open方法。
如果ExecSQL执行的查询没有完成准备工作,它会先完成准备工作。
所以如果想要提高执行速度,应在第一次调用ExecSQL前调用Prepare方法。4.ParamByNameParamByName函数的基本格式如下:FunctionParamByName(constValue:string):TParam;
调用ParamByName方法根据参数名来设置和使用参数信息。
其中,Value是希望获取信息的参数的参数名。
ParamByName方法主要用来在运行时设置参数值。
在SELECT语句中的参数值不能为NULL,但在UPDATE和INSERT语句中可以。5.Prepare
调用Prepare方法让BDE和远程的数据库服务器为查询分配资源并执行一些优化操作,称为执行查询前的准备工作。
在执行查询前调用Prepare方法会提高应用程序的执行效率。
在第一次执行查询前,Delphi会自动地完成准备工作。
注意当我们在应用程序运行时更改查询的文本时,查询的Prepared属性会自动变成False。6.UnPrepare
执行查询的准备工作会消耗一定的资源,所以在完成查询以后应该调用UnPrepare方法来释放分配给查询的资源。
以上介绍了TQuery组件的重要事件,下面将介绍如何在应用程序中运行时使用TQuery组件进行查询。
要在运行时执行查询,需遵循以下步骤。1)关闭TQuery组件。2)如果在设计阶段没有设置SQL属性,或者希望更改原来SQL属性中的SQL语句,就需要设置新的SQL语句。否则就忽略这一步。3)直接设置或调用ParamByName方法设置Params属性中的参数和参数值。4)调用Prepare方法初始化BDE,联系查询中的参数值。
这一步并不是必不可少的,但使用它可以提高应用程序运行的效率。5)调用Open或ExecSQL方法激活TQuery组件,执行查询过程。
在第一次执行查询后,直到改变SQL查询语句,应用程序可以反复地关闭和打开TQuery组件,重新执行查询而无需再调用Prepare方法完成准备工作。8.3ADO组件
通过ADO数据集访问组件,可以不借助BDE数据引擎而是通过微软的OLE来访问更为广泛的数据库中的数据。ADO数据集访问组件与常用的数据访问组件是并列的关系,它的许多用法和常用数据访问组件都是相同的。ADO组件包含了ADO结构的各项功能。ADO是MicrosoftActiveXDataObjects的缩写,它是一系列使应用程序具有访问数据库能力的数据对象。Delphi的ADO组件应用Delphi组件的内容和使用方式来实现ADO数据对象的功能。
最为突出的ADO对象包括Connection、Command、Recordset对象。
这些对象分别体现在DelphiADO组件中的TADOConnection、TADOCommand以及ADO数据集组件中。
使用ADO和ADO组件允许程序员使用ADO代替原来的Borland数据库引擎(BDE)来访问数据。
不同于基于Borland数据库引擎(BDE)的连接和数据集组件,Delphi提供了一套采用ADO的组件。
利用这些组件,用户可以与ADO数据库相联系,读取数据库中的数据并执行相应的操作。
利用ADO数据访问组件,可以只使用ADO结构与数据库取得联系并对其中的数据进行操作,而在此过程中完全不需要使用BDE。
大多数的ADO连接和数据集组件都是与基于BDE的连接和数据集组件相类似的。
TADOConnection组件与基于BDE的应用程序中的TDatabase组件类似。
TADOTable与Ttable,TADOQuery与TQuery,以及TADOStoredProc和TStoredProc之间都具有这种类似的对应关系。ADO组件的功能:•TADOConnectionTADOConnection是用来建立与ADO数据库之间联系的组件。
各种ADO的数据集及操作组件可以共用这种联系来执行命令,读取数据,并执行相应的操作。•TTADODataSetTTADODataSet主要用来读取数据,并对读取的数据执行相应的操作。
它能从单个数据表格或多个数据表格中读取数据。
TTADODataSet可以直接与数据库相联,也可以通过TADOConnection来实现连接。•TADOTableTADOTable组件主要用来从单个数据表格中读取数据,完成相应操作。
同TTADODataSet一样,它可以直接与数据库相联,也可以通过TADOConnection来实现连接。•TADOQueryTADOQuery组件通过使用常用的SQL语句来读取数据,完成相应操作。
它还可以使用DDLSQL语句,例如CREATETABLE。
同TTADODataSet一样,它可以直接与数据库相联,也可以通过TADOConnection来实现连接。•TADOStoredProcTADOStoredProc用来完成数据存储过程。
完成的数据存储过程包括读取数据以及执行DDL语句。
同TTADODataSet一样,它可以直接与数据库相联,也可以通过TADOConnection来实现连接。•TADOCommandTADOCommand主要用来执行命令操作(SQL语句中不返回数据结果的命令)。
它与一个相支持的数据集组件一起使用,同样可以用来从数据表格中读取数据。
同TTADODataSet一样,它可以直接与数据库相联,也可以通过TADOConnection来实现连接。
8.3.1TADOConnection组件
Delphi中的这个组件对应着ADO数据对象中的Connection对象。
它是用来建立与ADO数据库之间联系的,由一个TADOConnection建立的联系可以被多个ADO数据集组件和操作组件通过设置它们的Connection实现共享。
TADOConnection允许通过改变其属性值来控制与数据库之间联系的属性和情况。
通过TADOConnection组件的方法,可以在使用联合数据集组件时完成数据的交互任务。
可以取得所连接数据库中的数据表名,还可以取得数据库中的存储过程名。一、TADOConnection的重要属性
1.ConnectionStringConnectionString是用来指明数据库的连接信息的属性。
在程序设计阶段,它可以通过激活对象观察器中该属性栏,从允许的ADO数据库连接中选取。
该属性值可以保存为文件以后使用,在以后使用时只需要在该属性栏中指明此文件名就可以再次使用该值。
该属性值也可以包含用户的身份和密码等信息。2.ConnectedConnected属性用来说明一个与数据库的联系是否被激活。3.ConnectionObject
提供对ADO联系对象的直接访问。
通过设置ConnectionObject属性可以取得与其参照的ADO联系对象的直接联系。
通过这种访问,应用程序可以使用与其对应的ADO联系对象的方法和属性。
在没有与之对应的ADO联系对象,而使用TADOConnection组件与数据库相连的组件中,这个属性显得尤为重要。
注意利用ConnectionObject属性对ADO联系对象进行直接访问是建立在对ADO对象尤其是ADO组件充分熟悉的基础之上的。4.ConnectionTimeoutConnectionTimeout是用来声明连接可能需要的最长时间。
该属性值是一个整数,它的单位是秒,默认值为15。
如果在ConnectionTimeout表示的时间之前联系成功或者调用了Cancel方法的话,ConnectionTimeout属性没有任何效用。
但是如果一个联系超过了它规定的时间,它会终止联系的请求,并产生一个异常。二、TADOConnection的重要方法
1.CancelCancel方法是用来取消一个准备与ADO数据库建立的联系。
调用Cancel方法要求联系的方式必须是非同步的(即ConnectOptions属性必须设置为coAsyncConnect)。Cancel方法的调用必须在连接的尝试开始以后(调用Open方法或将Connected属性设置为True)并在联系成功或超时之前。2.OpenOpen过程的基本格式如下:procedureOpen(constUserID:WideString;constPassword:WideString)。
调用Open方法来开始建立与ConnectionString属性中指明的数据库之间的联系。
其中UserID和Password参数是可选项,它们可以在发出联系要求的同时登录用户的身份和密码信息。例如:ADOConnection1.Open(‘JoeSixpack’,‘SecretWord’)。
另外,用户的登录信息也可以在ConnectionString属性中说明。三、TADOConnection的使用方法
使用TADOConnection组件可与ADO数据库联系,这种联系被ADO的操作和数据集组件绑定。
即:通过TADOConnection组件建立与数据库之间的联系。
8.3.2TADOCommand组件
TADOCommand对应的是ADO中的command对象。
TADOCommand组件是用来处理对数据库的操作命令。
TADOCommand组件执行的命令是在CommandText属性中说明的。
如果有参数值的话,它们是在Parameters属性中说明的。通过调用Execute方法执行命令。
TADOCommand组件可以通过TADConnection组件与数据库相连,也可以通过在自己的ConnectionString属性中说明连接信息与数据库取得联系。一、TADOCommand的重要属性
1.CommandTextCommandText属性用来说明要使用ADO操作组件执行的命令内容。
CommandText属性值是文本形式的命令,例如SQL语句、一个数据表格名或者是一个存储过程名。
在程序中设置CommandText属性的形式如下。ADOCommand1.CommandText:=‘DROPTABLEEmployee2000’。
如果操作中包含了一些参数(像在执行SQL语句或者一个存储过程时的情况),我们可以通过Parameters属性值来设定。2.CommandTypeCommandType属性用来说明在CommandText中所说明操作的类型。
CommandType的属性值应该与CommandText中所说明操作相一致。
例如:当CommandText属性的内容为数据表格名时,CommandType的属性值就应当为cmdTable或者是cmdTableDirect。3.CommandObject
通过设置ConnectionObject属性可以取得与其对应的ADO操作对象直接联系。
通过这种访问,应用程序可以使用与其对应的ADO操作对象的方法和属性。
在没有与之对应的ADO操作对象,而使用TADOCommand组件与数据库相连的组件中,这个属性显得尤为重要。二、TADOCommand的重要方法
1.ExecuteExecute函数是调用来立即执行CommandText中定义的操作的。
当执行的操作是用来新增一个记录时,Execute函数将返回这个记录。
而这个记录必须通过ADO数据集组件来访问,为了达到这个目的,需要将此ADO数据集组件的RecordSet属性直接设置为Execute函数的返回值。例如:TADODataSet1.RecordSet:=ADOCommand1.Execute。2.CancelCancel方法是用来取消一个操作组件准备执行的操作。
调用Cancel方法要求执行操作的方式必须是非同步的(即ExecuteOptions属性必须设置为eoAsyncExecute)。
注意为了成功地取消一个操作,Cancel方法的调用必须在达到CommandTimeout属性里说明的时间之前。
三、TADOCommand的使用
TADOCommand组件是用来执行对数据库的操作的。
8.3.3TADODataSet组件
TADODataSet是最常用的ADO数据集组件。
TADODataSet可以从ADO数据库内读取一张或多张数据表。
这种读取可以是直接读取数据表格,也可以通过SQL语句访问。一、TADODataSet组件的属性
通过设置组件的属性,可以完成用户对数据访问的需要,下面介绍该组件的一些属性。1.ConnectionStringConnectionString是用来指明数据库的连接信息的属性。
通过设置ConnectionString来指明将ADO数据集组件与数据集相连的必要信息。
ConnectionString的属性值包含了一个或多个ADO用来建立联系的。
如果是包含多个参数,那么它们相互之间要用冒号分开。
例如:ADODataSet1.ConnectionString:=‘Provider=ProviderRef:RemoteServer=ServerRef’。2.CommandText属性
CommandText是一个可以用来表达语句、数据表格名或者执行的存储过程,要为该属性赋一个文本值,如下面的例子。CommandText:='SELECT*FROMCustomerTable';
在TADODataSet组件的属性对话框中单击CommandText属性,就会弹出对话框,可以在其中设置该属性。3.CommandType属性
CommandType用于指明CommandText属性的类型。4.Connection属性使用Connection属性来指明ADO组件与ADO数据库联系的方式。
在程序设计阶段,从对象观察器中的Connection属性栏的下拉列表中选择可能的TADOConnection对象。
当然,Connection属性也可以在程序运行阶段设置。
例如:ADODataSet1.Connection:=ADOConnection1。二、TADODataSet组件的方法
TADODataSet组件的方法大多从TDataSet处继承而来。
三、TADODataSet组件的使用
TADODataSet组件使Delphi的应用程序具有通过ADO访问一个或多个数据表格的能力。
在ADO数据集组件的CommandText属性中说明需要访问的数据表格名。
TADODataSet同样也提供给应用程序执行操作的能力。
与数据库的联系可以通过指定ADO数据集组件的ConnectionString的属性值或者通过另外一个TADOConnection组件完成。
应用程序中访问和操作TADODataSet组件中的数据的方法与标准的基于BDE的数据集组件的方法一样。
将ADO数据集组件的DataSet属性设置为一个标准的TdataSource组件。
TdataSource这时就联系着ADO数据集组件和数据控制组件。
TADODataSet组件的方法基本与TDataSet组件一样。
可以使用First、Next、Last和Prior来移动数据记录指针,使用Insert和Edit方法来编辑数据记录。
8.3.4TADOTable组件
TADOTable组件的属性和方法在TTable组件和TTADODataSet组件中都有体现。
TADOTable组件与TTable组件的区别就在于前者通过ADO与数据库相连,而后者则是依靠BDE。
所以与TADOTable组件除了具有与TTable组件一样的访问数据库数据的属性和方法以外。
还具有一些用以建立组件与ADO数据库之间联系的属性和方法。
当一个TADOTable组件已经与数据库建立了有效的连接后,它可以访问数据库中的数据表格。
在TableName属性中指明要访问的数据表格名。
这样在激活该组件后,就可以通过它访问表格中的数据。
在程序设计阶段,如果TADOTable组件与数据库正确连接,那么在TableName属性栏里会出现允许访问表格的下拉列表。
而在程序运行阶段,我们可以通过将TableName的属性值设置为一个字符串类型的数据即可。
如果采用了TADOConnection组件来实现与数据库之间的联系,可以使用GetTableNames方法来获得允许的数据表格名列表。6.3数据控制组件简介
我们开发数据库应用程序时,利用数据访问组件建立了应用程序与数据库之间的联系,这时,我们只完成了一半。
我们开发数据库应用程序是为了与数据库信息进行交互,也就是浏览和编辑数据库中的数据。
因而设计用户接口也成为数据库应用程序开发中一个非常重要的方面。
数据控制组件为开发者设计用户接口提供了极大的方便,这些控制组件通过使用数据库引擎BDE实现与数据库数据信息之间的联系。
利用Delphi提供的数据控制组件可以使应用程序开发者轻松地设计出功能强大的用户接口,并与数据库信息之间进行交互。
因为数据控制组件的功能是浏览和编辑数据库中的数据,所以数据控制组件又被称为数据浏览组件。
数据控制组件包括TDBGrid、TDBNavigator、TDBText和TDBImage等。
应用程序通过这些组件可以浏览数据集中的数据信息,还可以编辑修改数据信息并将它们提交给数据库。
它们有时候也被称为数据感知组件(DataAware)。
因为这些组件如果与一个处于打开状态的数据集相连,它们会马上显示该数据集中的数据。
例如在一个最简单的数据库应用程序的设计阶段,当我们将与数据控制组件相连的数据集激活时,就会看到在数据控制组件中显示了此数据集中的数据信息。
在应用程序中创建数据控制组件的基本步骤如下。1)在窗体中添加数据控制组件,数据集组件和数据源组件。2)将此数据控制组件的DataSource属性设置为窗体上数据源组件的名称,这样就建立了数据控制组件与数据源组件之间的联系。3)设置数据控制组件的Datafield属性。
TDBGrid组件和TDBNavigator组件是访问数据集中所有的字段,所以没有这一属性。
而其他的数据控制组件都需要设定DataSource属性来说明访问的是数据表格中的哪一部分。
8.4.1TDBGrid组件介绍
TDBGrid组件的作用是一个将数据集记录显示在网格中,并且可以对其中的数据进行编辑修改。
在窗体中放置一个TDBGrid对象来显示和编辑一个数据集(table或query)中的记录,应用程序可以通过数据网格组件来插入、删除或编辑数据集中的数据,
或者只是简单地利用它来显示数据集中的数据记录。
网格中的各字段值可以使用字段编辑器来设定,也可以在运行时动态地设置。
在运行时,用户可以使用TDBNavigator在数据网格中移动,也可以插入、删除和编辑数据。
编辑的结果在移动记录指针到另一条记录或者结束应用程序时提交给数据库。一、TDBGrid组件的重要属性
1.ColumnsColumns属性是用来读取和设置网格中列的特性的。
它可以在设计阶段由Columnseditor对话框设定,也可以在应用程序运行时动态地设置。
在设计阶段,如果已经建立了TDBGrid组件与数据集的联系,并且此数据集处于打开状态,则单击对象观察器的Columns属性框会激活Columnseditor对话框。
单击工具条中的AddAll按钮或在快捷菜单中选取AddAll命令,对话框中就会出现此数据集的所有字段。
可以通过对话框中的工具条或单击右键弹出的快捷菜单对这些字段进行增添或删除的操作。2.DataSourceDataSource属性可以说是TDBGrid组件最重要的一个属性,它指明了TDBGrid组件中显示数据的来源。
正是通过这一属性,TDBGrid组件与TDataSource组件发生联系,从而引入与此TDataSource组件相连的数据集,显示其中的数据信息。3.DefaultDrawing
将DefaultDrawing属性设置为True允许TDBGrid组件自动地在每一单元格中显示数据。
而将DefaultDrawing属性设置为False会取消自动显示。
只有当用户触发OnDrawColumnCell事件或OnDrawDataCell事件时才会显示相应单元格的数据内容。4.DragMode
使用DragMode属性来控制是否允许用户对数据单元进行拖放操作。5.EditorMo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人才培训保障承诺书范文7篇
- 个人职业操守自律承诺书范文3篇
- 财务管控审慎性承诺函5篇范文
- 个体健康生活方式承诺书示例3篇
- 践行投资承诺及风险管控保证承诺书6篇范文
- 2025 高中信息技术信息系统在养老服务信息化建设中的应用课件
- 描绘大自然的美景写景(4篇)
- 学术诚信承诺书案例分析报告3篇
- 公共健康风险防范保证函3篇范文
- 产品价格变动申请审核回复函9篇范本
- 2026湖南张家界市桑植县招聘城市社区专职工作者20人考试参考试题及答案解析
- (新教材)2026年春期人教版三年级下册数学教学计划+教学进度表
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- 不说脏话从我做起主题班会PPT模板
- 大学专业排名证明(模板)
- 2023版思想道德与法治专题4 继承优良传统 弘扬中国精神 第2讲 做新时代的忠诚爱国者
- 林义《社会保险基金管理》(第2版)笔记和课后习题详解
- 2023年安徽汽车职业技术学院单招职业适应性测试题库及答案解析
- 拉丁舞比赛服饰装饰元素的演变,服装设计论文
- YY/T 0698.2-2022最终灭菌医疗器械包装材料第2部分:灭菌包裹材料要求和试验方法
- 二次函数中几何图形的最值问题课件
评论
0/150
提交评论