为何主表能更新数据,而从表不能更新数据?(25分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi的问题:
数据库为mssql7,有两个表,分别是dbo.mastertable(主表,字段为masterid,name)和dbo.detailtable
(从表,字段为detailid,name,这个detailid与主表masterid关联的。)。用两tquery来做一个主从关系,
用两个Tupdatesql来处理数据,querymaster(主表)的cachedupdate为true,sql语句为"select masterid,
name from mastertable",querydetail(从表)的cachedupdate为true,sql语句为"select detailid,
name from detailtable where detailid=:masterid"。

第一种方法:
querymaster的AfterPost事件为:

Database1.StartTransaction;
try
QueryMaster,ApplyUpdates;
detailMaster,ApplyUpdates;
Database1.Commit;
except
Database1.Rollback;
raise;
end;
querymaster.CommitUpdates;
querydetail.commitupdates;

运行时,先querymaster.insert,然后在主表和从表写入数据,然后querymaster.post时,发现主表能更新
数据,而从表不能更新数据,也就是说从表的数据不见了,这是为什么?
第二种方法:

如果我在form里添加button1,
Onclick事件为:
Database1.StartTransaction;
try
detailMaster,ApplyUpdates;
Database1.Commit;
except
Database1.Rollback;
raise;
end;
querydetail.commitupdates;

querymaster.post;

querymaster的AfterPost事件改为:
Database1.StartTransaction;
try
QueryMaster,ApplyUpdates;
Database1.Commit;
except
Database1.Rollback;
raise;
end;
querymaster.CommitUpdates;

这样就会主从表更新了,这又是为何呢?为何我用第一种方法从表不能更新数据,而第二种就行?如何把
第一种方法的代码改一改?
 
主从表的机制是这样的:
但主表更新或改变后,从表都会重新关闭,再打开。
当您更新主表后,从表先关闭,再以主表的MASTERID
作参数,打开从表。所以,从表没有
更新,就关闭,导致数据丢失。
建议:主从表更新不好控制。不如在主表的AFTERSCROLL
事件中,将参数传给从表,并关闭和打印从表。效
率和主从表一样(可用SQL MONITOR测),但更易编程
控制。
 
agree mech,我刚做完的项目里就是这样用的.

不过对于你的第一种方法倒是和Delphi的Help中关于主从表的更新方法是一致的,
所以应该是没问题的,会不会是执行的时机不对,把它放到OnButtonClick中试试.
 
问题可能是这样的:
主表触发post的时候,从表并没有post,从而导致从表数据丢失。否则,即使从表关闭再打开,在同一个会话期内,更新数据也不会丢失。
建议你在程序中严格控制主从表的post顺序。我在corba三层结构中进行与你相似的提交获得通过。
 
mech:你能否说一说,如何写代码?
ppz_76:你也能不能说在程序中严格控制主从表的post顺序,最好是写出代码来。
 
1、在从表中,写一个带参数的SQL,但不指定DATASOURCE。
SELECT * FROM DETAILTABLE WHERE MASTERID=:MASTERID
2、在主表的AFTERSCROLL中,给从表单指定参数
QUERYDETAIL.PARAMBYNAME('MASTERID').VALUE:=
QUERYMASTER.FIELDBYNAME('MASTERID').VALUE;
QUERYDETAIL.ACTIVE:=FALSE;
QUERYDETAIL.ACTIVE:=TRUE;
3、在从表的ONNEWRECORD中,
QUERYDETAIL.PARAMBYNAME('MASTERID').VALUE:=
QUERYMASTER.FIELDBYNAME('MASTERID').VALUE;
这是为新增记录考虑的。
4、以后,您就可以正常对主、从表中运用APPLYUPDATES。

主要考虑就是这些,当然,如果您有一些特殊要求,
在相应地方加代码就可以了。


 
接受答案了.
 
后退
顶部