中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>数据处理>文章内容

delphi 数据库事务处理

来源:站内 关于:bill 发布时间:2007-06-21   [收藏] [推荐]

---- 与缓冲机制有关的属性和方法如下,只有在缓冲机制下,即CachedUpdates:=True时,以下属性和方法才有效:

---- CachedUpdates(属性):为True时,打开缓冲机制。
---- UpdatesObject(属性):可以放置一个TUpdateSql组件的SQL语句,并可自动执行,也可以由OnUpdateRecord事件处理程序调用。
---- UpdatesPending(属性):缓存中数据是否改变,True:改变。
---- ApplyUpdates(方法):将缓冲数据存盘。
---- CommitUpdates(方法):与ApplyUpdates合作,紧跟之后,将缓冲数据存盘。
---- CancelUpdates(方法):取消缓存中的所有更新。
---- RevertRecord(方法):恢复当前记录的原有数据,取消数据更改。
---- UpdateRecord(方法):将缓冲数据存盘。
---- UpdateStatus(函数):返回记录的更新状态,共有四种状态,usUnmodified,usModified,usInserted,usDeleted,可供查询。

---- 了解缓冲机制的属性和方法后,用一个电话管理程序来说明。如图1(略)

---- 东西不多,一个TDBGrid,三个Button,四个CheckBox,一个Table和一个DataSource,一个Navigator。将Table.ChacedUpdates属性设置为True,加入三个字段,其中一个State字段是一个计算字段,字段值在DhbTable的OnCalcFields事件中定义,如下:

procedure TForm1.DhbTableCalcFields(DataSet: TDataSet);
begin
  If DhbTable.UpdateStatus =usUnmodified Then
    DhbTableState.Value:='原有记录';
//这两种访问字段的方式是等价的
  If DhbTable.UpdateStatus =usModified Then
    DhbTable.FieldByName('State').asString:='已修改记录';
  If DhbTable.UpdateStatus =usInserted Then
    DhbTable.FieldByName('State').asString:='新增记录';
  If DhbTable.UpdateStatus =usDeleted Then
    DhbTable.FieldbyName('State').asstring:='已删除记录';
end;

---- 这个在DhbTable中定义的计算字段表达了每个记录现有的状态,而如何在DBGrid中显示这些字段由四个CheckBox控制,它们共享了一个事件句柄,如下:
procedure TForm1.CheckBox1Click(Sender: TObject);
var UpdataTypes:TUpdateRecordTypes;
begin
  UpdataTypes:=[];
  If CheckBox1.Checked then
    Include(UpdataTypes,rtUnModified);
  If CheckBox2.Checked then
    Include(UpdataTypes,rtModified);
  If CheckBox3.Checked then
    Include(UpdataTypes,rtInserted);
  If CheckBox4.Checked then
    Include(UpdataTypes,rtDeleted);
  DhbTable.UpdateRecordTypes :=UpdataTypes;
end;

---- rtModified, rtInserted, rtDeleted, rtUnmodified这四个常量分别定义了缓冲状态下的四种显示状态。若四种都没有选择,默认状态是除了rtDeleted以外的三种状态集合。DhbTable根据其属性UpdateRecordType集合中的值自动显示相应的记录。

---- 三个按钮首先判断缓冲中是否有变化,若有,分别执行缓冲操作指令。OKButton是存盘,CancelAllButton是取消所有更新,RevertThisButton是恢复当前记录的改变(如果有变化)。代码如下:

procedure TForm1.OKButtonClick(Sender: TObject);
begin
  If DhbTable.UpdatesPending then
    DhbTable.ApplyUpdates;
    DhbTable.CommitUpdates;
end;

procedure TForm1.CancelAllButtonClick
(Sender: TObject);
begin
  If DhbTable.UpdatesPending then
    DhbTable.CancelUpdates;
end;

procedure TForm1.RevertThisButtonClick
(Sender: TObject);
begin
  If DhbTable.UpdatesPending then
    DhbTable.RevertRecord;
end;

---- 然后,运行这个小程序,感觉一下缓冲的效果,先增加一批记录,修改一批记录,再删除几个记录,单击四个CheckBox,看一看不同选择下的显示方式,试着恢复删除或修改的记录,绝对错不了。
---- 要注意的是,在缓冲机制下,如果用POST,或Refresh或用:

Table.Close
Table.Open

---- 后,修改的数据并没有存入到数据库中,如果要存盘,必须使用:

    Table.ApplyUpdates;
    Table.CommitUpdates;

---- 这才是缓冲机制下存盘的正确方法。


[浏览: 次]   
上一篇:delphi 运行创建、删除字段   下一篇:delphi 计算字段值
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi 中使用原生 ADO 控制数
·delphi Base64编码/解码及ZLib压缩/解
·delphi Delphi_有关ADO专题
·delphi Delphi下的ADO
·delphi DataSet数据复制
·delphi Oracle9i 如何用sysdba连接数据
·delphi 多线程执行数据库查询
·delphi 开发数据库程序经验三则
·delphi 输入图片到Blob字段
·delphi 将纯文本导入数据库
·delphi 如何给日期时间字段赋空值
·delphi 使用TQuery 的误区
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932