ADODataSet的UpdateBatch问题

    技术2022-05-20  38

    看过好多主从数据表更新保存的操作,都不能解决我遇到的问题,问题是这样的:主从表结构,设置两个表的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)