《第13章-BDE数据库应用程序开发ppt课件(全).ppt》由会员分享,可在线阅读,更多相关《第13章-BDE数据库应用程序开发ppt课件(全).ppt(151页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第13章BDE数据库应用程序开发13.1TTable组件13.1.1TTable组件的常用属性13.1.2TTable组件的常用方法13.1.3TTable组件的常用事件13.2数据源TDataSource组件13.2.1DataSource组件的常用属性13.2.2DataSource组件的事件13.3数据控制类组件13.3.1数据控制类组件的共同特性13.3.2常用数据控制类组件功能简介13.4Query组件13.4.1Query组件的常用属性13.4.2Query组件的常用方法13.4.3静态查询使用字符连接号“+”实现动态查询使用Params属性实现参数查询使用ParamByName方
2、法实现动态查询13.5使用BDE开发数据库应用程序13.5.1创建数据库表13.5.2制作应用程序界面13.5.3编写代码13.6小结13.7习题Dephi具备强大的数据库应用开发能力,支持多种数据库访问机制。其中一种就是基于BDE的数据库应用开发。BDE(BorlandDataBaseEngine)是Borland公司为其开发工具研发的一种可以被多个应用程序共享的数据访问机制。它封装了强大的数据库操作API,可以对本地数据库或远程数据库轻松实现诸如创建、修改数据库结构、数据存取、更新等操作。通过数据库驱动与数据库进行连接,使BDE能为多种类型的数据库服务器提供统一的访问接口。根据Delphi
3、版本不同,可以访问Paradox、dBASE、FoxPro、Access等类型的本地数据库,同时通过ODBC来访问所拥有的可用ODBC数据源。明显地,在发布基于BDE的数据库应用程序的时候,必须包含一份BDE的拷贝。这样会增加应用程序的体积和程序布署的复杂程度。尽管在应用程序中可以直接通过BDE的API进行数据库操作,但Delphi在组件面板的BDE页上提供的组件封装了其中大部分的功能,使用它们无疑可以使开发工作变得更加简单、高效。利用BDE开发数据库应用程序一般涉及到三类组件:BDE组件、DataAccess组件和DataControls组件。这些组件的关系如图13-1所示。图13-1利用B
4、ED组件访问数据库这三类组件分别分布在Delphi2005的ToolPalettek的BDE页、DataAccess页和DataControls页,如图13-2、13-3、13-4。图13-2BDE组件图13-3数据访问组件图13-4数据控制组件13.1TTable组件TTable组件通过BDE直接访问数据库表中的每一条记录和所有字段。它是最重要的数据集部件之一,使用频率非常高。这里主要介绍其主要的属性、方法和事件,更详细的内容请查阅Delphi的联机帮助文档或相关资料。13.1.1TTable组件的常用属性1DatabaseName属性该属性指定Table组件要访问的数据库的名字。可以是一个
5、BDEAdministrator中定义的数据库别名、一个数据库文件的磁盘路径或者是一个由TDataBase部件连接的数据库。通常使用的是数据库别名,好处是应用程序不用关心数据库文件实际存储的位置。如果数据库文件的存储位置发生改变,只需要在BDEAdministrator中修改别名指向的路径信息即可。2TabelName属性该属性指定Table组件要访问数据库中具体的数据表名称。它可以是一个数据表名,也可以是数据表文件的文件名(包括完整的路径)。同理,通常应该使用数据表的名称。如果在设计期先设置DateBaseName属性,指定数据库别名,然后就可以通过对象监视器在数据表名的下拉列表中选择要访问
6、的数据表。需要注意的是,修改这两个属性,数据集都必须处于关闭状态,即Active属性为False。3TableType属性该属性指定与TTable部件相连接的数据库表的类型。其可能的取值及意义如表13-1:表13-1数据库表类型取值及意义如果TableType属性取值为ttDefault时,表示数据库表的类型由数据库文件的扩展名决定。具体情况为:如果数据库文件的扩展名为.DB或没有扩展名,表的类型是Paradox表;如果数据库文件的扩展名为.DBF时,表的类型是dBASE表;如果数据库文件的扩展名为.TXT时,表的类型是文本数据库表。注意,该属性不适用于连接远程SQL数据库服务器中表的时候。4
7、Active属性该属性为Boolean类型,通过该属性可以判断或指定是否打开数据集。如果该属性为False,表示数据库被关闭,此时数据集不能存取数据,而数据感知组件也不能进行数据读取和邮寄修改结果的操作。当将该属性值设置为True时,将执行下列操作:触发BeforeOpen事件将数据集设为dsBrowse(浏览)状态制定数据访问方法(通常是建立游标)触发AfterOpen事件当将该属性值设置为False时,将执行下列操作:触发BeforeClose事件把State属性设置为dsInactive(关闭)状态关闭游标触发AfterClose事件设计期可以在对象监视器里修改该属性值,运行时则可以通过
8、给属性赋值或调用相应方法实现该属性值的修改,例如:语句:Table1.active:=true;等价于Table1.open;Table1.active:=false等价于Table1.close;5Exclusive属性该属性是Boolean,用来指定是否以共享方式打开数据库表。如果值为True,当打开一个数据库表时,其他用户就不能访问该表了,如果表已经被期它用户使用,则会产生一个异常;若Exclusive的值为False,将以共享方式打开一个数据库表。显然不能将其他用户正在访问的表以互斥方式打开(设定Exclusive的值为True)。对于SQL数据库服务器上的数据库表,当以互斥方式被一个
9、用户打开时,其他用户可以读取该表中的数据,但不能修改表中的数据,当然有些数据库服务器不支持这种方式,这要具体参看有关的数据库服务器的文档。在改变该属性值前,数据集必需先关闭。在设计期,如果已经设置Active属性为True,就不要把该属性也设置为True。因为IDE已经打开了指定的表,这样的话会产生一个异常。6ReadOnly属性该属性决定用户是否能够对表中的数据进行读写。值为True时,用户只能读取表中的数据,值为False时,用户可以读写表中的数据(前提是用户有读写数据库表的权限)。7CanModify属性该属性是一个只读属性,用户不能够修改其属性值,它由应用程序打开一张表时自动设置,反映
10、用户对数据库表拥有的实际特权。当ReadOnly属性值为True时,该属性将自动地被设为False,当ReadOnly属性值为False时,若用户对数据库表有读写权限时,该属性值为True,否则该属性值为False。当该属性值为False时,数据库表是只读的,不能将数据集置为编辑或插入状态;当该属性为True时,虽然数据库表对应的数据集部件可以置成编辑和插入状态,但是用户不一定能够更新表中的数据,因为这还要受到其他因素的限制,如用户对数据库服务器的访问权限等。8IndexFields属性IndexFields的属性值是一个下标从0开始的数据库表中字段名的数组,它包含与TTable组件相连的数据
11、库表中的全部索引字段。IndexFieldsCount属性说明表中索引字段的个数。这两个属性值都是只读的,只有在程序运行过程中可用。运行期应该使用IndexFieldsName属性来对数据集进行排序,而不要直接设置IndexFields属性的值。9IndexName属性和IndexFieldNames属性IndexName该属性是一个只读的辅助索引名列表,存放建立数据库表时定义的所有辅助索引名。IndexFieldNames属性指定数据库表用来排序的索引字段名,多个字段名之间用分号隔开。字段必须存在于相应的数据库表中,否则会导致错误。这两个属性是互斥的,设置其中一个,会自动清除另一个。10.K
12、eyExclusive属性该属性是布尔型变量,默认值为False。它的作用是在表中指定检索范围时,用来指定是否包括满足过滤条件的边界记录。当值为False时,检索范围包括边界记录,否则不包括边界记录。11State属性该属性标明数据集所处的工作模式,即确定可以对数据做哪些操作。其可能的取值及意义如表13-2:表13-2数据表工作模式取值及意义数据集的状态在应用程序处理数据的过程中不断的变化着。当数据集被打开时,状态由dsInactive改为dsBrowse。程序可以调用Edit、Insert方法将数据集置为dsEdit、dsInsert状态。如果是TTable或TClientDataSet部件
13、,还可以调用SetKey方法或SetRange方法将数据集置为dsSetKey状态。邮寄或撤消地数据的修改将把数据集由当前状态置为dsBrowse状态。关闭数据集则将数据集由当前状态置为dsInactive状态。12.Filter属性和Filtered属性在访问一个数据集时,当只需要浏览符合特定条件的记录而不是全部记录时,可以通过设置数据集组件的Filter属性很方便的实现。Filter属性可以用一个字符串描述为数据集设定的过滤条件。程序运行时,所访问的数据集中,只有符合该过滤条件的记录才会返回给数据集组件。比如,如下的过滤属性设置使数据集只返回state字段是CA或MA的记录:State=C
14、AorState=MA;过滤条件的设置支持通配符,比如:State=M*表示以“M”开头的所有取值。如果用来设置过滤条件的字段名中有空格,则需要用一对“”符号将该字段名括直来,比如:SpeciesName=Gymnothoraxmordax。过滤属性的设置可以有多种方式,例如:Dataset1.Filter:=State=+QuotedStr(CA);/固定字符串方式;Dataset1.Filter:=Edit1.Text;/由用户输入;Dataset1.Filter:=State=+QuotedStr(Edit1.Text);/部分由用户输入;Dataset1.Filter:=StateCA
15、orState=BLANK;/复杂条件表达式;在条件表达式中可使用的操作符有如下几个:、=、=、=、AND、NOT、OR、+、-、*、/、*(通配符)Filtered属性为Boolean,用来指定Filter属性设置的过滤条件是否有效。因此,在设置完Filter属性后,还必须设置Filtered属性为True,才能真正的实现对记录的过滤。13.Bof属性和Eof属性这两个属性都是Boolean类型,分别用来测试记录指针(即当前记录)是否处于表的开头(第一条记录)和结尾(最后一条记录),如果是,则返回True。Bof(Beginningoffile)属性在下列情况下返回True,其它情况下均返回
16、False:打开数据集。调用数据集组件的First方法。记录指针指向第一条记录时调用数据集组件的Prior方法。对一个空数据集或数据集使用范围调用SetRange方法。相应的,Eof(end-of-file)属性在下列情况下返回True,其它情况下返回False:打开空数据集。调用数据集组件的Last方法。记录指针指向最后一条记录时调用数据集组件的Next方法。对一个空数据集或数据集使用范围调用SetRange方法。明显地,如果Bof和Eof属性都返回True,则该数据集或使用范围为空。14.RecordCount属性。该属性为LongInt类型,用于返回数据集总的记录条数。利用它和RecNo
17、属性配合,可以代替First、Last、MoveBy、Prior等方法实现对数据集所有记录的遍历操作。但是在程序中应该谨慎使用该属性,因为该操作代价很大,影响程序性能,特别是在SQL查询结果返回大量记录的时候。因此通常只对Paradox和dBASE表使用该属性。另外,如果数据集不是Paradox类型并且有过滤条件在起作用或者是设置了使用范围,则该属性返回值可能仅是一个近似值。15.FieldValues属性在程序中,可以通过FieldValues属性访问数据集当前记录的各个字段值。该属性的定义如下:propertyFieldValuesconstFieldName:string:Variant
18、;default;其中的FieldName是要访问的字段名。该参数可以是单个字段名,也可以是多个字段名或字段对象的集合。因为这种灵活性,通常在程序,采用该属性或FieldByName方法比采用Fields、Fieldist等属性访问字段值要更好一些。另外,该属性为了能处理各种数据类型的字段使用的是可变类型值,这样在处理速度上会比使用字段原本的数据类型值要慢(比如使用字段对象的as*属性),特别是有大量数据需要处理时更是如此。该属性使用示例如下,代码功能是向数据集中添加一条记录:SampleTable.Append;SampleTable.FieldValuesALPHANUMERIC:=Edi
19、t1.text;SampleTable.FieldValuesINTEGER:=StrToInt(Edit2.text);SampleTable.Post;TTable部件中MasterSource属性和MasterFields属性是用于定义主-从关系表的。MasterSource属性指定主表对应的TDataSource部件,MasterFields属性指定主表和明细表之间建立联系的字段。主表和明细表建立一对多关系时,如果是多个字段要用分号隔开。在设计阶段可以使用字段连接设计器(FieldLinkDesigner)为两上表创建一对多的关系。13.1.2TTable组件的常用方法1.设定数据库表
20、的使用范围应用程序可能只需对表中一部分记录进行操作,此时应为应用程序指定一个使用表中记录的范围。为此,TTable组件提供了下列方法供用户使用:SetRangeStart和EditRangeStart方法SetRangeEnd和EditRangeEnd方法SetRange(StartValues,EndValues)方法ApplyRange方法CancelRange方法1)SetRangeStart方法用于指定检索范围的起始记录,调用SetRangeStart方法之后,可以为起始记录的一个或多个字段指定相应的字段值。SetRangeEnd方法用于指定检索范围的结束记录,调用SetRangeEn
21、d方法之后,可以为结束记录的一个或多个字段指定相应的字段值。2)SetRange方法包含了SetRangeStart和SetRangeEnd方法的功能,它可以同时指定检索范围的起始和结束记录,起始记录和结束记录的字段值以数组形式送给SetRange,其基本形式是:SetRange(起始值,结束值)3)ApplyRange方法根据SetRangeStart,SetRangeEnd或SetRange方法说明的检索范围的起始和结束记录,具体设定一个检索范围,调用ApplyRange方法之后,应用程序只能对检索范围内的记录进行有关的操作。4)CancelRange方法的作用与ApplyRange方法的
22、作用是相反的,这是取消为表设定的检索范围,调用CancelRange方法之后应用程序可以对表中全部记录进行有关的操作。注意:如果是paradox表或dBASE表,调用SetRangeStart,SetRangeEnd、SetRange时,只能为表中的索引字段或定义的索引指定相应的字段值,以设定检索范围。如果使用SQL数据库服务器中的数据库表,可以为IndexFieldNames属性中指定的字段指定相应的字段值。5)EditRangeStart和EditRangeEnd方法是用来设定一个可编辑的范围,其使用方法完全类似与SetRangeStart和SetRangeEnd。2.数据维护方法数据集中
23、的数据维护主要包括数据记录的修改,插入和删除。Delphi为数据集部件提供了相应的方法用于其中的数据维护。这里以TTable组件为例介绍这些方法。1)Edit方法:将数据集置为编辑状态。如果数据集为空,则调用Insert方法,否则执行以下动作:如果需要,投寄之前的记录的修改。检查CanModify属性,如果数据集不可编辑,则产生一个异常。调用BeforeEdit事件处理过程。检索记录。将数据集置为编辑状态,允许程序或用户编辑数据。向所关联的组件广播数据集的状态改变。调用AfterEdit事件处理过程。2)Append方法:向数据集的未尾新添加一条空记录,并将其置为当前记录。例如:SampleT
24、able.Append;SampleTable.FieldValuesALPHANUMERIC:=Edit1.text;SampleTable.FieldValuesINTEGER:=StrToInt(Edit2.text);SampleTable.Post;3)Insert方法:向数据集中新添加一条空记录,并将其置为当前记录。例如:table1.Insert;table1.FieldByName(QUANTITY).AsInteger:=StrToInt(Edit1.Text);table1.Post;这两个方法都将数据集置为插入状态,以在表中添加新记录。Insert方法是在当前指针位置的记
25、录后面插入一条新记录,Append方法是在表的最后插入一条新记录。然而,无论用户是调用Insert方法还是Append方法插入新记录,增加记录到一个具有索引的表中时,其写入位置都是按照索引顺序的,也就是说对于索引表格Insert方法和Append方法的作用是一样的。另外,Insert方法和Append方法实际上只插入一条空白记录,所以必须在调用Insert或Append方法之后,给新记录的各个字段赋值,最后调用post方法,将插入的记录写回数据库表。4)Post方法:将插入的新记录和修改的记录写回磁盘上的数据库表,即投寄。当投寄成功时数据集回到浏览状态,若投寄不成功数据集仍然保持原有状态。po
26、st方法既可以显式地调用,也可以隐含地调用。当数据集处于编辑状态或插入状态,当移动记录指针时,Delphi会隐含地调用post方法,将当前记录的修改写回数据库表;在程序调用Insert方法或Append方法时,也会隐含地调用Post方法,将先前的数据集的修改写回数据库表。在程序中,Edit方法和post方法常常配合在一起使用,用于修改表中的记录。5)Cancel方法:取消当前尚未投寄的修改操作且将数据集置为浏览状态。通常用在响应用户取消修改的请求中,例如:ifMessageDlg(UpdateRecord?,mtConfirmation,mbYes,mbNo,0)=mrYesthentable
27、1.Postelsetable1.Cancel;6)Delete方法:删除当前记录指针所在的记录,将记录指针指向一条记录且将数据集置为浏览状态。如果数据集处于非活动状态,则产生一个异常,否则做以下操作:验证数据集非空,否则产生一个异常。如果需要,投寄之前的记录的修改。调用BeforeDelete事件处理过程。删除当前记录,并清除与之有关的缓冲区。将数据集置为dsBrowse状态。将下一条未被删除的记录设置为当前记录。如果删除的是最后一条记录,则将前一条记设置为当前记录。调用AfterDelete事件处理过程。7)AppendRecord方法:该方法的过程申明:procedureAppendRe
28、cord(constValues:arrayofconst);其作用是在表的最后插入一条新记录,记录的各个字段值按顺序对应于AppendRecor的参数值。如下例:Customer.AppendRecord(CustNoEdit.Text,CoNameEdit.Text,AddrEdit.Text,Nil,Nil,Nil,Nil,Nil,Nil,DiscountEdit.Text);8)InsertRecord方法:该方法的过程申明:procedureInsertRecord(constValues:arrayofconst);其作用是在当前指针所在记录的后面插入一条新记录,记录的各个字段值按
29、顺序对应于InsertRecord的参数值。例如:Customer.InsertRecord(CustNoEdit.Text,CoNameEdit.Text,AddrEdit.Text,Nil,Nil,Nil,Nil,Nil,Nil,DiscountEdit.Text);AppendRecord方法和InsertRecord方法比Append和Insert方法使用起来更简单方便一些。它们直接在表中插入一条新记录,其参数按顺序作为新记录各字段值,并且不需显式地调用post方法。在用参数数据给新记录赋字段值时,可以为每一个字段提供一个值,也可以省略某个字段序列后面的一些字段值,Delphi会用空值
30、来填充这些字段。用户也可以传递保留字NIl明确地对某些字段用空值填充。9)SetFields方法:该方法过程申明:procedureSetFields(constValues:arrayofconst);其功能是一次修改表中当前记录的多个字段的值。调用该方法之前必须将数据集部件置成编辑状态,调用之后,还要调用post方法,才能真正将当前记录的修改写回数据库表。调用SetFields方法时,参数值必须与表中实际的字段对应,并且数据类型要匹配。例如:Table1.Edit;Tabel1.SetFields(,,9600000,1200000000);Tabel1.post;10)FieldByNa
31、me方法:方法定义:functionFieldByName(constFieldName:string):TField;该方法用来返回由参数FieldName指定名称的字段信息。注意其返回值是一个字段对象(TField类型)。如果指定的字段并不存在,则会引发一个EDatabaseError异常。该方法的功能与用法与FieldValues属性很类似。程序示例:Table1.Insert;Table1.FieldByName(QUANTITY).AsInteger:=StrToInt(Edit1.Text);Table1.Post;11)Abort方法:该方法是用于取消其他方法的调用的,如在插入记
32、录、修改记录和删除记录之前,往往需要用户确认是否真的要执行这种操作,此时调用Abort方法便可取消各种方法的调用。下面的代码是在用户删除一条记之前,让用户确认是否真的要执行删除操作。Tabel1.BeforeDelete(DataSet:TDataSet);beginIfMessageDlg(真的要删除记录吗?,mtConfirmation,mbyesNoCanel,0)mryesThenAbort;取消删除操作end;3.移动记录指针的方法1)First方法:将记录指针移到第一条记录位置处。2)Last方法:将记录指针移到最后一条记录位置处。3)Next方法:将记录指针移到下一条记录位置处。
33、4)Prior方法:将记录指针移到上一条记录位置处。4.数据库表的操作方法1)CreateTable方法:调用CreateTable方法,可以在程序中根据需要定义并创建新的数据库表。如果指定的表名已经存在,则该方法会用新定义的表结构覆盖原表的结构和数据,所以在调用该方法创建一个新表之前,应该检查Exists属性确定表是否已存在。如果指定了FieldDefs属性的值,则其值将被用于新表中的字段定义,否则将用Fields属性中的值来定义表结构。如果IndexDefs属性中包含有值,则将被用作定义新表的索引。用该方法定义新表的步骤如下:设置TTable组件Active属性为False;指定要创建新表
34、的类型和表名检查该名字的表是否存在定义字段定义索引调用CreateTable方法程序示例:withTable1dobeginActive:=False;DatabaseName:=DBDEMOS;TableType:=ttParadox;TableName:=CustInfo;ifnotTable1.ExiststhenbeginwithFieldDefsdobeginClear;withAddFieldDefdobeginName:=Field1;DataType:=ftInteger;Required:=True;end;withAddFieldDefdobeginName:=Field2
35、;DataType:=ftString;Size:=30;end;end;withIndexDefsdobeginClear;withAddIndexDefdobeginName:=;Fields:=Field1;Options:=ixPrimary;end;withAddIndexDefdobeginName:=Fld2Indx;Fields:=Field2;Options:=ixCaseInsensitive;end;end;CreateTable;end;end;2)DeleteTable方法:该方法用来删除与TTable组件关联的数据库表。调用该方法之前必须先关闭表。删除操作将清除表中
36、所有数据和表的结构,使用要慎重。如果仅仅是想清除数据,可以使用EmptyTable方法。程序示例:withTable1dobeginActive:=False;DatabaseName:=DBDEMOS;TableName:=Customer;TableType:=ttParadox;DeleteTable;end;2)EmptyTable方法:该方法用来清空与TTable组件关联的数据库表。如果用户对表没有该操作权限,清空操作失败。3)RenameTable方法:该方法定义:procedureRenameTable(constNewTableName:String);其作用是重命名与TTab
37、le组件关联的Paradox或dBASE表。新的表名由参数NewTableName给出。4)IsEmpty方法:该方法定义:functionIsEmpty:Boolean;其作用是判断与TTable组件关联的数据库是否是空表。返回值为True表示该表为空表,即不包含任何数据记录。5)Open方法:该方法用于打开TTable组件关联的数据库表以进行数据访问。6)Close方法:该方法用于打开TTable组件关联的数据库表以进行数据访问。查看Open和Close方法的源代码会发现,这两个方法事实上就是通过分别设置TTable组件的Active属性值为True和False实现的。因此,调用它们的结果
38、,在Active属性中已详细介绍过,这里不再重复。5.查找数据库表中的记录要想在数据库表中查找记录,必须指定要查找记录的一些字段的值,然后在表中检索相匹配的记录。如果在Paradox或dBASE表中查找记录,则对应的字段必须是表中的关键字段或辅助索引字段。如果查找SQL服务器中的表,那么查找值必须是表的IndexFieldNames属性中指定的字段。Delphi提供了两种方式在数据库表中查找记录:Goto方式和Find方式,主要区别在于指定查找值的方法不同。(1)使用Goto方式查找的方法有SetKey方法、GotoKey方法和GotoNearest方法。其操作步骤如下:确保要查找的字段是关键
39、字段或辅助索引字段。调用SetKey方法把与表对应的TTable部件置成查找状态。把查找值赋给相应的字段。调用GotoKey方法,测试它的返回值以判断查找是否成功。如下例:Table1.SetKey;Table1.Field0.AsString:=Edit1.Text;Table1.GotoKey;调用GotoKey方法后,如果返回True,则查找成功,同时记录指针指向找到的记录;如果返回Fale,则查找失败,记录指针的位置不会发生变化。如下例:Table1.SetKey;Table1.Field0.AsString:=Smith;IfnotTable1.GotoKeythenShowMess
40、age(记录没找到);如果表中存在多个关键字段或辅助索引字段,但查找时只想为第一个字段指定查找值,则必须要设置TTable组件的KeyFieldCount的属性值为1。如果想为多个字段指定查找值,只能为相邻的字段指定查找值,例如辅助索引中共有三个字段,那么我们只能为第一个字段、第一和第二个字段、第一和第二以及第三个字段指定查找值,而不能为第一和第三个字段指定查找值。GotoNearest方法的使用与GotoKey方法完全一样,只是它用于不精确查找。它不要求查找结果与查找值精确匹配。如果表中有与查找值精确匹配的记录时,它将记录指针移到该记录处,如果表中没有与查找值精确匹配的记录时,它会查找出与查
41、找值最接近的记录,并将记录指针移到该记录处。如果不是以表中的关键字段作为查找字段,也可以为TTable部件的IndexFieldName属性中的字段或IndexName属性中的字段指定查找值进行数据查找。例如,假设Customer表中有一个名叫CityIndex的辅助索引,为CityIndex中的字段指定查找值进行查找时,首先设置TTable部件的IndexName属性为CityIndex,然后再进行查找,下面是具体的程序代码:Table1.IndexName:=CityIndex;Table1.Open;Table1.SetKey;Table1.FieldByNameCity.AsStrin
42、g:=Edit1.Text;Table1.GotoKey;(2)使用Find方式:使用Find方式在数据库中进行数据查找的方法有:FindNearest方法和FindKey方法。FindKey方法和FindNearest方法为数据查找提供了一个简单的方法,它们将SetKey、指定查找值、执行查找三个步骤融合在一步里完成,它们在指定查找值时,是把各字段的查找值组成一个数组传给FindKey或FindNearest。下面是使FindKey方法的一个例子。假设Tabel1对应的表中的第一个字段是关键字段。Table.FindKey(Edit1.Text);如果用GotoKey方法完成这一功能则需要编
43、写下面代码:Table1.SetKey;Table1.Fields0.AsStrine:=Edit.Text;Table1.GotoKey;FindKey方法和FindNearest方法的区别与GotoKey和GotoNearest方法的区别是一样的。6.控制数据集组件与数据浏览组件连接的方法数据集组件具有DisableControls、EnableControls、Refresh三个方法用于控制数据集组件和与其相连的数据浏览组件之间的连接及数据的显示。在用户修改、更新以及遍历数据库表中的记录时,应该调用DisbaleControls方法切断数据集组件与数据浏览组件的连接,使数据浏览组件暂时失
44、效。这样做的好处是避免每次对数据集修改之后,与之相联的数据浏览组件更新其显示内容,一方面降低处理速度,另一方面会产生屏幕闪烁。EnableControls方法的作用与DisbaleControls方法的作用相反,是用来恢复与数据浏览部件的连接,使暂时失效的数据浏览部件正常显示数据集中的记录信息。Refresh方法用于刷新数据浏览部件中的显示。在调用Refresh方法时,必须要保证数据集组件是打开的。当数据集中的记录被修改之后,调用Refresh方法,数据浏览部件中显示的信息也随之改变。13.1.3TTable组件的常用事件数据集组件具有很多的事件。为这些事件编写处理过程可以进行有效性验证、计算
45、可计算字段的值、确认对数据库表的多种操作等等。具体事件及其描述如下:BeforeOpen,Afteropen在数据集部件被打开之前/之后被触发BeforeClose,Afterclose在数据集部件被关闭之前/之后被触发BeforeInsert,AfterInsert在数据集部件进入插入状态之前/之后被触发BeforeEdit,AfterEdit在数据集部件被编辑之前/之后被触发BeforePost,AfterPost在数据集部件投寄被修改的记录之前/之后被触发BeforeCancel,AfterCancel在数据集部件取消前一步操作之前/之后被触发BeforeDelete,AfterDele
46、te在数据集部件删除当前记录之前/之后被触发OnNewRecord当建立一条新记录时被触发OnCalcFields当为表中的计算字段计算字段值时被触发13.2数据源TDataSource组件TDataSource部件是数据库应用程序开发中非常重要的部件,它是连接数据集部件和数据控制部件的桥梁,使得数据集部件中的数据能够在数据控制部件中被显示和操作,同样数据控制部件也需要关联数据集部件以获取和处理数据。另外,TDataSource部件也被用来连接两个数据集部件以建立它们之间的主从关系。它的使用十分简单,属性、事件和方法比较少。13.2.1DataSource组件的常用属性1DateSet属性该属
47、性说明TDataSource部件从中获取数据的数据集部件的名字,可以在设计期或运行期更改该属性指向不同的数据集部件。如果在运行时更改其指向的数据集部件,则可以实现用同一个数据控制部件显示或编辑不同数据集中的数据。2Enable属性该属性是Boolean类型,可以暂时切断TDataSource部件和与之相连的数据集部件的连接。当它的值为False时,该连接被切断,所有与TDataSource部件相连的数据控制部件将变为一片空白,不显示任何数据信息。当其值变为True时(默认情况),该连接恢复,与之相连的数据控制部件恢复显示数据。但是,实现这种功能更好的方法是调用数据集部件的DisableCont
48、rols方法和EnableControls方法,因为这样可以更方便地控制与数据集部件相连的所有TDataSource部件和数据控制部件。3AutoEdit属性该属性为Boolean类型,默认值为True。用于说明是否将与TDataSource部件相连的数据集自动设置为编辑状态。若值为True,当用户试图修改数据控制部件中显示的数据时,TDataSource自动调用数据集的Edit方法将数据集设置为编辑状态,数据集部件中的记录也随之改变;若值为False,用户要想通过数据控制部件或程序修改数据集中的记录,必须调用数据集部件的Edit方法,将其置为编辑状态之后才能够进行。将该属性值设置为False
49、,可以保护数据不被无意的改动。4State属性该属性表明与TDataSource部件关联的数据集当前的状态。详细内容请参看表13-2。13.2.2DataSource组件的事件TDataSource部件具有三个事件:OnDataChange事件OnStateChangeOnUpdataDataOnDataChange事件:当与TDataSource相连的数据集中的记录指针的位置发生改变时,该事件就被触发,也就是说当程序调用数据集部件的Next、Previous、Insert、Append等方法导致记录指针的位置发生改变时,便会触发该事件。该事件一般用于保持应用中多个部件之间的同步。OnUpda
50、taData事件:当数据集部件中当前记录将要被修改时,触发该事件。例如在程序调用post方法之后但在修改后的数据记录真正被写回磁盘中的数据库文件之前触发该事件,在应用中使用非数据浏览部件时要它与数据集保持同步时常使用该事件进行相关的处理。OnStateChange事件:当与TDataSource部件相连的数据集部件的状态发生改变时,便触发该事件。因为数据集部件的State属性标明了数据集部件当前所处的状态,当数据集的状态发生变化时,使用该事件进行有关的处理是很有用的,在一个具体的应用中,数据集部件的状态常常是频繁地变化的,为了跟踪数据集部件的状态变化,可以用下面例子中的程序代码将数据集部件当前