首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.2  内存数据表(Memory Table

在开发应用系统时,经常需要临时储存一些应用程序执行时期的数据。这些数据可能不存在于数据库中,但是在应用程序执行时却需要经常参考到这些数据。对于这种类型的数据以及应用而言,程序员可能会使用各种不同的方法来解决。不过dbExpress中的TSimpleDataSet/TClientDataSet控件却可以提供非常好的解决方案,如果程序员能够再配合上一节讨论的排序技术,那么就可以在应用程序中实现快速的内存数据表,来提供临时数据的储存以及对这些临时数据的频繁查询的工作。

例如在一个范例应用程序中,产生了如表3-3所示的临时数据。这些临时的数据可能拥有数10笔,而且在应用程序执行时经常需要根据ID来查询相对的字符串数值。

3-3

ID(整数值)

数值(字符串)

1

DataSnap

2

WebSnap

3

Web Service

4

SOAP

5

XML

6

Interface

7

 COM+

……

……

对于这种应用,程序员可以使用TSimpleDataSet/TClientDataSet建立内存数据表,然后根据ID字段排序,再让应用程序使用这个内存数据表来储存和查询数据。这样一来,不但可以解决储存临时数据的问题,也可以很有效率地查询临时数据。此外使用TSimpleDataSet/TClientDataSet建立的内存数据表还可以储存多个字段数值,也可以储存各种类型的数据,所有的内存数据表内容也可以动态产生,好处非常多。当然,TSimpleDataSet/TClientDataSet的内存数据表也可以在应用程序执行完毕之后储存成XML格式的数据,等待下次应用程序再次执行时直接从XML中加载这些临时数据,而无须再次重新建立。本节讨论的内容就是说明如何使用TSimpleDataSet/TClientDataSet来动态建立内存数据表,以便处理和查询临时的数据。

在下面的范例应用程序中,将会使用TSimpleDataSet建立一个内存数据表,并且在这个内存数据表中填入应用程序经常需要使用和查询的数据。由于这些数据是储存在内存之中,因此,查询的速度非常快,也不会增加数据库服务器的负荷。

步骤设计范例应用程序

首先,在Delphi 2006集成开发环境中建立一个新的应用程序项目,再建立一个数据模块。在数据模块中放入TSQLConnection以及两个TSimpleDataSet控件,如图3-12所示

3-12  范例应用程序的数据模块,使用两个TClientDataSet控件其中scdsMemory是准备作为内存数据表使用的

然后设定数据模块中的dbExpress控件特性值如下。

TSQLConnection

特性名称

设定特性值

Name

scnnEmployee

Database

e:\Program Files\Common Files\Borland Shared\Data\Employee.gdb

TSimpleDataSet

特性名称

设定特性值

Name

scdsEmployee

DBConnection

scnnEmployee

CommandText

select * from EMPLOYEE

TSimpleDataSet

特性名称

设定特性值

Name

scdsMemory

请读者注意,在数据模块中的scdsMemory没有设定其他的特性值,也没有连接到任何的数据表。scdsMemory的内部结构以及数据稍后将在范例应用程序动态地填入。此外,在这个范例中是使用InterBase的范例数据库Employee.gdb

接着再设定范例应用程序的主窗体,如图3-13所示。

3-13  范例程序主窗体

在图3-13所示的主窗体中的两个TButton控件:一个是用来建立内存数据表以及填入应用程序使用的数据的。另外一个TButton控件则是根据用户在ID控件中输入查寻数据的键值,查寻内存数据表中相对数据的。主窗体下方的TDBGrid是用来显示应用程序动态建立的内存数据表,主窗体右方的TListBox会显示建立内存数据表以及查寻内存数据表花费的时间。

TButton

特性名称

设定特性值

Name

btnCreateMemoryTable

Caption

产生临时数据

TButton

特性名称

设定特性值

Name

btnSearchData

Caption

查寻临时数据

设计完成了范例应用程序的控件之后,现在可以开始实现此范例应用程序,看看如何使用TSimpleDataSet建立内存数据表。

步骤实现范例应用程序

首先,实现btnCreateMemoryTable按钮的OnClick事件处理函数。当用户点击了这个按钮之后,btnCreateMemoryTable就会使用数据模块中的scdsMemory动态建立内存数据表。

下面即是btnCreateMemoryTable按钮的OnClick事件处理函数,首先,它会开始计时以计算建立内存数据表和填入临时数据需要花费的时间,接着,分别调用CreateMemoryTable函数以建立内存数据表的内部结构,例如字段名称、字段类型等MetaData。在成功建立了内存数据表之后,它会再调用FillTempData以便在内存数据表中填入应用程序需要使用的临时数据,最后,显示完成这些工作花费的时间。

procedure TForm1.btnCreateMemoryTableClick(Sender: TObject);

begin

  StartTime;

  CreateMemoryTable;

  FillTempData;

  EndTime;

  ShowAppMsg('建立内存数据表和数据时期:' + FloatToStr(GetRunTime));

end;

CreateMemoryTable是真正建立内存数据表的函数。在CreateMemoryTable中将会为数据模块中的scdsMemory建立字段信息以储存临时数据,并且会建立索引字段以加快查寻数据的速度。

CreateMemoryTable首先调用scdsMemoryFieldDefs特性的AddFieldDef方法,以便在scdsMemory中建立临时的字段定义对象TFieldDef。当应用程序建立了字段定义对象之后,就必须设定这个字段定义对象的数据类型、字段长度以及字段名称等重要的特性值。从下面的程序代码中我们可以看到,CreateMemoryTablescdsMemory中分别建立了两个字段定义对象,第一个字段定义对象是定义为整数类型的字段,这个字段的名称是TID。第二个字段定义对象是字符串类型,它的字段长度是20个字符,字段的名称是TSValue

接着CreateMemoryTable又为scdsMemory定义了一个索引定义对象TIndexDef。索引定义对象可以为数据集建立字段索引,程序员需要设定要建立索引的字段名称以及这个索引本身的名称。从下面的程序代码中可以看到,这个索引定义对象为TID字段建立索引,并且设定这个索引的名称是idxTID

procedure TForm1.CreateMemoryTable;

begin

with dmMemoryTable.scdsMemory do

  begin

    with FieldDefs.AddFieldDef do

    begin

      DataType := ftInteger;

      Name := 'TID';

    end;

    with FieldDefs.AddFieldDef do

    begin

      DataType := ftString;

      Size := 20;

      Name := 'TSValue';

    end;

    with IndexDefs.AddIndexDef do

    begin

      Fields := 'TID';

      Name := 'idxTID';

    end;

    CreateDataSet;

    IndexDefs.Update;

    IndexName := 'idxTID';

  end;

end;

scdsMemory通过字段定义对象和索引定义对象设定好了要定义的字段以及索引之后,就可以调用TSimpleDataSetCreateDataSet方法以建立一个新的、不包含数据的数据集了。最后记得调用TSimpleDataSetIndexDefs对象的Update方法,以便反映最新的数据表索引信息。

至于FillTempData非常地简单,它只是在scdsMemory建立的内存数据表中新增数笔数据,其中第一个字段值是整数,第二个字段值是字符串数据。

procedure TForm1.FillTempData;

begin

  InsertData(1, 'DataSnap');

  InsertData(2, 'WebSnap');

  InsertData(3, 'Web Service');

  InsertData(4, 'SOAP');

  InsertData(5, 'XML');

  InsertData(6, 'Interface');

  InsertData(7, 'COM+');

end;

 

procedure TForm1.ApplyData;

begin

  dmMemoryTable.scdsMemory.ApplyUpdates(0);

end;

 

procedure TForm1.InsertData(const iID: Integer; const sValue: String);

begin

  with dmMemoryTable.scdsMemory do

  begin

    Insert;

    FieldByName('TID').Value := iID;

    FieldByName('TSValue').Value := sValue;

    Post;

  end;

end;

 

procedure TForm1.EndTime;

begin

  lEnd := GetTickCount;

end;

 

function TForm1.GetRunTime: double;

begin

  Result := (lEnd - lStart) / 1000.0;

end;

 

procedure TForm1.StartTime;

begin

  lStart := GetTickCount;

end;

 

procedure TForm1.ShowAppMsg(const sMsg: String);

begin

  lbTimes.Items.Add(sMsg);

end;

完成了btnCreateMemoryTableOnClick事件处理函数之后,btnSearchDataOnClick事件处理函数就简单多了。当用户点击了btnSearchData按钮之后,它就直接使用scdsMemory刚才建立的内存数据表,调用Lookup方法来根据用户在主窗体ID控件中输入的ID键值查寻数据。

procedure TForm1.btnSearchDataClick(Sender: TObject);

begin

  StartTime;

  edtValue.Text := dmMemoryTable.scdsMemory.Lookup('TID', edtID.Text,
    'TSValue');

  EndTime;

  ShowAppMsg('查寻数据时间' + FloatToStr(GetRunTime));

end;

现在,这个建立和使用内存数据表的范例应用程序已经完成了,下面让我们执行这个范例应用程序来观察执行的结果。

3-14是执行范例应用程序,点击【产生临时数据】按钮建立内存数据表以及填入临时数据,再于ID控件中输入ID值为2的查寻数据的结果画面。从主窗体右方的TListBox中可以看到,建立内存数据表以及填入临时数据的速度非常理想。而查寻内存数据表的数据更是快速无比,这正是内存数据表吸引人的地方。

3-14  使用内存数据表储存数据

内存数据表这种建立和查寻速度快速的特性,非常适合使用在少量、经常使用的数据应用中。不过读者必须注意的是,内存数据表不适合用来储存大量的临时数据,例如超过数百笔数据的情形就不适合使用。读者必须根据数据的特性以及客户端机器的内存情形适当地决定是否要使用内存数据表。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论