我有一对主从表,主表为录入单,从表为单据所需付的价钱列表
主表:
单号, 日期, 录入员,复核员
01 20050101 张三 李四从表:
收费项目, 价格
运输费 30
制单费 10
关口费 20每当我新建一条主表的记录时,自动在从表中添加多条预先定义好的收费项目记录,在POST的时候一并提交,如果是出错了,就一起出错,在客户端出提错误提示,并保持未POST之前的状态。
现在的问题就是在于,由于主表与从表分别用了两个表DataSet1和DataSet2,我要怎样才能让他们两个一起提交,且出错时可以恢复到未POST之前的状态呢?我现在是从表用BatchOptimism的形式,我定义了一个方法
procedure Save()
begin
conMain.BeginTrans;
try
DataSet1.Post;
DataSet2.UpdateBatch();
conMain.CommitTrans;
except
conMain.RollBackTrans;
end;
end;
虽说把这两个表用事务圈了起来,但是会出现这种情况:
当DataSet1提交成功后,DataSet2提交失败,此时服务器端数据库将会被回滚Rollback,但由于在客户端DataSet1已经提交成功,它并不知道数据库被回滚了,所以它的状态被设成了已提交,而非编辑状态,再者由于它已被设为成功,则这条记录已存在于客户端,可是服务器端已经没有这条记录了,所以再次编辑的时候将会出错。同志们,我该如何是好,我不想重新刷新客户端,我希望有一种方法,在不刷新整个DataSet1的情况下,如果提交失败,则DataSet1重新回到未POST之前,也就像在单个DataSet的时候,如果添加一条记录的时候POST出错,它会停留在原来的状态下,等你修改错误后再POST。
主表:
单号, 日期, 录入员,复核员
01 20050101 张三 李四从表:
收费项目, 价格
运输费 30
制单费 10
关口费 20每当我新建一条主表的记录时,自动在从表中添加多条预先定义好的收费项目记录,在POST的时候一并提交,如果是出错了,就一起出错,在客户端出提错误提示,并保持未POST之前的状态。
现在的问题就是在于,由于主表与从表分别用了两个表DataSet1和DataSet2,我要怎样才能让他们两个一起提交,且出错时可以恢复到未POST之前的状态呢?我现在是从表用BatchOptimism的形式,我定义了一个方法
procedure Save()
begin
conMain.BeginTrans;
try
DataSet1.Post;
DataSet2.UpdateBatch();
conMain.CommitTrans;
except
conMain.RollBackTrans;
end;
end;
虽说把这两个表用事务圈了起来,但是会出现这种情况:
当DataSet1提交成功后,DataSet2提交失败,此时服务器端数据库将会被回滚Rollback,但由于在客户端DataSet1已经提交成功,它并不知道数据库被回滚了,所以它的状态被设成了已提交,而非编辑状态,再者由于它已被设为成功,则这条记录已存在于客户端,可是服务器端已经没有这条记录了,所以再次编辑的时候将会出错。同志们,我该如何是好,我不想重新刷新客户端,我希望有一种方法,在不刷新整个DataSet1的情况下,如果提交失败,则DataSet1重新回到未POST之前,也就像在单个DataSet的时候,如果添加一条记录的时候POST出错,它会停留在原来的状态下,等你修改错误后再POST。
可考虑编辑数据的时候不要使用数据敏感的控件(例如,用普通的edit或者StringGrid等控件),提交数据通过存储过程来提交,则你编辑的内容不受是否回滚事务的影响
无论你做多少改动,你体现到sql语句中,再保存到一个tstringlist中。
最后采用事务来批量执行这个sql,就ok了啊!
DataSet只用作显示的作用
如果DASET2失败了就重新返回DASET1的提交前的数据