起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 167|回复: 1

[分享]一个错误的分析**

[复制链接]
发表于 2007-4-5 14:51:10 | 显示全部楼层 |阅读模式
以下是我看到的一段代码,根据一个数据集的内容,来产生另外的一些数据,中间用到了事务的控制。
==========================
  DataSetBroker2.DataSet.First;
  h:=Transaction1.Start(true);
  try
  begin //事务控制
    for i:=1 to DataSetBroker2.DataSet.RecordCount do
    begin
。。。 。。。
          if i = DataSetBroker2.DataSet.RecordCount then
          Dialogs.ShowMessage('凭证已经自动生成!');
        end
        else
          Dialogs.ShowMessage('这里出现错误了!');
        DataSetBroker2.DataSet.FieldByName('SFTJ').AsInteger := 1;
        DataSetBroker2.DataSet.Next;
      end;
      DataSetBroker2.DataSet.Next;
    end;
    Transaction1.Commit(h);
  end;//事务控制
  except
    Transaction1.Rollback(h); //回滚事务,当执行操作失败或提交出错后执行
    Dialogs.ShowMessage('数据提交数据库时出错,请您重新提交数据(重新点击自动生成凭证!');
  end;
end;
回复

使用道具 举报

 楼主| 发表于 2007-4-5 15:00:49 | 显示全部楼层
1 滚动数据集来访问数据集中每一条记录,最好先DisableControls;,最后EnableControls。类似:
DataSet.DisableControls;
try

  DataSet.First;
  while not DataSet.Eof do
  begin
    //循环处理数据
    DataSet.Next;
  end;
finally
  DataSet.EnableControls;
end;


2 尽量不要使用立即事务,而是采用非立即事务
只有在提交事务之前需要看到事务中对数据修改的变化时候,才需要用立即事务。比如,这个例子中的,需要取单据号,来决定新的单据号=最大单据号+1,这样的情况需要用到立即事务。

3 事务处理中,不要时间过长,尤其是不要有用户交互,象这个例子的ShowMessage
          if i = DataSetBroker2.DataSet.RecordCount then
          lProcessOk:= True;
        end
        else
          raise Exception.Create('这里出现错误了!');
        DataSetBroker2.DataSet.FieldByName('SFTJ').AsInteger := 1;
        DataSetBroker2.DataSet.Next;
      end;
      DataSetBroker2.DataSet.Next;
    end;
    Transaction1.Commit(h);
    if lProcessOk then Dialogs.ShowMessage('凭证已经自动生成!');
  end;//事务控制
  except
    Transaction1.Rollback(h); //回滚事务,当执行操作失败或提交出错后执行
    Dialogs.ShowMessage('数据提交数据库时出错,请您重新提交数据(重新点击自动生成凭证!');
  end;
end;
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-29 10:49 , Processed in 0.038771 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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