版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第13章 BDE数据库应用程序开发13.1 TTable组件13.1.1 TTable组件的常用属性13.1.2 TTable组件的常用方法13.1.3 TTable组件的常用事件13.2 数据源TDataSource组件13.2.1 DataSource组件的常用属性13.2.2 DataSource组件的事件13.3 数据控制类组件13.3.1 数据控制类组件的共同特性13.3.2 常用数据控制类组件功能简介13.4 Query组件13.4.1 Query组件的常用属性13.4.2 Query组件的常用方法13.4.3 静态查询使用字符连接号“+”实现动态查询目录使用Params属性实现参
2、数查询使用ParamByName方法实现动态查询13.5 使用BDE开发数据库应用程序13.5.1 创建数据库表13.5.2 制作应用程序界面13.5.3 编写代码13.6 小结13.7 习题目录 Dephi具备强大的数据库应用开发能力,支持多种数据库访问机制。其中一种就是基于BDE的数据库应用开发。BDE(Borland DataBase Engine)是Borland公司为其开发工具研发的一种可以被多个应用程序共享的数据访问机制。它封装了强大的数据库操作API,可以对本地数据库或远程数据库轻松实现诸如创建、修改数据库结构、数据存取、更新等操作。通过数据库驱动与数据库进行连接,使BDE能为多
3、种类型的数据库服务器提供统一的访问接口。根据Delphi版本不同,可以访问Paradox、 dBASE、 FoxPro、 Access等类型的本地数据库,同时通过ODBC来访问所拥有的可用ODBC数据源。明显地,在发布基于BDE的数据库应用程序的时候,必须包含一份BDE的拷贝。这样会增加应用程序的体积和程序布署的复杂程度。尽管在应用程序中可以直接通过BDE的API进行数据库操作,但Delphi在组件面板的BDE页上提供的组件封装了其中大部分的功能,使用它们无疑可以使开发工作变得更加简单、高效。利用BDE开发数据库应用程序一般涉及到三类组件:BDE组件、Data Access组件和Data Co
4、ntrols组件。这些组件的关系如图13-1所示。图13-1 利用BED组件访问数据库这三类组件分别分布在Delphi2005的Tool Palettek的BDE页、Data Access页和Data Controls页,如图13-2、13-3、13-4。图13-2 BDE组件图13-3 数据访问组件图13-4数据控制组件13.1 TTable组件 TTable组件通过BDE直接访问数据库表中的每一条记录和所有字段。它是最重要的数据集部件之一,使用频率非常高。这里主要介绍其主要的属性、方法和事件,更详细的内容请查阅Delphi的联机帮助文档或相关资料。13.1.1 TTable组件的常用属性1
5、DatabaseName属性该属性指定Table组件要访问的数据库的名字。可以是一个BDE Administrator中定义的数据库别名、一个数据库文件的磁盘路径或者是一个由TDataBase部件连接的数据库。通常使用的是数据库别名,好处是应用程序不用关心数据库文件实际存储的位置。如果数据库文件的存储位置发生改变,只需要在BDE Administrator中修改别名指向的路径信息即可。2TabelName属性该属性指定Table组件要访问数据库中具体的数据表名称。它可以是一个数据表名,也可以是数据表文件的文件名(包括完整的路径)。同理,通常应该使用数据表的名称。如果在设计期先设置DateBas
6、eName属性,指定数据库别名,然后就可以通过对象监视器在数据表名的下拉列表中选择要访问的数据表。需要注意的是,修改这两个属性,数据集都必须处于关闭状态,即Active属性为False。3TableType属性该属性指定与TTable部件相连接的数据库表的类型。其可能的取值及意义如表13-1: 表 13-1 数据库表类型取值及意义 如果TableType属性取值为ttDefault时,表示数据库表的类型由数据库文件的扩展名决定。具体情况为:如果数据库文件的扩展名为.DB或没有扩展名,表的类型是Paradox表;如果数据库文件的扩展名为.DBF时,表的类型是dBASE表;如果数据库文件的扩展名为
7、.TXT时,表的类型是文本数据库表。 注意,该属性不适用于连接远程SQL数据库服务器中表的时候。4Active属性该属性为Boolean类型,通过该属性可以判断或指定是否打开数据集。如果该属性为False,表 示数据库被关闭,此时数据集不能存取数据,而数据感知组件也不能进行数据读取和邮寄修改结果的操作。当将该属性值设置为True时,将执行下列操作:触发BeforeOpen事件将数据集设为dsBrowse(浏览)状态制定数据访问方法(通常是建立游标)触发AfterOpen事件当将该属性值设置为False时,将执行下列操作:触发BeforeClose事件把State属性设置为dsInactive(
8、关闭)状态关闭游标触发AfterClose事件设计期可以在对象监视器里修改该属性值,运行时则可以通过给属性赋值或调用相应方法实现该属性值的修改,例如:语句: Table1.active:=true; 等价于 Table1.open; Table1.active:=false 等价于 Table1.close;5Exclusive属性 该属性是Boolean,用来指定是否以共享方式打开数据库表。如果值为True,当打开一个数据库表时,其他用户就不能访问该表了,如果表已经被期它用户使用,则会产生一个异常;若Exclusive的值为False,将以共享方式打开一个数据库表。 显然不能将其他用户正在访
9、问的表以互斥方式打开(设定Exclusive的值为True)。对于SQL数据库服务器上的数据库表,当以互斥方式被一个用户打开时,其他用户可以读取该表中的数据,但不能修改表中的数据,当然有些数据库 服务器不支持这种方式,这要具体参看有关的数据库服务器的文档。在改变该属性值前,数据集必需先关闭。在设计期,如果已经设置Active属性为True,就不要把该属性也设置为True。因为IDE已经打开了指定的表,这样的话会产生一个异常。6ReadOnly属性该属性决定用户是否能够对表中的数据进行读写。值为True 时,用户只能读取表中的数据,值为False时,用户可以读写表中的数据(前提是用户有读写数据库
10、表的权限)。7CanModify属性该属性是一个只读属性,用户不能够修改其属性值,它由应用程序打开一张表时自动设置,反映用户对数据库表拥有的实际特权。当ReadOnly属性值为True时,该属性将自动地被设为False,当ReadOnly属性值为False时,若用户对数据库表有读写权限时,该属性值为True,否则该属性值为False。当该属性值为False时,数据库表是只读的,不能将数据集置为编辑或插入状态;当该属性为True时,虽然数据库表对应的数据集部件可以置成编辑和插入状态,但是用户不一定能够更新表中的数据,因为这还要受到其他因素的限制,如用户对数据库服务器的访问权限等。8IndexFi
11、elds属性IndexFields的属性值是一个下标从0开始的数据库表中字段名的数组,它包含与TTable组件相连的数据库表中的全部索引字段。IndexFieldsCount属性说明表中索引字段的个数。这两个属性值都是只读的,只有在程序运行过程中可用。运行期应该使用IndexFieldsName属性来对数据集进行排序,而不要直接设置IndexFields属性的值。9IndexName属性和IndexFieldNames属性IndexName该属性是一个只读的辅助索引名列表,存放建立数据库表时定义的所有辅助索引名。IndexFieldNames属性指定数据库表用来排序的索引字段名,多个字段名之间
12、用分号隔开。字段必须存在于相应的数据库表中,否则会导致错误。这两个属性是互斥的,设置其中一个,会自动清除另一个。10. KeyExclusive属性该属性是布尔型变量,默认值为False。它的作用是在表中指定检索范围时,用来指定是否包括满足过滤条件的边界记录。当值为False时,检索范围包括边界记录,否则不包括边界记录。11State属性 该属性标明数据集所处的工作模式,即确定可 以对数据做哪些操作。其可能的取值及意义如表13-2: 表 13-2 数据表工作模式取值及意义 数据集的状态在应用程序处理数据的过程中不断的变化着。当数据集被打开时,状态由dsInactive改为dsBrowse。程序
13、可以调用Edit、Insert方法将数据集置为dsEdit、dsInsert状态。如果是TTable或TClientDataSet部件,还可以调用SetKey方法或SetRange方法将数据集置为dsSetKey状态。邮寄或撤消地数据的修改将把数据集由当前状态置为dsBrowse状态。关闭数据集则将数据集由当前状态置为dsInactive状态。12.Filter属性和 Filtered属性在访问一个数据集时,当只需要浏览符合特定条件的记录而不是全部记录时,可以通过设置数据 集组件的Filter属性很方便的实现。Filter属性可以用一个字符串描述为数据集设定的过滤条件。程序运行时,所访问的数据
14、集中,只有符合该过滤条件的记录才会返回给数据集组件。比如,如下的过滤属性设置使数据集只返回state字段是CA或MA的记录:State = CA or State = MA;过滤条件的设置支持通配符,比如:State = M*表示以“M”开头的所有取值。如果用来设置过滤条件的字段名中有空格,则需要用一对“ ”符号将该字段名括直来,比如:Species Name = Gymnothorax mordax。过滤属性的设置可以有多种方式,例如:Dataset1.Filter := State = + QuotedStr(CA);/固定字符串方式;Dataset1.Filter := Edit1.Te
15、xt; /由用户输入;Dataset1.Filter := State = + QuotedStr(Edit1.Text);/部分由用户输入;Dataset1.Filter := State CA or State = BLANK;/复杂条件表达式;在条件表达式中可使用的操作符有如下几个:、=、=、=、AND、NOT、OR、+、-、*、/、*(通配符)Filtered属性为Boolean,用来指定Filter属性设置的过滤条件是否有效。因此,在设置完Filter属性后,还必须设置Filtered属性为True,才能真正的实现对记录的过滤。13.Bof属性和Eof属性这两个属性都是Boolean
16、类型,分别用来测试记录指针(即当前记录)是否处于表的开头(第一条记录)和结尾(最后一条记录),如果是,则返回True。Bof(Beginning of file)属性在下列情况下返回True,其它情况下均返回False: 打开数据集。 调用数据集组件的First方法。 记录指针指向第一条记录时调用数据集组件的Prior方法。 对一个空数据集或数据集使用范围调用SetRange方法。 相应的,Eof(end-of-file)属性在下列情况下返回True,其它情况下返回False: 打开空数据集。 调用数据集组件的Last方法。 记录指针指向最后一条记录时调用数据集组件的Next方法。 对一个空数
17、据集或数据集使用范围调用SetRange方法。 明显地,如果Bof和Eof属性都返回True,则该数据集或使用范围为空。14.RecordCount属性。 该属性为LongInt类型,用于返回数据集总的记录条数。利用它和RecNo属性配合,可以代替First、Last、MoveBy、Prior等方法实现对数据集所有记录的遍历操作。但是在程序中应该谨慎使用该属性,因为该操作代价很大,影响程序性能,特别是在SQL查询结果返回大量记录的时候。因此通常只对Paradox和dBASE表使用该属性。 另外,如果数据集不是Paradox类型并且有过滤条件在起作用或者是 设置了使用范围,则该属性返回值可能仅是
18、一个近似值。15.FieldValues属性 在程序中,可以通过FieldValues属性访问数据集当前记录的各个字段值。该属性的定义如下:property FieldValuesconst FieldName: string: Variant; default;其中的FieldName是要访问的字段名。该参数可以是单个字段名,也可以是多个字段名或字段对象的集合。因为这种灵活性,通常在程序,采用该属性或FieldByName方法比采用Fields、Fieldist等属性访问字段值要更好一些。另外,该属性为了能处理各种数据类型的字段使用的是可变类型值,这样在处理速度上会比使用字段原本的数据类型值
19、要慢(比如使用字段对象的as*属性),特别是有大量数据需要处理时更是如此。该属性使用示例如下,代码功能是向数据集中添加一条记录:SampleTable.Append; SampleTable.FieldValuesALPHANUMERIC := Edit1.text;SampleTable.FieldValuesINTEGER := StrToInt(Edit2.text);SampleTable.Post; TTable部件中MasterSource属性和MasterFields属性是用于定义主-从关系表的。MasterSource属性指定主表对应的TDataSource部件,MasterF
20、ields属性指定主表和明细表之间建立联系的字段。主表和明细表建立一对多关系时,如果是多个字段要用分号隔开。在设计阶段可以使用字段连接设计器(Field Link Designer)为两上表创建一对多的关系。13.1.2 TTable组件的常用方法1.设定数据库表的使用范围 应用程序可能只需对表中一部分记录进行操作,此时应为应用程序指定一个使用表中记录的范围。为此,TTable组件提供了下列方法供用户使用: SetRangeStart和EditRangeStart方法 SetRangeEnd和EditRangeEnd方法 SetRange(Start Values,End Values)方法
21、ApplyRange方法 CancelRange方法 1)SetRangeStart方法用于指定检索范围的起始记录,调用SetRangeStart方法之后,可以为起始记录的一个或多个字段指定相应的字段值。SetRangeEnd方法用于指定检索范围的结束记录,调用SetRangeEnd方法之后,可以为结束记录的一个或多个字段指定相应的字段值。 2)SetRange方法包含了SetRangeStart和SetRangeEnd方法的功能,它可以同时指定检索范围的起始和结束记录,起始记录和结束记录的字段值以数组形式送给SetRange,其基本形式是:SetRange(起始值,结束值) 3)ApplyR
22、ange方法根据SetRangeStart,SetRangeEnd或SetRange方法说明的检索范围的起始和结束记录,具体设定一个检索范围,调用ApplyRange方法之后, 应用程序只能对检索范围内的记录进行有关的操作。 4)CancelRange方法的作用与ApplyRange方法的作用是相反的,这是取消为表设定的检索范围,调用CancelRange方法之后应用程序可以对表中全部记录进行有关的操作。注意:如果是paradox表或dBASE表,调用SetRangeStart,SetRangeEnd、SetRange时,只能为表中的索引字段或定义的索引指定相应的字段值,以设定检索范围。如果使
23、用SQL数据库服务器中的数据库表,可以为IndexFieldNames属性中指定的字段指定相应的字段值。 5)EditRangeStart和EditRangeEnd方法是用来设定一个可编辑的范围,其使用方法完全类似与SetRangeStart和SetRangeEnd。2.数据维护方法数据集中的数据维护主要包括数据记录的修改,插入和删除。Delphi为数据集部件提供了相应的方法用于其中的数据维护。这里以TTable组件为例介绍这些方法。1) Edit方法:将数据集置为编辑状态。如果数据集为空,则调用Insert方法,否则执行以下动作: 如果需要,投寄之前的记录的修改。 检查CanModify属性
24、,如果数据集不可编辑,则产生一个异常。 调用BeforeEdit事件处理过程。 检索记录。 将数据集置为编辑状态,允许程序或用户编辑数据。 向所关联的组件广播数据集的状态改变。 调用AfterEdit事件处理过程。2) Append方法:向数据集的未尾新添加一条空记录,并将其置为当前记录。例如:SampleTable.Append;SampleTable.FieldValuesALPHANUMERIC := Edit1.text;SampleTable.FieldValuesINTEGER :=StrToInt(Edit2.text);SampleTable.Post;3) Insert方法:
25、向数据集中新添加一条空记录,并将其置为当前记录。例如:table1.Insert;table1.FieldByName(QUANTITY).AsInteger :=StrToInt(Edit1.Text);table1.Post;这两个方法都将数据集置为插入状态,以在表中添加新记录。Insert方法是在当前指针位置的记录后面插入一条新记录,Append方法是在表的最后插入一条新记录。然而,无论用户是调用Insert方法还是Append方法插入新记录,增加记录到一个具有索引的表中时,其写入位置都是按照索引顺序的,也就是说对于索引表格Insert方法和Append方法的作用是一样的。另外,Inse
26、rt方法和Append方法实际上只插入一条空白记录,所以必须在调用Insert或Append方法之后,给新记录的各个字段赋值,最后调用post方法,将插入的记录写回数据库表。 4) Post方法: 将插入的新记录和修改的记录写回磁盘上的数据库表,即投寄。当投寄成功时数据集回到浏览状态,若投寄不成功数据集仍然保持原有状态。post方法既可以显式地调用,也可以隐含地调用。当数据集处于编辑状态或插入状态,当移动记录指针时,Delphi会隐含地调用post方法,将当前记录的修改写回数据库表;在程序调用Insert方法或Append方法时,也会隐含地调用Post方法,将先前的数据集的修改写回数据库表。在
27、程序中,Edit方法和post方法常常配合在一起使用,用于修改表中的记录。5) Cancel方法:取消当前尚未投寄的修改操作且将数据集置为浏览状态。通常用在响应用户取消修改的请求中,例如:if MessageDlg(Update Record?, mtConfirmation, mbYes, mbNo, 0) = mrYes then table1.Postelse table1.Cancel;6) Delete方法:删除当前记录指针所在的记录,将记录指针指向一条记录且将数据集置为浏览状态。如果数据集处于非活动状态,则产生一个异常,否则做以下操作: 验证数据集非空,否则产生一个异常。 如果需要
28、,投寄之前的记录的修改。 调用BeforeDelete事件处理过程。 删除当前记录,并清除与之有关的缓冲区。 将数据集置为dsBrowse状态。 将下一条未被删除的记录设置为当前记录。如果删除的是最后一条记录,则将前一条记设置为当前记录。 调用AfterDelete事件处理过程。7) AppendRecord方法:该方法的过程申明:procedure AppendRecord(const Values: array of const);其作用是在表的最后插入一条新记录,记录的各个字段值按顺序对应于AppendRecor的参数值。如下例: Customer.AppendRecord(CustNo
29、Edit.Text,CoNameEdit.Text, AddrEdit.Text, Nil, Nil, Nil, Nil, Nil, Nil, DiscountEdit.Text);8) InsertRecord方法:该方法的过程申明:procedure InsertRecord(const Values: array of const);其作用是在当前指针所在记录的后面插入一条新记录,记录的各个字段值按顺序对应于InsertRecord的参数值。例如:Customer.InsertRecord(CustNoEdit.Text, CoNameEdit.Text, AddrEdit.Text,
30、Nil, Nil, Nil, Nil, Nil, Nil, DiscountEdit.Text);AppendRecord方法和InsertRecord方法比Append和Insert方法使用起来更简单方便一些。 它们直接在表中插入一条新记录,其参数按顺序作为新记录各字段值,并且不需显式地调用post方法。在用参数数据给新记录赋字段值时,可以为每一个字段提供一个值,也可以省略某个字段序列后面的一些字段值,Delphi会用空值来填充这些字段。用户也可以传递保留字NIl明确地对某些字段用空值填充。9) SetFields方法:该方法过程申明:procedure SetFields(const Va
31、lues: array of const);其功能是一次修改表中当前记录的多个字段的值。调用该方法之前必须将数据集部件置成编辑状态,调用之后,还要调用post方法,才能真正将当前记录的修改写回数据库表。调用SetFields方法时,参数值必须与表中实际的字段对应,并且数据类型要匹配。例如: Table1.Edit;Tabel1.SetFields(, , ,9600000,1200000000);Tabel1.post;10) FieldByName方法:方法定义:function FieldByName(const FieldName: string): TField;该方法用来返回由参数F
32、ieldName指定名称的字段信息。注意其返回值是一个字段对象(TField类型)。如果指定的字段并不存在,则会引发一个EDatabaseError异常。该方法的功能与用法与FieldValues属性很类似。程序示例:Table1.Insert;Table1.FieldByName(QUANTITY).AsInteger := StrToInt(Edit1.Text);Table1.Post;11) Abort方法:该方法是用于取消其他方法的调用的,如在插入记录、修改记录和删除记录之前,往往需要用户确认是否真的要执行这种操作,此时调用Abort方法便可取消各种方法的调用。下面的代码是在用户删除
33、一条记之前,让用户确认是否真的要执行删除操作。Tabel1.BeforeDelete(DataSet:TDataSet);beginIf MessageDlg(真的要删除记录吗?,mtConfirmation,mbyesNoCanel,0) mryes Then Abort; 取消删除操作end;3.移动记录指针的方法1) First方法:将记录指针移到第一条记录位置处。2) Last方法:将记录指针移到最后一条记录位置处。3) Next方法:将记录指针移到下一条记录位置处。4) Prior方法:将记录指针移到上一条记录位置处。4.数据库表的操作方法1) CreateTable方法:调用Cre
34、ateTable方法,可以在程序中根据需要定义并创建新的数据库表。如果指定的表名已经存在,则该方法会用新定义的表结构覆盖原表的结构和数据,所以在调用该方法创建一个新表之前,应该检查Exists属性确定表是否已存在。如果指定了FieldDefs属性的值,则其值将被用于新表中的字段定义,否则将用Fields属性中的值来定义表结构。如果IndexDefs属性中包含有值,则将被用作定义新表的索引。用该方法定义新表的步骤如下:设置TTable组件Active属性为False;指定要创建新表的类型和表名检查该名字的表是否存在定义字段定义索引调用CreateTable方法程序示例:with Table1 d
35、o begin Active := False; DatabaseName := DBDEMOS; TableType := ttParadox; TableName := CustInfo; if not Table1.Exists then beginwith FieldDefs do begin Clear; with AddFieldDef do begin Name := Field1; DataType := ftInteger; Required := True; end; with AddFieldDef do begin Name := Field2; DataType :=
36、 ftString; Size := 30; end; end;with IndexDefs do begin Clear; with AddIndexDef do begin Name := ; Fields := Field1; Options := ixPrimary; end; with AddIndexDef do begin Name := Fld2Indx; Fields := Field2; Options := ixCaseInsensitive; end; end; CreateTable; end;end;2) DeleteTable方法:该方法用来删除与TTable组件
37、关联的数据库表。调用该方法之前必须先关闭表。删除操作将清除表中所有数据和表的结构,使用要慎重。如果仅仅是想清除数据,可以使用EmptyTable方法。程序示例:with Table1 dobegin Active := False; DatabaseName := DBDEMOS; TableName := Customer; TableType := ttParadox; DeleteTable;end;2) EmptyTable方法:该方法用来清空与TTable组件关联的数据库表。如果用户对表没有该操作权限,清空操作失败。 3) RenameTable方法:该方法定义:procedure
38、RenameTable(const NewTableName: String);其作用是重命名与TTable组件关联的Paradox或dBASE表。新的表名由参数NewTableName给出。 4) IsEmpty方法:该方法定义:function IsEmpty: Boolean;其作用是判断与TTable组件关联的数据库是否是空表。返回值为True表示该表为空表,即不包含任何数据记录。 5) Open方法:该方法用于打开TTable组件关联的数据库表以进行数据访问。6) Close方法:该方法用于打开TTable组件关联的数据库表以进行数据访问。查看Open和Close方法的源代码会发现,
39、这两个方法事实上就是通过分别设置TTable组件的Active属性值为True和False实现的。因此,调用它们的结果,在Active属性中已详细介绍过,这里不再重复。5.查找数据库表中的记录 要想在数据库表中查找记录,必须指定要查找记录的一些字段的值,然后在表中检索相匹配的记录。如果在Paradox或dBASE表中查找记录,则对应的字段必须是表中的关键字段或辅助索引字段。如果查找SQL服务器中的表,那么查找值 必须是表的IndexFieldNames属性中指定的字段。Delphi提供了两种方式在数据库表中查找记录:Goto方式和Find方式,主要区别在于指定查找值的方法不同。(1)使用Got
40、o方式查找的方法有SetKey方法、GotoKey方法和GotoNearest方法。其操作步骤如下: 确保要查找的字段是关键字段或辅助索引字段。 调用SetKey方法把与表对应的TTable部件置成查找状态。 把查找值赋给相应的字段。 调用GotoKey方法,测试它的返回值以判断查找是否成功。如下例:Table1.SetKey; Table1.Field0.AsString := Edit1.Text; Table1.GotoKey; 调用GotoKey方法后,如果返回True,则查找成功,同时记录指针指向找到的记录;如果返回Fale,则查找失败,记录指针的位置不会发生变化。如下例:Table
41、1.SetKey;Table1.Field0.AsString:= Smith;If not Table1.GotoKey thenShowMessage(记录没找到); 如果表中存在多个关键字段或辅助索引字段,但查找时只想为第一个字段指定查找值,则必须要设置TTable组件的KeyFieldCount的属性值为1。如果想为多个字段指定查找值,只能为相邻的字段指定查找值,例如辅助索引中共有三个字段,那么我们只能为第一个字段、第一和第二个字段、第一和第二以及第三个字段指定查找值,而不能为第一和第三个字段指定查找值。GotoNearest方法的使用与GotoKey方法完全一样,只是它用于不精确查找
42、。它不要求查找结果与查找值精确匹配。如果表中有与查找值精确匹配的记录时,它将记录指针移到该记录处,如果表中没有与查找值精确匹配的记录时,它会查找出与查找值最接近的记录,并将记录指针移到该记录处。如果不是以表中的关键字段作为查找字段,也可以为TTable部件的IndexFieldName属性中的字段或IndexName属性中的字段指定查找值进行数据查找。 例如,假设Customer表中有一个名叫CityIndex的辅助索引,为CityIndex中的字段指定查找值进行查找时,首先设置TTable部件的IndexName属性为CityIndex,然后再进行查找,下面是具体的程序代码:Table1.I
43、ndexName := CityIndex;Table1.Open;Table1.SetKey;Table1.FieldByNameCity.AsString := Edit1.Text;Table1.GotoKey; (2)使用Find方式:使用Find方式在数据库中进行数据查找的方法有:FindNearest方法和FindKey方法。FindKey方法和FindNearest方法为数据查找提供了一个简单的方法,它们将SetKey、指定查找值、执行查找三个步骤融合在一步里完成,它们在指定查找值时,是把各字段的查找值组成一个数组传给FindKey或FindNearest。下面是使FindKey
44、方法的一个例子。假设Tabel1对应的表中的第一个字段是关键字段。 Table.FindKey(Edit1.Text); 如果用GotoKey方法完成这一功能则需要编写下面代码:Table1.SetKey;Table1.Fields0.AsStrine := Edit.Text;Table1.GotoKey;FindKey方法和FindNearest方法的区别与GotoKey和GotoNearest方法的区别是一样的。6.控制数据集组件与数据浏览组件连接的方法 数据集组件具有DisableControls、EnableControls、Refresh三个方法用于控制数据集组件和与其相连的数据浏
45、览组件之间的连接及数据的显示。在用户修改、更新以及遍历数据库表中的记录时,应该调用DisbaleControls方法切断数据集组件与数据浏览组件的连接,使数据浏览组件暂时失效。这样做的好处是避免每次对数据集修改之后,与之相联的数据浏览组件更新其显示内容,一方面降低处理速度,另一方面会产生屏幕闪烁。 EnableControls方法的作用与DisbaleControls方法的作用相反,是用来恢复与数据浏览部件的连接,使暂时失效的数据浏览部件正常显示数据集中的记录信息。 Refresh方法用于刷新数据浏览部件中的显示。在调用Refresh方法时,必须要保证数据集组件是打开的。当数据集中的记录被修改
46、之后,调用Refresh方法,数据浏览部件中显示的信息也随之改变。13.1.3 TTable组件的常用事件 数据集组件具有很多的事件。为这些事件编写处理过程可以进行有效性验证、计算可计算字段的值、确认对数据库表的多种操作等等。具体事件及其描述如下:BeforeOpen , Afteropen 在数据集部件被打开之前/之后被触发BeforeClose , Afterclose 在数据集部件被关闭之前/之后被触发BeforeInsert , AfterInsert 在数据集部件进入插入状态之前/之后被触发BeforeEdit , AfterEdit 在数据集部件被编辑之前/之后被触发BeforeP
47、ost , AfterPost 在数据集部件投寄被修改的记录之前/之后被触发BeforeCancel , AfterCancel 在数据集部件取消前一步操作之前/之后被触发BeforeDelete , AfterDelete 在数据集部件删除当前记录之前/之后被触发OnNewRecord 当建立一条新记录时被触发OnCalcFields 当为表中的计算字段计算字段值时被触发13.2 数据源TDataSource组件 TDataSource部件是数据库应用程序开发中非常重要的部件,它是连接数据集部件和数据控制部件的桥梁,使得数据集部件中的数据能够在数据控制部件中被显示和操作,同样数据控制部件也需
48、要关联数据集部件以获取和处理数据。另外,TDataSource部件也被用来连接两个数据集部件以建立它们之间的主从关系。它的使用十分简单,属性、事件和方法比较少。13.2.1 DataSource组件的常用属性1DateSet属性 该属性说明TDataSource部件从中获取数据的数据集部件的名字,可以在设计期或运行期更改该属性指向不同的数据集部件。如果在运行时更改其指向的数据集部件,则可以实现用同一个数据控制部件显示或编辑不同数据集中的数据。2Enable属性 该属性是Boolean类型,可以暂时切断TDataSource部件和与之相连的数据集部件的连接。当它的值为False时,该连接被切断,
49、所有与TDataSource部件相连的数据控制部件将变为一片空白,不显示任何数据信息。当其值变为True时(默认情况),该连接恢复,与之相连的数据控制部件恢复显示数据。但是,实现这种功能更好的方法是调用数据集部件的DisableControls方法和EnableControls 方法,因为这样可以更方便地控制与数据集部件相连的所有TDataSource部件和数据控制部件。3AutoEdit属性该属性为Boolean类型,默认值为True。用于说明是否将与TDataSource部件相连的数据集自动设置为编辑状态。若值为True,当用户试图修改数据控制部件中显示的数据时,TDataSource自动
50、调用数据集的Edit方法将数据集设置为编辑状态,数据集部件中的记录也随之改变;若值为False,用户要想通过数据控制部件或程序修改数据集中的记录,必须调用数据集部件的Edit方法,将其置为编辑状态之后才能够进行。将该属性值设置为False,可以保护数据不被无意的改动。4State属性该属性表明与TDataSource部件关联的数据集当前的状态。详细内容请参看表13-2。13.2.2 DataSource组件的事件TDataSource部件具有三个事件: OnDataChange事件 OnStateChange OnUpdataData OnDataChange事件:当与TDataSource相
51、连的数据集中的记录指针的位置发生改变时,该事件就被触发,也就是说当程序调用数据集部件的Next、Previous、Insert、Append等方法导致记录指针的位置发生改变时,便会触发该事件。该事件一般用于保持应用中多个部件之间的同步。OnUpdataData事件:当数据集部件中当前记录将要被修改时,触发该事件。例如在程序调用post方法之后但在修改后的数据记录真正被写回磁盘中的数据库文件之前触发该事件,在应用中使用非数据浏览部件时要它与数据集保持同步时常使用该事件进行相关的处理。 OnStateChange事件:当与TDataSource部件相连的数据集部件的状态发生改变时, 便触发该事件。
52、因为数据集部件的State属性标明了数据集部件当前所处的状态,当数据集的状态发生变 化时,使用该事件进行有关的处理是很有用的,在一个具体的应用中, 数据集部件的状态常常是频繁地变化的,为了跟踪数据集部件的状态变化, 可以用下面例子中的程序代码将数据集部件当前的状态显示在一个标签上:TForm1.DataSource1OnStateChange(Sender : Tobject);Var S : String;beginCase Table1,State of dsInactive : S := Inactive;dsBrowse : S := Browse;dsEdit : S := Edit
53、;dsInsert : S := SetKey;dsSetKey : S := SetKey;end;Label1.Caption := S;end;类似地我们也可以通过检测数据集部件的状态来控制有关的按钮和菜单项是否有效。 例如:在一个应用窗体中有一个InsertBtn按钮,用于控制向 数据集部件table1对应的数据库表中插入记录;还有一个CancelBtn按钮用于控制是否取消用户对当前记录的修改或插入新记录。下面的程序代码根据Table1的状态来控制这两个按钮的功能。Form1.DataSource1OnStateChange(Sender : Tobject);beginInsertB
54、tn.Enabled := (Table1.State = dsBrowse);CancelBtn.Enabled := Table1.State in dsInsert,dsEdit,dsSetKeyend; 上面的代码中,当Table1处于浏览状态(Browse状态时), 用户是不能够向数据库表中插入新记录的,此时InsertBtn按钮将变灰暗即无效。当Table1不处于Browse状态时,InsertBtn按钮有效,用户是可以向表中插入新记录。同理,只有当Table1处于特入状态(Insert状态)或编辑状态(Edit状态)或查找状态(SetKey状态)时,CancelBtn按钮才有效,
55、也即用户可以取消当前插入的记录、修改当前的记录以及查找到的结果等。13.3 数据控制类组件Delphi2005在Tool Palette的Data Controls页上提供了一个数据控制部件集合。这些部件主要用于设计对数据库中的数据进行浏览、编辑、插入、删除等操作的用户界面。因而数据控制部件常常又被称为数据浏览部件。它们其实是在Standard页上的相应标准部件的基础上,增加了数据浏览功能,能够显示和编辑数据信息。 数据控制部件既能够把数据库中的数据显示到窗体中,又可以将其自身的经过修改的数据写回到数据库中。13.3.1 数据控制类组件的共同特性大部分数据控制类组件的使用方法都很类似,主要包括
56、以下内容:建立与数据集部件的关联数据控制组件必须通过数据源组件(TDataSource组件)建立起与数据集组件的关联以从中获取显示的数据。具体做法: 在窗体或数据模块上添加一个数据集组件和一个数据源组件,分别设置其相关属性,使数据源组件的DataSet属性指向数据集组件。 向窗体添加数据控制类组件,设置其DataSource属性指向上一步添加的数据源组件。 设置其DataField属性指向数据中要显示的字段名。(由于TDBGrid, TDBCtrlGrid和TDBNavigator组件访问的是整个数据集的所有有效字段,所以没有DataField属性,也不需要这一步的操作。) 设置数据集组件的A
57、ctive属性为True,打开数据集,显示数据。 编辑或更新数据 要通过数据控制组件编辑或更新数据,要求与之相关联的数据集必须处于dsEdit状态。如果数据源组件的AutoEdit属性为True,则当用户尝试在数据控制组件中编辑数据时,数据集组件会自动的被设置为dsEdit状态。如果该属性值为False,那么必须提供一种将数据集设置为dsEdit状态的方法,比如使用TDBNavigator的Edit按钮,或者编写代码调用数据集的Edit方法。打开或关闭数据显示 当应用程序要进行一次对数据集的循环操作或执行一个查询时,为了避免每一次的数据改动造成的数据控制组件的显示刷新所带来的屏幕闪烁, 应该暂
58、时中断数据控制组件与数据集组件的关联,不显示数据,等执行完毕后再重新建立关联。具体做法是使用数据集组件的DisableControls方法和EnableControls方法。如下例:CustTable.DisableControls;try CustTable.First; Go to first record, which sets EOF False while not CustTable.EOF do Cycle until EOF is True begin Process each record here . CustTable.Next; EOF False on success;
59、 EOF True when Next fails on last record end;finally CustTable.EnableControls;end; 这里使用了一个TryFinally结构是为了即使在执行迭代过程时出现异常后,程序也能重新建立数据集控制组件和数据集组件间的关联。刷新数据因为数据共享,在应用程序中访问的数据可能同时也被其他程序访问并修改,所以有时需要刷新正在显示的数据。这时可以使和数据集组件的Refresh方法。该方法会从数据集中重新读取数据来覆盖本地缓冲区中的数据。但如果程序使用的是缓冲区更新,则需要在刷新之前向数据集提交当前缓存中的所有更新。刷新可能会产生意想
60、不到的结果,比如某条记录消失,因为有另外一个用户刚刚删除了它。响应鼠标、键盘或定时器事件数据集的Enable属性是用来决定数据集组件是否能够响应鼠标、键盘或定时器事件,并传递信息给关联的数据源组件。默认值是True。如果该值为False,则数据源组件不会从数据控制组件处获得信息,数据控制组件依然显示数据,但处于灰色状态。13.3.2 常用数据控制类组件功能简介TDBNavigator可以向前向后移动记录指针,可以使用该部件对单条记录进行编辑,还可以用它来插入、删除记录以及刷新显示和取消前一次的操作。 TDBText是显示数据库中的数据的文本框,它只能显示数据库表当前记录的字段值,用户不能对其中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国凡士林行业竞争格局及发展风险分析报告
- 2024-2030年中国冶金模具融资商业计划书
- 2023年近视防控工作计划
- 2024-2030年中国养老护理行业竞争格局及投资运营模式分析报告版
- 2024-2030年中国全自动保管箱行业竞争策略及未来发展潜力分析报告
- 2024年发布:网络营销推广合作协议
- 2023年宁波通商基金管理有限公司招聘考试真题
- 2024年办公室装修设计验收合同
- 2023年浙江宁波大学附属人民医院招聘考试真题
- 2024年南京二手房买卖合同蓝本
- 40篇短文搞定高中英语3500单词
- 牙周病科普讲座课件
- 高通量计算材料结构搜索
- 伤口疼痛管理减轻患者痛苦
- 经皮椎体成形术护理-查房
- 物流管理信息系统订单管理信息系统
- 人教版六年级上册数学数学期末应用题训练(含简单答案)
- 动物园服务方案
- nutric评分方法及意义
- 供水巡查管理制度
- (广州卷)2024年中考语文第一次模拟考试卷附答案
评论
0/150
提交评论