起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: liso

[请求]在一个事务中多次更新同一记录的问题**

[复制链接]
发表于 2008-3-3 15:00:53 | 显示全部楼层
您可以看看delphi对应的源码。可以对照Tclientdataset
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-3 15:46:43 | 显示全部楼层
procedure TINVOICE_MANAGE.DataNavigatorBeforeAction(Sender: TObject; var Accept: Boolean);
begin
  if TAction(Sender).Name = 'actSave' then
  begin
    Beforesave('');
  end;
end;
老师,我在这个事件里面将数据集的保存和相关表更新的做同一事务处理可行么
回复 支持 反对

使用道具 举报

发表于 2008-3-3 15:48:38 | 显示全部楼层
这个应该可以。最好先用一个跟数据集无关的按钮测试。等无误后,再想办法放入某些特定事件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-3 16:09:00 | 显示全部楼层
关于事物处理,有没有实际的代码例子给我参考一下
回复 支持 反对

使用道具 举报

发表于 2008-3-3 16:20:10 | 显示全部楼层
sql语句报错,提交失败的话,数据集中的相关更新也没有进行
对,如果sql语句错误,BeforeApplyUpdates事件就会中止,后面的提交就没有执行,当然是正确的
但是如果sql语句执行正常,但是数据集提交时候出错了,那么sql语句的修改就会提交到数据库,而没有回滚,因为根本就没有启动事务
回复 支持 反对

使用道具 举报

发表于 2008-3-3 16:29:54 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-3 16:36:19 | 显示全部楼层
最初由 alang 发布
[B]sql语句报错,提交失败的话,数据集中的相关更新也没有进行
对,如果sql语句错误,BeforeApplyUpdates事件就会中止,后面的提交就没有执行,当然是正确的
但是如果sql语句?.

以下省略...... [/B]



实际上我是通过采用同一连接来处理这个问题,据说以前在2611版本里面不是很好,我们已经升级到2918了.下面讲一下具体的方法

前面已经把数据集的连接赋值给下面要使用的sql语句作为连接
lQueryex := TDbCommand.CreateConnect(DSB_INV_BILL_DETAIL.DataSet);

函数:

接下来在执行sql语句的时候把数据集相关的连接传过去
ls_sql := 'UPDATE EXP_BILL_HEAD SET EBH_INV_VALUTA = EBH_INV_VALUTA + ' + floattostr(lf_new_inv_fee) +
                       ', EBH_STATUS = ' + QuotedStr(ls_bill_inv_status) + 'WHERE EBH_AUTOIN = ' + QuotedStr(ls_new_billid);
             TDbCommand.ExcSqlex(ls_sql,lQueryex);

这是两个函数里面具体的内容:
static function TDBCOMMAND.CreateConnect(FDataSet:TDataSet):TQuery;
var lQuery:TQuery;
begin
  //定义执行sql的连接
   lQuery:=TQuery.Create(nil);
   lQuery.ConnectionString:='DATABASEURL=Biz:\ZSGLXT\GOLDENBRIDGE.Database';
   lQuery.CommandText := '';
   lQuery.Connection := FDataset.Connection;
   Result := lQuery;
end;

static function TDBCOMMAND.ExcSqlex(FSql: String;FQuery:TQuery):Boolean;
begin
   FQuery.CommandText:= Fsql;
   try
     FQuery.Execute;
     Result := True;
   except
     Result := False;
   end;
end;

我实际上没有去刻意做提交,而是利用平台的事务管理来处理,当数据集提交的时候,一起提交执行过的sql
这样处理是否满足同一事务来处理?
回复 支持 反对

使用道具 举报

发表于 2008-3-3 16:51:47 | 显示全部楼层
同一个连接只是说可以在一个事务中启动,但是如果事务没有启动,那肯定不行了
楼主你上面的代码抽象出来实际上是
  BeforeApplyUpdates;
Transaction.Start;
  执行SQL语句
  Transaction.Commit;
Transaction.Start;
  InternalApplyUpdates;  //真正的执行提交数据集的数据
  Transaction.Commit;
  AfterApplyUpdates;

lixy让你改成
Transaction.Start;
  执行SQL语句
  DataSet.ApplyUpdates;
    Transaction.Commit;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-3 17:00:25 | 显示全部楼层
了解了,如果我用导航条上的保存事件在DataNavigatorBeforeAction中处理
Transaction.Start;
  执行SQL语句
  DataSet.ApplyUpdates;
    Transaction.Commit;
可以么?
回复 支持 反对

使用道具 举报

发表于 2008-3-3 17:31:21 | 显示全部楼层
理论上可以,最好写在一个单独按钮上。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-9 23:12 , Processed in 0.042736 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表