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

2.1.7  DataDelta属性

DataDelta分别储存了使用dbExpress从数据源中取得的数据以及被用户变更的数据。借助了解DataDelta属性,开发人员能够使用一些高级的技巧来开发应用程序。首先让我们观察这两个属性值在范例应用程序执行时的改变情形。

由于DataDelta属性是类型为OleVariant的属性,而且包含在这个OleVariant数值中的数据结构是DelphiDataSnap技术,因此要观察这两个属性的改变,必须借助使用DelphiTSimpleDataSet/TClientDataSet控件来帮忙。我们可以在用户变更了cdsBooks的数据时把cdsBooksDataDelta属性值指定给另外一个TSimpleDataSet/TClientDataSetData属性,再让这个TSimpleDataSet/TClientDataSet控件借助TDataSource连接到TDBGrid等的数据感知控件就可以观察到cdsBooksDataDelta属性值的变化情形。

要如此做,请回到范例应用程序,并且打开主窗体。在主窗体中加入一个TClientDataSet控件,一个TDataSource控件,设定它的DataSet属性值为刚才加入的TClientDataSet控件。再加入TDBNavigatorTDBGrid控件,设定它们的DataSource属性值为刚才加入的TDataSource控件。此时主窗体如图2-12所示。

2-12  在主窗体中加入TClientDataSet和其他可视化控件

现在我们希望在刚才加入的TDBGrid中能够显示当用户变更了cdsBooks之中的数据时,把cdsBooksDelta内容显示在此TDBGrid之中。因此我们可以在cdsBooksAfterPost事件中加入ShowDelta的过程调用程序代码:

procedure TdmDemo1.cdsBooksAfterPost(DataSet: TDataSet);

begin

//  Self.cdsBooks.ApplyUpdates(0);

  frmMain.ShowChangeCount(cdsBooks.ChangeCount);

  frmMain.ShowDelta(Self.cdsBooks.Delta);

end;

ShowDelta程序关键的地方则是把cdsBooksDelta属性值指定给刚才加入的TClientDataSet控件的Data属性值。这样一来,连接到TClientDataSetTDBGrid便能够显示用户变更了哪些数据。

procedure TfrmMain.ShowDelta(const ovDelta: OleVariant);

begin

  cdsDelta.DisableControls;

  try

    cdsDelta.Data := ovDelta;

  finally

    cdsDelta.EnableControls;

  end;

end;

现在执行范例应用程序,并且试着变更任何在cdsBooks中的数据,那么当你Post变更数据之后,就会发现被变更的数据显示在主窗体下方的TDBGrid中。例如图2-13是范例应用程序变更FXXX1这笔数据的书名一栏的数值,那么在Post之后,请注意在下方的TDBGrid中显示的刚才笔者变更了BOOKNAME字段的数值。

2-13  范例应用程序显示了用户变更的数据

在这里我们可以观察到Delta中的数值似乎是为每一笔变更的数据保留两笔记录。其中的第一笔是原始未被更改的数据,第二笔则是被变更后的数据。但是在这笔被变更后的数据中只有被变更的字段才会保存数值,其他没有被变更的字段则是空白的。这个现象就是DataSnap的运作原理,在稍后的章节中会详细地说明DataSnap的运作方式。

现在我们已经能够借助使用TClientDataSet控件来巧妙地观察用户变更的数据,那么,我们也可以使用相同的方式来观察TClientDataSet中当数据被变更后,储存在Data之中的属性值是否有变化。

现在再回到主窗体中,再加入另外一组TClientDataSetTDBNavigatorTDBGrid控件,就像刚才加入的一样。并且在主窗体的下方使用TPageControl控件,使用两个页签分别显示DataDelta属性值。此时主窗体看起来如图2-14所示。

2-14  在主窗体中再加入显示Data的数据感知控件

接着再修改cdsBooksAfterPost事件程序代码如下所示:

procedure TdmDemo1.cdsBooksAfterPost(DataSet: TDataSet);

begin

//  Self.cdsBooks.ApplyUpdates(0);

  frmMain.ShowChangeCount(cdsBooks.ChangeCount);

  frmMain.ShowData(Self.cdsBooks.Data);

  frmMain.ShowDelta(Self.cdsBooks.Delta);

end;

上面的程序代码除了调用ShowDelta之外,也调用了ShowData来显示cdsBooksData属性值。ShowData方法的实现程序代码如下:

procedure TfrmMain.ShowData(const ovData: OleVariant);

begin

  cdsData.DisableControls;

  try

    cdsData.Data := ovData;

  finally

    cdsData.EnableControls;

  end;

end;

ShowData也和ShowDelta一样,只是它把cdsBooksData属性值指定给新加入的TClientDataSet控件。

现在再次执行范例应用程序,变更任何的数据,Post此变更的数据,那么就可以在下方的两个页签中看到DataDelta属性值。例如图2-15便是执行范例应用程序并且修改原先“Delphi 2006高效数据库程序设计-dbExpress成为“Delphi 2006高效数据库程序设计-dbExpress篇之2”后的画面。

2-15  范例应用程序显示cdsBooksData属性值内容

需要注意的是,当Post变更的数据之后,原先储存cdsBooksData属性值的原始数据也会跟着改变成新的数值。

本范例到此为止已经介绍了如何使用dbExpress控件来存取数据并且把数据更新回数据源之中。但是在这个范例的主窗体中,ApplyUpdates方法只能够把数据真正地更新回BOOKS数据表中。如果我们希望用户能够同时更新主窗体中BOOKSPUBLISHERS这两个数据表的数据,那么该如何做呢?下一节会说明如何使用dbExpress更新多个数据表的数据。

查看所有评论(0)条】

最近评论



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