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