Delphi数据访问部件的应用及编程_第1页
Delphi数据访问部件的应用及编程_第2页
Delphi数据访问部件的应用及编程_第3页
Delphi数据访问部件的应用及编程_第4页
Delphi数据访问部件的应用及编程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在这一章里我们主要介绍Delphi的数据访问部件的层次结构、多部件之间的关系、部件的属性、方法、事件以及各部件的应用。这些部件包括: TSession部件 数据集部件(TTable和TQuery) TDatasource部件 字段对象TField 字段编辑器的使用 TReport部件和TBatchMove部件我们对这些部件的属性、方法和事件进行一般性的描述,读者在实际使用Delphi开发应用程序时,还可以通过联机帮助获得有关部件更详细的信息。15.1 Delphi数据访问部件的层次结构Delphi提供了强大的开发数据库应用程序的能力,它给用户提供了大量的数据访问部件。以方便程序设计人员开发数据

2、库应用程序。这些部件中,有些部件继承了另一些部件的属性、方法和事件,也就是说多部件之间存在着继承和被继承的关系,各部件的这种关联便构成了一个层次结构图15.1 Delphi数据访问部件的层次结构TSession是全局性的部件,在应用程序运行时,它自动地建立,在设计阶段和运行过程中它是一个不可见的部件。TDatabase部件是为开发客户/服务器数据库应用程序时,设置登录的数据库的有关参数的,它在数据访问部件页上。TDataset部件是不可见的,TTable和TQuery部件是由它派生而来的,这两个部件一般被称为数据集部件,它们在数据访问部件页上。TDatasource部件是连接数据集部件和数据浏

3、览部件的桥梁,它在数据访问部件页上。 TFields部件对应于数据库表中的实际字段,它既可以在应用程序的运行过程中动态地生成也可以在程序设计阶段用字段编辑器创建。它是不可见的部件,在程序中我们可以通过TField部件来访问数据库记录的各个字段值。15.2 Tsession部件及其应用TSession部件一般用得较少,但它对于一些特殊的应用是很有用的,在每一个数据库应用程序运行时Delphi自动地创建一个TSession部件。程序设计人既不能看见该部件也不能显示地创建一个TSession 部件,但是我们可以在应用程序中全局性地使用TSession部件的属性、方法。TSession部件的许多重要属

4、性是用于控制数据库应用程序与数据库的连接的,在一个应用程序中,可以全局性地设置TSession的有关属性值,对与之相连接的磁盘上的数据库进行控制。TSession部件主要有下列属性:Database属性:是TSession中可以进行连接的所有数据库的数据库名字列表,这些数据库的名字常常是实际数据库的别名,包括数据库的路径、用户名、用户登录口令等参数。 DatabaseCount属性:是TSession中可以进行连接的所有数据库的数量,它是一个整数。 KeepCounnections属性:是一个布尔型属性,用它说明应用程序是否保持与一个非活动数据库的连接。因为对于一个数据库,当该数据库中没有相应

5、的数据集部件(TTable或TQuery)被打开时,该数据库将自动地变成非活动的数据库。缺省情况下,KeePcounnections的值是True,就是说应用程序总是保持着与数据库的连接,即使数据库变成了非活动的数据库时,也是如此。如果将KeepConnections属性设置成False,那么当数据库由活动状态变成非活动状态时,应用程序与该数据库的连接也随之中断。NetFileDir属性:说明BDE网络控制文件的路径名。PrivateDir属性:说明存取临时文件的路径名。TSession部件中的大部分方法是用于向用户提供与应用程序相连接的数据库的信息,如数据库的名字及别名,数据库中的表名以及数

6、据库引擎BDE的有关参数等,在设计数据库应用程序时,想要获取有关数据库的信息,调用TSession部件的下列方法,将会大大简化程序的设计。GetAliasNames方法:调用该方法,我们可以获得数据库引擎BDE中定义的数据库别名。 GetAliasParams方法:该方法主要用于获取我们在BDE中定义数据库别名时所说明的参数值,如BDE所在的目录路径以及实际名称等。GetDatabaseNames 方法:调用该方法可以帮助我们获得当前应用程序可以进行连接的所有数据库的名字,数据库的名字是用户使用BDE工具定义的实际数据库的别名。GetDriverNames方法:数据库引擎BDE可以与多种数据库

7、管理系统相连接,如客户/服务器数据库管理系统Oracle、Sybase以及本地数据库管理系统dBASE,Paradox等,BDE与每一种数据库管理系统进行连接时,都有相应的驱动程序,而且这些驱动程序都可以选择地安装。通过调用GetDriverNames方法。我们可以获得当前BDE安装的数据库驱动程序的名字。 GetDriverParams方法:BDE的数据库驱动程序中包含着多个参数,如支持的民族语言、DBMS的版本号、文件块大小等,对于服务器上的DBMS,还有数据库服务器的名字等等。 GetTableNames方法:因为每一个数据库都是由多个数据库表组成的,我们通过说明数据库名,然后调用Get

8、TableNames方法,便可以获得该数据库中全部的数据库表的名字。上述这些方法在调用时都需要一个字符串列表作为参数,而且都返回一个字符串列表的值。 TSession部件还有一个叫DropConnections的方法用于控制应用程序与数据库的连接,当调用DropConnections方法时,应用程序与所有的数据库的连接将会切断。例15.1:我们创建一个应用程序,通过调用TSession有关的方法获取当前应用程序可以进行连接的数据库的名字以及获取其中任意一个数据库中的全部数据库表的名字。 通过TSession部件获取数据库的有关信息窗体中主要使用了两个列表框,其中列表框DatabaselistB

9、ox用于显示数据库的名字,列表框TablelistBox用于显示数据库中的表名。程序运行完后数据库的名字显示在DatabaselistBox列表框中,当用户单击DatabaselistBox列表框中的数据库名时,该数据库全部的数据库表的名字将会显示在TablelistBox列表框中。有关的程序代码如下:程序清单15.1unit unit31;interfaceusesSysUtils, Windows, Messages, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls, DB, DBTables, Buttons, ComCtrls,

10、 Tabnotbk; typeTQueryForm = class(TForm)BitBtn1: TBitBtn;DataSource1: TDataSource;Table1: TTable;GroupBox1: TGroupBox;CheckBox1: TCheckBox;CheckBox2: TCheckBox;PageControl1: TPageControl;TabSheet1: TTabSheet;Label1: TLabel;Label2: TLabel;Label3: TLabel;ListBox1: TListBox;ListBox2: TListBox;ListBox3:

11、 TListBox;TabSheet2: TTabSheet;Memo1: TMemo;procedure FormCreate(Sender: TObject); procedure ListBox1Click(Sender: TObject); procedure ListBox2Click(Sender: TObject); end;varQueryForm: TQueryForm;implementation$R *.DFMuses RSLTFORM;procedure TQueryForm.FormCreate(Sender: TObject);beginScreen.Cursor

12、:= crHourglass; Populate the alias list with ListBox1 dobeginItems.Clear;Session.GetAliasNames(Items);end; Make sure there are aliases defined Screen.Cursor := crDefault;MessageDlg( 'There are no database aliases currently defined. You ' + 'need at least one alias to use this demonstrati

13、on.',mtError, mbOK, 0 );end;procedure TQueryForm.ListBox1Click(Sender: TObject);varstrValue: string; Holds the alias selected by the user bIsLocal: Boolean; Indicates whether or not an alias is local slParams: TStringList; Holds the parameters of the selected alias iCounter: Integer; An integer

14、counter variable for loops begin Determine the alias name selected by the user with ListBox1 dostrValue := Items.StringsItemIndex; Get the names of the tables in the alias and put them in the appropriate list box, making sure the user's choices are reflected in the list. Session.GetTableNames(st

15、rValue, alias to enumerate '', pattern to match 数据集中的数据维护主要包括数据记录的修改,插入和删除。Delphi为数据集部件提供了相应的方法用于其中的数据维护。这些方法如表15.所示。表15.3 Delphi用于数据维护的方法方 法 名 功 能Edit 将数据集置为编辑状态Append 投寄所有被修改的记录,将记录指针移到表中的最后一条记录,且将数据集置为插入状态Insert 投寄所有被修改的记录将数据集置为插入状态Post 将插入的新记录和修改的记录写回磁盘上的数据库表,即投寄,当投寄成功时数据集回到浏览状态,若投寄不成功数据

16、集仍然保持原有状态Cancel 取消当前的操作且将数据集置为浏览状态Delete 删除当前记录指针所在的记录且将数据集置为浏览状态AppendRecord 在表的最后插入一条新记录,记录的各个字段值作为AppendRecord的参数传递给新记录InsertRecord 在当前指针所在记录的后面插入一条新记录, 记录的各个字段值作为InsertRecord的参数传递给新记录。SetRecords 修改当前记录,字段名和相应的字段值作为SetRecords的参数Edt方法:如果应用程序想对数据集中的数据记录进行修改,我们必须要将数据集设置成编辑状态。调用数据集部件的Edit方法便可以将数据集置成编

17、辑状态,当数据集已经处在编辑状态时,调用Edit方法不会产生作用。当数据集处于编辑状态时,移动记录指针或调用post方法都可以将当前记录的修改写回到磁盘数据库表中。在程序中, Edit方法和post方法常常配合在一起使用,用于修改表中的记录。如:Table1.Edit;Tabel1.FieldByName('CustNo').Asstring := '1234'Table1.st;在上述这一段程序代码中,第一行程序是将Table1置成编辑状态,第二行程序是对当前记录指针所在的记录的CustNo字段的值修改成'1234',第二行程序是调用post方

18、法将对当前记录的修改写回数据库表。Append方法和Insert 方法:这两个方法都是将数据集部件置成插入状态,以在表中插入新记录,Insert方法是在当前指针位置的记录后面插入一打新记录,Append方法是在表的尾部插入一打新记录,不过这要注意,无论用户是调用Insert方法还是Append方法插入新记录,增加记录到一个具有索引的表中时,都是按照索引顺序写入其位置,也就是说对于索引表格Insert方法和Append方法的作用是一样的,Append仅适用于没有索引的表。Insert方法和Append方法实际上是将数据集置成插入状态,并且插入一条空白记录,要真正插入一条新记录,我们必须在调用In

19、sert或Append方法之后,还要给新记录的各个字段赋值,最后调用post方法,将插入的记录写回数据库表。调用这两种方法插入新记录的一般步骤如下:With tabe1 DOBeginInsert; 调用Insert方法,插入一条空记录为记录的各字段赋值Post;End;Post方法:数据集中的记录被修改或插入新记录时调用post方法将数据集的修改写回到数据库表。根据数据集所处的状态不同,post方法所产生的作用和效果是不一样的: 当数据集处于编辑状态时,调用post方法,将当前记录的修改写回数据库表 当数据集处于插入状态时,调用post方法,将插入的新记录写回数据库表 当数据集处于SetKe

20、y状态时,调用post方法,将数据集置成浏览状态(Browse状态)post方法的调用既可以显式地调用,也可以隐含地调用,当数据集处于编辑状态或插入状态时,当移动记录指针时,Delphi会隐含地调用post方法,将将当前记录的修改写回数据库表,在程序调用Insert方法或Append方法时,也会隐含地调用Post方法,将先前的数据集的修改写回数据库表。Delete方法:Delete方法用于删除表中的记录,调用Delete方法时,将会删除表中当前的记录,并且自动地将记录指针移到被删记录的下一条记录,同时将数据集置成Browse状态。 Cancel方法:Cancel方法用于取消当前的操作,当程序还

21、没有调用Post方法,将对记录的修改写回数据库表时,调用Cancel方法,可以将记录恢复到没有修改之前的状态。并且在调用Cancel方法时,它总是将数据集置成Browse状态。AppendRecord方法和InsertRecord方法:这两个方法分别与Append方法和Insert方法相似。它们都是用于在表中插入一条新记录,但AppendRecord方法和InsertRecord方法比Append和Insert方法更简单更方便一些,它们直接在表中插入一条新记录,新记录的各个字段值作为AppendRecord或InsertRecord方法的参数传递给新记录并且不需显式地调用post方法,将插入的

22、新记录写回数据库表。在给插入的新记录赋字段值时,将由多个字段值组成的数组作为AppendRecord或InsertRecord的参数,在字段值数组中可以为每一个字段提供一个值,或从左边一列开始依次为任意多个字段赋值。也就是说,用户可以从数据库表的最左一列起,把许多列的值同时传递给InsertRecord,直到所有的字段被赋值,用户也可以省略字段序列后面的的一些字段值,InsertRecord会用空值来填充这些字段:用户也可以对那些明确希望用空填充的字段传递保留字NIl。例如:如果表Country有Name,Captial,Continent,Area和Population字段,并且数据集部件T

23、able1与它相连,下面的代码便可以在Country表中当前记录的后面插入一条新记录。Table1.InsertRecord ("中国","北京","五洲");在上述代码中没有为Area和population字段赋值,InsertRecord会用空值来填这两个字段。SetRecords方法:调用该方法可以修改表中当前记录的多个字段的值,调用该方法之前必须将数据集部件置成编辑状态,调用该方法之后,还要调用post方法,才能真正将当前记录的修改写回数据库表。调用SetRecord方法时,被修改的字段值必须要与表中实际存在的字段名对应,并且

24、数据类型要相匹配。例如,下面的代码是修改上面刚刚插入的那条记录。Table1.Edit;Tabel1.SetRecord(, , ,9600000,1200000000);Tabel1.post;这一段代码是修改上面刚刚插入的那条记录的Area 和Population 字段的值,而对Name,Continent和Captial字段没有修改。在数据集部件中,还有一个重要方法Abort方法,该方法是用于取消其他方法的调用的,如在插入记录、修改记录和删除记录之前,往往需要用户确认是否真的要执行这种操作,此时调用Abort方法便可取消各种方法的调用,下面的代码是在用户删除一条记之前,让用户确认是否真的

25、要执行删除操作。Tabel1.BeforeDelete(DataSet:TDataSet);If MessageDlg('真的要删除记录吗?',mtConfirmation,mbyesNoCanel,0 <> mryes thenAbort; 取消删除操作关于书签(BookMark)操作;书签操作主要用于在表中快速地定位记录指针,在应用程序中常常要保存记录指针所在的位置,在进行其他处理之后,希望能快速地返回到先前指针所在的位置,此时,使用书签将显得特别有用。有关书签操作,Delphi提供了三个方法,它们是: GetBookMark GotoBookMark Free

26、BokMark这三个方法一般都是在一起使用,GetBookMark方法返回一个TBookMark类型的变量,该变量包含着指向当前记录的指针,GotoMark方法用于快速地将记录指针定位到具有书签的记录处。FreeBookmark方法是与GetBookMark方法相反的操作,它释放书签标志。下面的程序代码阐述了书签操作的一般方法:BookMark : TBookMark;<Do something>BookMark := Table1.GetBookMark; 对当前记录作书签标志Table1.DisalbeControls; 切断Table1与数据察觉部件的联系Table.Firs

27、tWhile Not EOF Do 对表中全部记录进行其他处理begin<Do something>Tabel1.Next;end;Tabel1.GotoBookMark(BookMark)Table1.enableControls; 重新定位记录指针回到原来的位置Tabel1.FreeBookMark(BookMark); 删除书签BookMark标志数据集部件TTabel和TQuery具有三个方法,DisableControls 方法、EnableControls方法、Refresh方法用于控制数据集部件和与其相连的数据浏览部件之间的连接,以及控制数据浏览部件的显示。在用户修改

28、和更新以及遍历数据库表中的记录时,调用DisableControls方法具有重要意义,调用DisbaleControls方法以切断TTable或TQuery部件与数据浏览部件的连接,使数据浏览部件暂时失效,否则,在对TTable或TQuery部件的每次修改之后,窗体中所有与它们相连的数据浏览部件都要更新其显示内容,这亲显然会减慢处理速度。当遍历表中的记录时记录指针每移动一下,窗体中的数据浏览部件也随之更新一下其中的显示内容,在屏幕上产生闪烁。EnableControls方法的作用与DisbaleControls方法的作用是相反的,调用EnableControls方法,使TTable或TQuer

29、y部件恢复与数据浏览部件的连接,使暂时失效的数据浏览部件恢复到正常显示表中记录信息的状态。Refresh方法用于刷新数据浏览部件中的显示。在调用Refresh方法时,必须要确保TTable或TQuery部件是打开的。当数据集中的记录被修改之后,调用Refresh方法,数据浏览部件中显示的信息也随之改变。数据集部件TTable或TQuery具有很多的事件。为这些事件编写相应的程序代码可以进行有效性验证、计算可计算字段的值、确认对数据库表的多种操作等等。这些事件及其描述如表15.4所示。表15.4 数据集部件常用的事件 事 件 描 述 BeforeOpen,Afteropen 在数据集部件被打开之

30、前/之后被触发 BeforeClose,Afterclose 在数据集部件被关闭之前/之后被触发 BeforeInsert,AfterInsert 在数据集部件进入插入状态之前/之后被触发 BeforeEdit,AfterEdit 在数据集部件被编辑之前/之后被触发 BeforePost,AfterPost 在数据集部件投寄被修改的记录之前/之后被触发BeforeCancel,AfterCancel 在数据集部件取消前一步操作之前/之后被触发 BeforeDelete,AfterDelete 在数据集部件删除当前记录之前/之后被触发 OnNewRecord 当建立一条新记录时被触发 OnCal

31、cFields 当为表中的计算字段计算字段值时被触发15.4 TTable部件及应用在前一节里我们介绍了数据集部件TTable 和TQuery 的共同的一些属性和方法。TTable部件是Delphi数据库编程中要经常使用的最重要的部件之一,它是数据库应用程序访问数据库时必须使用的数据集部件之一,在这一节里,我们重点介绍TTable部件特有的属性和方法,TTable部件所有的属性、方法和事件都可以在联机帮助中查到。DatabaseName属性和TableName属性:DatabaseName属性是说明数据库应用程序所操作的数据库的名字,它可以是由BDE定义的数据库的别名、显式说明的数据库文件所在

32、的磁盘路径或者由TDatabase部件定义的一个数据库名。DatabaseName属性常常是一个由BDE定义的数据库的别名。使用由BDE定义的数据库的别名代替数据库实际所在的路径和名字,好处是当实际的数据库存放的位置发生变化时,只需利用BDE简单地设置一下该数据库的别名,而数据库应用程序无需修改。有关BDE的使用请参看BDE的设置应用。TabelName属性用以说明当前TTable部件所连接的实际的数据库表。这两个属性一般都在设计阶段指定,当然在程序运行过程中也可以设置,但是要修改这两个属性时,必须要在TTabel的Active属性为False时进行,当TTable的Active属性为True

33、时,这两个属性是不能被修改和设置的。TableType属性:该属性说明与TTable部件相连接的数据库表的类型。当TableType属性设置成Default时,该属性所说明的数据库表的类型由数据库文件的扩展名决定。 若数据库文件的扩展名为.DB或没有扩展名,表的类型是Paradox表 若数据库文件的扩展名为.DBF时,表的类型是dBASE表 若数据库文件的扩展名为.TXT时,表的类型是ASCII表如果TableType属性不设定为Default,那么与TTable 部件相连的数据库表的类型由TableType中的设置的值决定,不用考虑数据库文件的扩展名。KeyExclusive属性:该属性的一

34、个作用是说明在数据库表中查找记录时,将记录移到与查找值相匹配的记录处还是将记录指针移到与查找值相匹配的记录后面一条记录处。该属性是布尔型变量,当它的值为False时(缺省情况下为False),将记录指针移到相匹配的记录处,为True时,将记录指针移到相匹配记录的后面一条记录处。该属性另一个作用是在表中指定检索范围时,用来说明是否包括满足过滤条件的边界记录。当KeyExclusive的值为False时,检索范围包括边界记录,否则不包括边界记录,有关详细的操作请参看“限定表中记录的检索范围”。 IndexFields属性和IndexFieldsCount属性:IndexFields的属性值是数据库

35、表中字段名列表,它包含与TTable部件相连的数据库表中的全部索引字希。IndexFieldsCount属性说明表中索引字段的个数。这两个属性值都是只读的,只有在程序运行过程中可用。IndexName属性和IndexFieldNames属性:IndexName属性中存放着在建立数据库表时为数据库表定义的所有辅助索引名,它是一个辅助索引名列表,是只读属性。IndexFieldNames属性指定用于数据库表索引排序的字段名,多个字段名之间用分号隔开。例如对Customer.DB表中的客户记录按邮政编码ZipCode和客户号码CustNo排序时可以设定IndexFieldNames的值为:ZipCo

36、de ; CustNo在IndexFieldNames属性中指定的字段必须存在于相应的数据库表中,否则会导致错误。IndexName和IndexFieldName是互斥的,每次只能指定其中一个属性的值,不能同时为两个属性都指定属性值。Exclusive属性:该属性是一个布尔型属性,它标明是否以共享方式打开数据库表,如果Exclusive的值为True,当打开一个数据库表时,其他用户就不能访问该表了,若Exclusive的值为False,将以共享方式打开一个数据库表。显然不能将其他用户正在访问的表以互斥方式打开(设定Exclusive的值为True)。对于SQL数据库服务器上的数据库表,当以互斥

37、方式被一个用户打开时,其他用户可以读取该表中的数据,但不能修改表中的数据,当然有些数据库服务器不支持这种方式,这要具体参看有关的数据库服务器的文档。ReadOnly属性和CanModify属性:这两个属性都是布尔型属性,ReadOnly属性决定用户是否能够对表中的数据进行读写。ReadOnly为True 时,用户只能读取表中的数据,ReadOnly为False时,用户可以读写表中的数据(假设数据库已授权用户能够读写其中的数据库表)。CanModify属性是一个只读属性,用户不能够修改其属性值,它反映了用户对数据库表拥有的实际特权,当ReadOnly为True时CanModify将自动地被置为F

38、alse,当ReadOnly为False时,如果数据库允许用户对表进行读写时,CanModify为True,否则CanModify为False。当CanModify为False时,数据库表是只读的,但不能将其置成编辑状态或插入状态;当CanModify属性为True时,虽然数据库表对应的数据集部件可以置成编辑和插入状态,但是这并不意味着用户能够插入和修改表中的数据,因为这还要受到其他因素的限制,如用户对SQL数据库服务器的访问权限等的限制。TTable部件还有其他一些属性请参看联机帮助在我们实际应用中的数据库表中常常存放着大量的数据信息,其中包含着很多的记录,而我们的应用程序可能只需对其中一部

39、分记录进行操作,因此,为应用程序指定一个使用范围就显得特别重要了,为方便有效地指定数据库表的使用范围Delphi为TTable部件提供了下列方法供用户使用: SetRangeStart和EditRangeStart方法 SetRangeEnd和EditRangeEnd方法 SetRange(Start Values,End Values)方法 ApplyRange方法 CancelRange方法1. SetRangeStart方法用于指定检索范围的起始记录,调用SetRangeStart方法之后,可以为起始记录的一个或多个字段指定相应的字段值。SetRangeEnd方法用于指定检索范围的结束记

40、录,调用SetRangeEnd方法之后,可以为结束记录的一个或多个字段指定相应的字段值。2. SetRange方法SetRange方法包含了SetRangeStart和SetRangeEnd方法的功能,它可以同时指定检索范围的起始和结束记录,起始记录和结束记录的字段值以数组形式送给SetRange,其基本形式是:SetRange(起始值,结束值)3. ApplyRange方法根据SetRangeStart,SetRangeEnd或SetRange方法说明的检索范围的起始和结束记录,具体设定一个检索范围,调用ApplyRange方法之后,应用程序只能对检索范围内的记录进行有关的操作。4. Can

41、celRange方法 CancelRange方法的作用与ApplyRange方法的作用是相反的,这是取消为表设定的检索范围,调用CancelRange方法之后应用程序可以对表中全部记录进行有关的操作。在这里要注意的是:如果我们使用的是paradox表或dBASE表,在调用SetRangeStart,SetRangeEnd以及SetRange方法时,只能为表中的索引字段或定义的索引指定相应的字段值,以设定检索范围。如果使用SQL数据库服务器中的数据库表,可以为IndexFieldNames属性中指定的字段指定相应的字段值。例如:假设Table1与Customer.DB表相连,Customer.D

42、B中一个索引字段是CustNo,同时应用窗体中有两个编辑框StartVal和EndVal用于输入起始、结束记录的字段CustNo的值,下面的程序代码便可以为我们设定一个检索范围:Tabel1.SetRangeStart; 指定检索范围的起始记录Tabel1CustNo.AsString:= StartVal.Text 为起始记录的CustNo字段指定字段值 Tabel1.SetRangeEnd; 指定检索范围的结束记录if EndVal.Text <> ' ' thenTabel1CustNo.AsString := EndVal.Text; 为结束记录的CustN

43、o 字段指定字段值 Tabel1.ApplyRange; 根据检索范围的起始、结束记录设定检索范围注意上面的程序代码,在为结束记录的CustNo字段指定字段值时,首先检查EndVal的值是否为空,如果EndVal的值为空,那么设定的检索范围没有包含一条记录,因为没有任何记录的字段值小于NIL;如果StartVal的值为空,那么检索范围将从表中的第一条记录开始,因为表中任何记录的字段值都大于空(NIL)。上述代码可以用SetRange方法改写成:If EndVal.Text <>' ' thenTabel1.SetRane(StartVal.Text.EndVal.T

44、ext);Table1.ApplyRange;EditRangeStart和EditRangeEnd方法的使用完全类似于SetRangeStart和SetRangeEnd方法,只是调这两个方法是设定一个可编辑的范围。又如:假设一个表中的一个索引包含两个字段LastName和FirstName,我们为索引中的一个字段或多个字段指定相应的字段值,设定数据库表的使用范围。Table1.SetRangeStart;Table1.FieldByName('LastName').Asstring := 'Smith'Table1.SetRangeEnd;Tabel1.App

45、lyRange;上述代码设定的范围包括LastName字段的值大于或等于Smith的所有记录。而下面的代码设定的范围则包括LastName字段的值大于或等于Smith且FirstName字段的值大于或等于'J'的记录。Table1.SetRangeStart;Table1.FieldByName('LastName').Asstring := 'Smith'Table1.FieldByName('FirstName').Asstring := 'J'Table1.SetRangeEnd;Tabel1.ApplyRa

46、nge;如果想查找数据库表中的记录,必须想指定查找记录的一些字段的字段值,然后在表中进行检索,检索出与查找值相匹配的记录来。如果我们是在Paradox或dBASE数据库中的表中查找记录,那么查找值所对应的字段必须是表中的关键字段或辅助索引字段。如果查找SQL数据库服务器中的表,那么查找值必须是表的IndexFieldNames属性中指定的字段。Delphi提供了两种方式在数据库表中查找记录:Goto方式和Find方式。这两种方式十分相似,它们的主要区别在于为查找指定查找值的方法不一样。使用Goto方式进行数据查找使用的方法有SetKey方法、GotoKey方法和GotoNearest方法。其实

47、际步骤如下:确保要查找的字段是关键字段或辅助索引字段。调用SetKey方法把与表对应的TTable部件置成查找状态。把查找值赋给相应的字段。调用GotoKey方法,并测试它的返回值检验查找是否成功。假设Table1对应的表中第一个字段是关键字段,Edit1是应用窗体中的一个编辑框,用户可以通过Edit1输入查找值。下面的代码将通过Goto方式进行查找。Table1.SetKey; 将Table1置成查找状态Table1.Field0.AsString := Edit1.Text; 指定查找值Table1.GotoKey; 进行查找上面最后一行代码是根据用户指定的查找值,在表中执行查找。查找的结

48、果有两种,也许成功也许失败,这是由调用GotoKey方法之后返回的布尔值来决定,如果返回True,那么查找成功,并且记录指针会指向与查找值匹配的记录,如果返回Fale,那么查找失败,记录指针的位置不发生变化。下面的代码可以测试调用GotoKey方法之后的返回值,告知用户查找是否成功。Table1.SetKey;Table1.Field0.AsString:= 'Smith'If not Table1.GotoKey thenShowMessage('记录没找到')在这一段代码中,如果在表中没有找到第一个字段值为Smith的记录,该应用程序会弹出一个对话框告知用户

49、“记录没有找到”。如果在表中存在多个关键字段或辅助索引中包含多个字段时,你在进行查找时,只想为第一个字段指定查找值,那么必须要设置TTable部件的KeyFieldCount的属性值为1。如果想为多个字段指定查找值,只能为相邻的字段指定查找值,例如辅助索引中共有三个字段,那么我们只能为第一个字段、第一和第二个字段、第一和第二以及第三个字段指定查找值,而不能为第一和第三个字段指定查找值。GotoNearest方法的使用与GotoKey方法完全一样,只是它用于不精确查找,它不要求查找结果与查找值精确匹配,当表中有与查找值精确匹配的记录时,它将记录指针移到该记录处,当表中没有与查找值精确匹配的记录时

50、,它会查找出与查找值最接近的记录,并将记录指针移到该记录处。下面是应用GotoNearest方法的一段代码:Table1.SetKey;Table1.Fields0.AsString:= 'Sm'Table1.GotoNearest;执行上述代码后,若表中存在第一个字段值等于Sm的记录时,记录指针将移到该记录处,若表中不存在第一个字段值等于Sm的记录,而存在第一个字段值等于Smith的记录,那么记录指针会移到该记录处。如果我们不是以数据库表中的关键字段作为查找字段,我们也可以为TTable部件的IndexFieldName属性中的字段或IndexName属性中的字段指定查找值进

51、行数据查找。例如,假设Customer表中有一个名叫CityIndex的辅助索引,我们为CityIndex中的字段指定查找值进行查找时,首先设置TTable部件的IndexName属性为CityIndex,然后再进行查找,下面是具体的程序代码:Table1.IndexName := 'CityIndex'Table1.Open;Table1.SetKey;Table1.FieldByName'City').AsString := Edit1.Text;Table1.GotoKey;使用Find方式:使用Find方式在数据库中进行数据查找的方法有:FindNear

52、est方法和FindKey方法。FindKey方法和FindNearest方法为数据查找提供了一个简单的方法,它们将SetKey、指定查找值、执行查找三个步骤融合在一步里完成,它们在指定查找值时,是把各字段的查找值组成一个数组传给FindKey或FindNearest。下面是使FindKey方法的一个例子。 假设Tabel1对应的表中的第一个字段是关键字段。Table.FindKey(Edit1.Text);如果用GotoKey方法完成这一功能则需要编写下面代码:Table1.SetKey;Table1.Fields0.AsStrine := Edit.Text;Table1.GotoKey;

53、FindKey方法和FindNearest方法的区别与GotoKey和GotoNearest方法的区别是一样的。图15.5 使用Field Link Designer创建一对多关系Field Link Designer提供了一种可视化的方法来创建主要明细表之间的一对多关系。图中Available Indexes组合框中存放着明细表中的关键字段和索引字段,可以选择索引字段进行连接。在主表中选择一个用于连接的关键字段,然后将其与明细表中相应的关键字段连接,单击Add按钮,主要明细表的连接字段将显示在Joined Fields列表框中,如: CustNo->CustNo15.5 TDataSo

54、urce部件及其应用TDataSource部件是开发数据库应用程序中用到的非常重要的部件,它是连接数据集部件TTable或TQuery和数据浏览部件的桥梁。TDataSource部件本身十分简单,它所拥有的属性、事件和方法都比较少,在使用该部件时无需作太多的工作,它主要是为数据浏览部件服务的,如果在应用程序中没有使用数据浏览部件,我们也没有必要为应用程序设置TDataSource部件。TDataSource部件除了其他部件都拥有的Name属性和Tag属性之外,主要有下面几个属性: DataSet属性:该属性说明TDataSource部件从中获取数据的数据集的名字,它可以是TTable部件的名字

55、,也可以是TQuery部件的名字,甚至还可以指定其他窗体内的数据集作为该属性的值,如在下面的程序中我们指定窗体Form2中的table1作为窗体Form1中的DataSource1的DataSet属性值:TForm1.Formcreate(Sender : Tobject);BeginDataSource1.DataSet := Form2.Table1;end;Enable属性:Enable属性可以暂时性地切断TDataSource部件和与之相连的数据集部件的连接。这是一个布尔型变量。当它的值为False时,TDataSource部件和数据集部件的连接被切断,且所有与TDataSource部

56、件相连的数据浏览部件中将变为一片空白,不显示任何数据信息。当Enabled的值变为True时,TDataSource部件和数据集部件的连接恢复,且与TDataSource部件相连的数据浏览部件恢复显示数据。不过要实现上述这些功能,一般不使用TDataSource部件的Enabled属性,而是调用数据集部件的DisableControls方法和EnableControls 方法,因为调用这两个方法可以方便地控制与数据集部件相连的所有TDataSource部件以及与TDataSource部件相连的数据浏览部件。AutoEdit属性:这是一个布尔型变量,它用于说明是否将与TDataSource部件相连的数据集置于编辑状态。当AutoEdit的值为True

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论