发信人: 099(099) 
整理人: teleme(2001-02-17 12:09:33), 站内信件
 | 
 
 
【 在 lhbgyl 的大作中提到:】
 :  099兄,本人才疏学浅,资料欠缺,请给出一个例子,讲解UpdateSql的详细用法
 :......
  很长的,怎么打啊,其实书店很多DELPHI的书都有介绍,去书店找找吧.
 我是用BCB的,不会DELPHI,苦于BCB的好书奇少,只好看DELPHI的书,
 在...\Borland\CBuilder5\Examples\DBTasks\CachedUp下有例子,
 DELPHI的目录路径可能不同,你自己找找.
 
 下面是从http://go2.163.com/~jjlzg/delphi/core/core13.htm摘录的:
 
 
 13.2 一个缓存更新的示范程序
   这一节详细剖析一个缓存更新的示范程序,项目名称叫Cache,它可以在C:\Program Files\Borland\Delphi4\Demos\Db\Cacheup目录中找到。它的主窗体如图13.3所示。
   图13.3 Cache的主窗体
   主窗体上有一个“Cached Updates”复选框,如果选中此复选框,表示使用缓存更新技术。否则,表示不使用缓存更新技术,当用户修改了数据后,数据被直接写到数据集中。
   主窗体上还有一个“Use Update SQL”复选框,如果选中这个复选框,表示使用TUpdateSQL构件来进行缓存更新。
   当用户单击“Apply Updates”按钮,就向数据库申请更新数据。
   当用户单击“Cancel Updates”按钮,所有未决的修改将被取消。
   当用户单击“Revert Record”按钮,对当前记录所作的修改将被取消。
   在“Show Records”分组框内有几个复选框,用于选择要在栅格中显示哪些记录,包括未修改的记录、修改的记录、插入的记录和删除的记录。
   当用户单击“Re-Execute Query”按钮,就重新执行查询。此外,这个示范程序还用一个计算字段来表达当前的更新状态。
   下面我们就来看看怎样实现上述功能。在介绍程序代码之前,我们先要介绍数据模块CacheData,因为几个关键的构件都是放在这个数据模块上,如图13.4所示。
   图13.4 数据模块
   数据模块上有四个构件,分别是:一个TDataSource构件,其名为CacheDS,一个TDatabase构件名为CacheDB,一个TQuery构件名为CacheQuery,一个TUpdateSQL构件名为UpdateSQL。 
   TQuery构件的OnCalcFields事件是这样处理的:
 Procedure TCacheData.CacheQueryCalcFields(DataSet: TDataSet);
 ConstUpdateStatusStr: array[TUpdateStatus] of string = ('Unmodified', 'Modified','Inserted', 'Deleted');
 Begin
 If CacheQuery.CachedUpdates then
   CacheQueryUpdateStatus.Value := UpdateStatusStr[CacheQuery.UpdateStatus];
 End;
   上述代码用于给计算字段CacheQueryUpdateStatus赋值,以显示当前的更新状态。TQuery构件的OnUpdateError事件是这样处理的:
 Procedure TCacheData.UpdateErrorHandler(DataSet: TDataSet; E: EDatabaseError; 
 UpdateKind:TUpdateKind;
 var UpdateAction: TUpdateAction);
 Begin
 UpdateAction := UpdateErrorForm.HandleError(DataSet, E, UpdateKind);
 End;
   现在我们回到主窗体,从处理主窗体的OnCreate事件的句柄开始。
 Procedure TCacheDemoForm. FormCreate(Sender: TObject);
 Begin
 FDataSet := CacheData.CacheDS.DataSet as TDBDataSet;
 FDataSet.CachedUpdates := CachedUpdates.Checked;
 SetControlStates(FDataSet.CachedUpdates);
 FDataSet.Open;
 End;
   第一行代码从TDataSource构件的DataSet属性取出当前的数据集,第二行代码是根据复选框CachedUpdates来决定数据集的CachedUpdates属性,进而再调用SetControlStates函数设置窗体上有关控件的状态,最后调用Open执行查询。SetControlStates是这样定义的:
 Procedure TCacheDemoForm.SetControlStates(Enabled: Boolean);
 Begin
 ApplyUpdatesBtn.Enabled := True;
 CancelUpdatesBtn.Enabled := True;
 RevertRecordBtn.Enabled := True;
 UnmodifiedCB.Enabled := True;
 ModifiedCB.Enabled := True;
 InsertedCB.Enabled := True;
 DeletedCB.Enabled := True;
 UseUpdateSQL.Enabled := True;
 End;
   下面是处理一些控件的事件。首先是复选框CachedUpdates的OnClick事件:
 Procedure TCacheDemoForm.ToggleUpdateMode(Sender: TObject);
 Begin
 FDataSet.CachedUpdates := not FDataSet.CachedUpdates; 
 SetControlStates(FDataSet.CachedUpdates);
 End;
   复选框UseUpdateSQL的OnClick事件是这样处理的:
 Procedure TCacheDemoForm.UseUpdateSQLClick(Sender: TObject);
 Begin
 FDataSet.Close;
 If UseUpdateSQL.Checked then
   FDataSet.UpdateObject := CacheData.UpdateSQLElseFDataSet.UpdateObject := nil;
   FDataSet.Open;
 End;
   当用户单击“Apply Updates”按钮,就向数据库申请更新数据。
 Procedure TCacheDemoForm.ApplyUpdatesBtnClick(Sender: TObject);
 Begin
 FDataSet.Database.ApplyUpdates([FDataSet]);
 End;
   当用户单击“Cancel Updates”按钮,所有未决的修改将被取消。
 Procedure TCacheDemoForm.CancelUpdatesBtnClick(Sender: TObject);
 Begin
 FDataSet.CancelUpdates;
 End;
   当用户单击“Revert Record”按钮,对当前记录所作的修改将被取消。
 Procedure TCacheDemoForm.RevertRecordBtnClick(Sender: TObject);
 Begin
 FDataSet.RevertRecord;
 End;
   在“Show Records”分组框内的几个复选框,它们的OnClick事件是这样处理的:
 Procedure TCacheDemoForm.UpdateRecordsToShow(Sender: TObject);varUpdRecTypes : TUpdateRecordTypes;
 Begin
 UpdRecTypes := [];
 If UnModifiedCB.Checked then
   Include(UpdRecTypes, rtUnModified);
 If ModifiedCB.Checked then Include(UpdRecTypes, rtModified);
 If InsertedCB.Checked then Include(UpdRecTypes, rtInserted);
 If DeletedCB.Checked thenInclude(UpdRecTypes, rtDeleted);
 FDataSet.UpdateRecordTypes := UpdRecTypes;
 End;
   UpdateRecordsToShow 函数首先声明了一个TUpdateRecordTypes类型的变量UpdRecTypes,并把它初始化为空的集合。然后依次判断四个复选框是否选中,如选中的话,就把对应的元素包含到这个集合中,作为数据集的UpdateRecordTypes属性。
   当用户单击“Re-Execute Query”按钮,就重新执行查询。
 Procedure TCacheDemoForm.ReExecuteButtonClick(Sender: TObject);
 Begin
 FDataSet.Close;
 FDataSet.Open;
 End;
   此外,在主窗体上,还有一个菜单命令叫About,此命令将调用ShowAboutDialog打开一个对话框。
   ShowAboutDialog是这样定义的:
 Procedure ShowAboutDialog;
 Begin
 With TAboutDialog.Create(Application) Do
 Try
 AboutMemo.Lines.LoadFromFile(ExtractFilePath(ParamStr(0))+'ABOUT.TXT');
 ShowModal;
 FinallyFree;
 End;
 End; 
 
 
  ---- Mailto:[email protected]
  | 
 
 
 |