手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

Delphi中带缓存的数据更新技术

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


  (2)程序框架说明

  下面是一段delphi程序的框架,大致说明了如何运用缓存更新的编程模式。读者可以自己将本程序的功能进一步的完善。

unit Order;
{单元名称}
interface
uses
{引用的模块}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls, ToolWin, ActnMan, ActnCtrls,
ActnMenus, DB, DBTables;

Type
{声明的变量、添加的控件以及定义的方法和过程}
 TOrderForm = class(TForm)
 TBOrder: TTable;
 TBDetail: TTable;
 OrderDB: TDatabase;
 ActionMainMenuBar1: TActionMainMenuBar;
 DBNavigator1: TDBNavigator;
 DBGrid1: TDBGrid;
 procedure TBOrderAfterPost(DataSet: TDataSet);
 procedure TBDetailNewRecord(DataSet: TDataSet);
 procedure TBDetailUpdateRecord(DataSet: TDataSet;
 UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 procedure TBDetailAfterPost(DataSet: TDataSet);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
  public
  { Public declarations }
  end;
 
 var
  OrderForm: TOrderForm;

  implementation

  {$R *.dfm}
  {下面的内容为主要的程序框架}

 procedure TOrderForm.FormCreate(Sender: TObject);
 {将主表与明细表的缓存更新选项设为true}
 begin
  TBOrder.CachedUpdates:=true;
  TBDetail.CachedUpdates:=true;
 end;

 procedure TOrderForm.TBOrderAfterPost(DataSet: TDataSet);
  {在提交Order表的更新后,执行本过程内容,本过程实现对主表和明细表的实际提交的事务。
   注意:如果一个数据集的cachedUpdates属性为true,
    那么post这个动作仅仅是在客户端缓冲区中进行一个提交动作,
    而不是真正的提交给实际的数据库。要实现真正的提交,
    需要用到applyUpdates语句。}
 begin
  OrderDB.StartTransaction;//更新事务开始执行
  try
   TBOrder.ApplyUpdates;//对主表进行实际的更新
   TBDetail.ApplyUpdates;//对明细表进行实际的更新
  except
   Orderdb.Rollback;//如果发生意外,那么回滚这个事务,退出该过程
   exit;
  end;
  OrderDB.Commit;//如果没有发生意外,那么完成事务提交
  TBOrder.commitUpdates;//清空TBOrder表的客户缓冲区
  TBDetail.commitUpdates;// 清空TBDetail表的客户缓冲区

 end;

 procedure TOrderForm.TBDetailNewRecord(DataSet: TDataSet);
 {当新增一个明细表记录时所完成的动作。}
 begin
 TBDetail.FieldByName('OrderID').AsInteger:=TBOrder.FieldByName('OrderID').AsInteger;
 file://将主表的orderID字段赋给明细表的orderID字段,这个字段是两个表的关联字段

 end;

procedure TOrderForm.TBDetailUpdateRecord(DataSet: TDataSet;
 UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 {当实际更新数据库表时,需要同时进行的操作在onUpdateRecord事件中定义,
  在本例当中是进行明细表和库存表的级联更新操作。
  注意:在本过程当中所进行的操作是在实际更新数据库时所进行的动作,
   而不是更新客户端的缓存数据时所进行的动作}
 Var temp_query:TQuery;
 begin
  if UpdateKind=ukInsert then file://如果更新类型是插入一个新的记录,那么更新相应的库存量
   with temp_query do
   begin
    close;
   SQL.clear;
   SQL.add('update storage set stocks=stocks-:amount');
   SQL.add(' where commondityID=:commondityID');
   paramByName('amount'):=TBOrder.FieldByName('amount').AsFloat;
   ParamByName('commondityID'):=TBDetai.FieldByName('commondityID').AsInteger;
   execSQL; file://执行更新库存的sql语句,将相应的库存量减去。
  end;

 end;

 procedure TOrderForm.TBDetailAfterPost(DataSet: TDataSet);
 {当对明细表的记录进行修改,并提交(post)之后,执行本过程中的语句。
  注意:这种提交是针对客户端数据的,并没有真正反映到数据库中去。
  在本例当中,实现的功能是计算主表的总金额字段}
 begin
  TBOrder.FieldByName('money'):=0;
  with TBDetail do
  begin
   first;
   while not eof do
   begin
    TBOrder.FieldByName('money'):=TBOrder.FieldByName('money')
    FieldByName('price').AsFloat*FieldByName('amount');
    file://将明细表的金额累加到主表的金额字段
   next;
  end;
 end;

end;

end.

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!