S
savetime
Unregistered / Unconfirmed
GUEST, unregistred user!
ADO主细表更新出错,绝对难题!
我在设计一个ADO主细表表单时,发生以下故障,请大侠帮助!
环境:Delphi5 SP1, ADO SP1, ADO SP2, 数据库:ACCESS2000
主表: MasterDataSet (LockType: ltOptimistic)
细表: DetailDataSet (LockType: ltBatchOptimistic)
ACCESS中主细表之间已设置好一对多、级联更新、删除关联。
表单中,MasterDataSet和DetailDataSet已设置Master/Detail模式。
主表用DBEDIT等控件,细表用DBGRID控件。
在表单的保存按钮过程中,写有以下代码:
问题:
当编辑一个已存在的数据记录时,保存没有问题。
错误1:
当新增一条记录时,如果主表没有被POST就增加细表项,细表项在
新增第二项时先前增加的一项被删除,也就是无法增加细表项。
错误2:
如果将细表的LockType改为ltOptimistic则新增细表项的Post过程
就出现错误:“主表需要一个相关记录,不能增加或修改记录”。
注意:这是个OLE错误,通常的DELPHI数据库错误都是DATABASE类。
错误3:
如果把ACCESS中的关联删除,则同样出现错误1,但在使用以上的保
存过程后,被删除的子项又出现在DBGRID中,并已写入数据库。
初步分析:
根据以上测试,在保存过程中,主表的数据已写入数据库(虽然是在
事务中),但细表不能识别主表中记录的存在,这就很奇怪了。如果
主表的LockType也是ltBatchOptimistic,会出现什么样的情况呢?
另外,为什么错误1没有触发错误,而错误2却触发,是否说明DELPHI
没能很好地处理BatchUpdate过程。错误2中触发的OLE错误是因为
ACCESS中的关联吗?
我想这应该是DELPHI的BUG。请大家关注!
如果大家有更好的处理ADO主细表的方案,请提出。
我在设计一个ADO主细表表单时,发生以下故障,请大侠帮助!
环境:Delphi5 SP1, ADO SP1, ADO SP2, 数据库:ACCESS2000
主表: MasterDataSet (LockType: ltOptimistic)
细表: DetailDataSet (LockType: ltBatchOptimistic)
ACCESS中主细表之间已设置好一对多、级联更新、删除关联。
表单中,MasterDataSet和DetailDataSet已设置Master/Detail模式。
主表用DBEDIT等控件,细表用DBGRID控件。
在表单的保存按钮过程中,写有以下代码:
代码:
begin
//开始事务处理
DM.Conn.BeginTrans;
//保存主表
try
if MasterDataSet.State in [dsEdit, dsInsert] then
MasterDataSet.Post;
except
DM.Conn.RollbackTrans;
raise; //错误信息进入另一处理模块,下同
Exit;
end;
//保存细表
try
DetailDataSet.UpdateBatch;
except
DM.Conn.RollbackTrans;
raise;
Exit;
end;
//提交事务
DM.Conn.CommitTrans;
FEditing := False;
SetToolBarState;
end;
当编辑一个已存在的数据记录时,保存没有问题。
错误1:
当新增一条记录时,如果主表没有被POST就增加细表项,细表项在
新增第二项时先前增加的一项被删除,也就是无法增加细表项。
错误2:
如果将细表的LockType改为ltOptimistic则新增细表项的Post过程
就出现错误:“主表需要一个相关记录,不能增加或修改记录”。
注意:这是个OLE错误,通常的DELPHI数据库错误都是DATABASE类。
错误3:
如果把ACCESS中的关联删除,则同样出现错误1,但在使用以上的保
存过程后,被删除的子项又出现在DBGRID中,并已写入数据库。
初步分析:
根据以上测试,在保存过程中,主表的数据已写入数据库(虽然是在
事务中),但细表不能识别主表中记录的存在,这就很奇怪了。如果
主表的LockType也是ltBatchOptimistic,会出现什么样的情况呢?
另外,为什么错误1没有触发错误,而错误2却触发,是否说明DELPHI
没能很好地处理BatchUpdate过程。错误2中触发的OLE错误是因为
ACCESS中的关联吗?
我想这应该是DELPHI的BUG。请大家关注!
如果大家有更好的处理ADO主细表的方案,请提出。