看过好多主从数据表更新保存的操作,都不能解决我遇到的问题,问题是这样的:
主从表结构,设置两个表的
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;
ADODataSet的UpdateBatch问题
最新推荐文章于 2023-12-12 14:15:18 发布