ADODataSet的UpdateBatch问题

看过好多主从数据表更新保存的操作,都不能解决我遇到的问题,问题是这样的:
主从表结构,设置两个表的
CursorType: ctKeyset,
CursorLocation: clUseClient,
LockType: ltBatchOptimistic
然后用MasterField关联起来两表,在新增一个单据时,主表输入数据,从表输入数据,
当保存时,原来我的保存是这样的:
  if not DM.ADOConnection1.InTransaction then
  begin
    DM.ADOConnection1.BeginTrans;
    try
      ItemDataSet.UpdateBatch;
      MasterDataSet.updatebatch;
      DM.ADOConnection1.CommitTrans;
    except
      DM.ADOConnection1.RollbackTrans;
      Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    end;
  end
  else
  begin
    Application.MessageBox('服务器忙请稍后再试!',p_msgTitle,MB_OK+mb_iconWarning);
  end;

在这种情况下,如果从表保存失败,最常见的问题是从表有重复的记录,那么就会出错,然后删掉重复的记录回来,再保存,不会有什么问题,然而,实际上从表的数据根本就没有保存进去,而仅仅成功保存的是主表的数据!!!

原因是:因为在从表UpdateBatch之前,系统默认调用Post,这样就从表就不能返回到以前的状态,所以不能更新,而在UpdateBatch之前遍历从表数据,找出重复的记录删除掉,我觉得代码上比较麻烦,所以我就想,既然系统默认调用Post,我何不手工调用Post,捕捉错误,然后处理掉这个错误,再回来保存,那不就有可能成功吗?
于是就有了下面这段代码:
  try
    ItemDataSet.Post;   //保存之前先Post,如果出错,则不保存,置于编辑状态
    ItemDataSet.UpdateBatch;
    MasterDataSet.Post;
    MasterDataSet.Edit;
    ItemDataSet.Edit;
  except
    Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    MasterDataSet.Edit;
    ItemDataSet.Edit;
    Abort;
  end;

  if not DM.ADOConnection1.InTransaction then
  begin
    DM.ADOConnection1.BeginTrans;
    try
      ItemDataSet.UpdateBatch;
      MasterDataSet.updatebatch;
      DM.ADOConnection1.CommitTrans;
    except
      DM.ADOConnection1.RollbackTrans;
      Application.messagebox('数据保存失败!请检查编码是否重复。',p_msgTitle,MB_OK+mb_iconwarning);
    end;
  end
  else
  begin
    Application.MessageBox('服务器忙请稍后再试!',p_msgTitle,MB_OK+mb_iconWarning);
  end;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值