ClientDataSet的隐含功能

作者在 2007-07-06 06:31:00 发布以下内容
ClientDataSet组件支持很多特性,其中一些与三级结构有关,而且还可以用在其他环境中。该组件说明了一个数据库完全映象在内存中,这使得可以进行动态的操作,如建立一个索引,其他数据集合通常不支持该特性。例如,为了对查询分类,我们通常是重新执行它。为了索引一个局部表格,需要定义索引。只有ADO数据集合有一些与ClientDataSet一样的动态索引功能。
索引并不是ClientDataSet提供的全部功能。当我们拥有了索引之后,可以基于它定义组,可能是多级别的分组。对于确定一个记录在组中的位置(头、尾或中间位置),甚至有专门的支持。在组或整个数据表格中,我们可以定义总计;也就是说,可以动态计算整个表格或当前组中一列的总和或平均值。数据不需要发送给物理服务器,因为这些总计操作发生在内存中。我们甚至可以定义新的总计字段,可以直接与数据敏感控件相连。
注意,所有这些特性不但可以用与MIDAS应用程序,还可以用与客户机/服务器,甚至是局部瘦应用程序。事实上,ClientDataSet组件可以从远程MIDAS连接、局部数据集合(建立起数据的快照)、或局部文件(就象在公文包模式中一样,但使用的只是在客户机数据集合中定义的整个表格)中获得起数据。
这是另一个需要研究的领域,所以将向读者演示两个范例来突出关键特性。这些范例没有基于MIDAS,而是基于局部表格。

1、定义抽象的数据的数据类型

VCL数据库支持的一个有趣的特性是,当我们基于局部文件使用ClientDataSet时,可以定义抽象的数据类型。只需在窗体上放置一个ClientDataSet组件,为FieldDefs属性激活编辑器,添加两个字段,并为他们的DataType属性选择ftADT值。现在,移到ChildDefs属性,并定义子字段,下面是AdtDemo范例的字段定义:
FieldDefs = <
item
Name = 'ID'
DataType = ftInteger
end
item
name = 'Name'
ChildDefs = <
item
name = 'LastName'
DataType = ftString
size = 20
end
item
name = 'FirstName'
datatype = ftString
size = 20
end>
datatype = ftADT
size = 2
end>

在此,只需为ClientDataSet的FileName属性输入一个名称,用鼠标右键单击组件,并选择Create Table命令即可;我们准备编译并运行应用程序(在向它连接数据敏感组件之后)。数据会自动从提供的文件中读取,关闭程序时会将变化保存在文件中。
如果使用DBGrid查看结果数据集合,它允许我们展开或压缩ADT字段的子字段。我们可以通过定义字段的OnGetText事件提供它的压缩值(在Delphi4 中有一个缺省值,但Delphi5中没有):
procedure TForm1.ClientDataSet1NameGetText(Sender:TField;
var Text:String;DisplayText:Boolean);
begin
Text:=ClientDataSet1NameFirstName.AsString+' '+
ClientDataSet1NameLastName.AsString;
end;

2、动态索引

一旦ClientDataSet上有了数据,数据就已全部处于内存中了。当我们将组件基于局部文件中时(如在AdtDemo范例中),在程序启动时整个文件就被装载到了内存总。这与从Paradox数据表格中装载数据(BDE只装载正访问的字段)不同。
将整个表格装在内存中的优点是,我们可以快速地对它进行分类。使用ClientDataSet组件,我们可以通过赋给IndexFieldNames属性相应的字段名来实现分类。在AdtDemo(以及很多程序)中,该索引变动会在单击DBGrid控件的标题(触发OnTitleClick事件)时执行:

procedure TForm1.DBGrid1TitleClick(Column:TColumn);
begin
if Column.Field.FullName = 'Name' then
ClientDataSet1.IndexFieldNames := 'Name.LastName'
else
ClientDataSet1.IndexFieldNames := Column.Field.FullName;
end;

由于ADT定义,程序使用了字段的FullName属性(而不是FieldName属性)。事实上,对于子字段来说,索引应该基于Name.LastName,而不是LastName。而且ADT字段不能自己被索引,所以如果选择它,程序会使用LastName子字段作为索引。这些索引不是持久性的;它们没有保存在文件中,而只是在内存中应用于数据。

技巧:ClientDataSet可以拥有基于计算字段的索引,特别是内部计算字段,这种字段类型只能用于该数据集合。

3、分组

一旦为ClientDataSet定义了一个索引,就可以通过该索引对数据进行分组了。实际上,一组被定义为连续记录的一个列表(根据索引),记录中被索引的字段的值不会改变。例如,如果有一个基于国家的索引,带有该国家的所有地址都将归为一组。
cdsCalcs范例有一个ClientDataSet组件,它同样从DBDEMOS数据库的Country表格中读取其数据。该操作可以在设计时,使用ClientDataSet组件快捷菜单的Assign Local Data命令来执行。为了在运行时读取数据,获得一个更新的快照,可以向窗体添加一个DataSetProvider组件,如下连接三个组件:
Object Table :TTable
active = true
databasename = 'dbdemos'
tablename = 'country.db'
end
object datasetprovider1: TData
软件技术资料摘录 | 阅读 1369 次
文章评论,共0条
游客请输入验证码