ADO主明细表结构处理问题二则,300分(300分)

  • 主题发起人 oceanwave
  • 开始时间
所以,我才要在这里发这个贴子,彻彻底底的把这个问题搞清楚。不然,这永远是个问题
并且我想会有很多很多人在用DELPHI+ADO的时候会遇到这个问题,解决了大家都受益。
所以,再次请大家积极参与。谢谢!!
 
to YNTW:我的环境是D5+ADO2.5+SQL Server 7(D5打过补丁),试了一下你的Demo,但是
从表不能更新数据,也不能添加数据。不知为何?
 
有没有更好的保存方法呢?
 
问了下同事,好象要对access配置一下,具体的就不是很清楚;
 
其实问题很简单,只要增加几个控件,随便你怎么弄都可以的,可惜这个论坛没有添加附件的地方。
下载示例:www.smiling.com.cn/file/95954/project.zip
 
to Landina:
无法下载,能说一下用了什么控件吗?
 
TO 阿梁:
跟Delphi的版本没关系的话,那偶也想不明白倒底问题出在哪了:(

TO huawei_dfm:
刚在SQL 7中试了,能添加和更新数据的

对ButtonClick的代码作了一下修改,这样就算在表中增加、修改或删除记录,记录指针移动后也能正确提交
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Edit;//强制进入Edit状态
ADOTable2.Edit;//同上
ADOTable1.Post;
end;
 
请oceanwave兄试试杜宝兄的建议:
从表的OnNewRecord事件中写入D.FieldByName('MID').Value:=M.FieldByName('ID').Value

杜宝兄的依据:
主从表新增记录时,因为主从表的关联字没有赋值,所以会有只有一条记录的情况,如果强制赋值就不会了。
 
我的做法是:
在用户新增或修改记录时,都用一个TQuery来临时保存,提交时才用一个事务控制,
将主表及明细表的数据写入实际的数据库中.

这个方法很好,很灵活,不会现以上的问题.
 
to YNTW:
再次多谢!!不过按杜宝兄的做法,问题依然出,你不妨也试一下。
to 1Fuyi:
能不能麻烦你说详细一点儿,谢谢!!
 
to oceanwave:
告诉我你的邮箱,我将示例发给你,看看是否符合你的要求!
 
to landina:
多谢!我的邮箱是i2346@sina.com
 
>>1Fuyi
>>我的做法是:
>>在用户新增或修改记录时,都用一个TQuery来临时保存,提交时才用一个事务控制,
应该是使用TADOQuery吧;
>>将主表及明细表的数据写入实际的数据库中.

>>这个方法很好,很灵活,不会现以上的问题.
如何才能实现你所说的好?
 
多谢LANDINA兄,邮件已收到,你是用ClienDataSet来处理,能讲一下整个处理的过程
和主要概念吗?谢谢!
 
我已经把示例发给你了,你可以仔细琢磨一下,绝对可以解决你现在的问题!
 
从表 用ADO 的 SAVETOFILE可以吧
 
大家不知遇到这样的问题吗?请看如下代码:(是保存按钮的代码)
with MastData do
begin
ADOCONN.BeginTrans;
try
Stock.UpdateBatch;
StockWare.UpdateBatch;
ADOCONN.CommitTrans;
except
ADOCONN.RollbackTrans;
raise;
end;
end;
如果在录入数据时(用数据控件),没违反自定义的数据库规则(在Accsee2000的
数据库中直接定义,而没有在程序中控制,如某个字段不能为空),那么主从表
的所有记录都能保存,而如果违反了规则就出现问题:(违反规则后,我已经重新
修改违反规则的数据,使刚才违反规则的数据不再违反规则)
如果原先违反规则的是主表,则从表数据不能被保存(因为主表违反规则,
要使主表不再违反规则,则主表的记录必须修改,而从表的数据因没违反,
就不再修改),主表能保存;原先违反规则的是从表,则主表的数据不能被保存,
从表能保存。
这就是说,当违反了规则,数据回滚(RollbackTrans)后,必须对主从表的数据
都进行修改(如果从表违反,必须在从表中添加一条新纪录,也能使主表数据不必
修改就能保存),才能保证主从表的数据都能被保存,哪怕是主或从表中只有一个
违反规则,也必须两个都修改,可以是随便选择一个字段重新填写一个和原先相同
的值即可,真是蠢)。
说明一下,用Stock.Edit或StockWare.Edit没用,一定要在数据控件中修改数据。
 
真是的又发现一个问题:
删除(也是按钮的代码)也不能正确提交,只有主表更新成功,从表说什么也不能
更新,没有出错提示,看样子是更新成功,但其实...

呜呜,难道ADO的Bug这么多,真没有信心!会不会是我系统ADO(2.1)的版本太低,
或者ADOExpress更新有问题,我是直接用ADOExpress Update Pack 2更新的,没有
先用ADOExpress Update Pack 1更新,再用ADOExpress Update Pack 2更新,
Delphi 5.0 Enterprise环境用Delphi5 Enterprise Update Pack更新
 
谢谢大家的捧场,经过大家的帮助,这几天整理思絮之后,有了一个解决的方向:
1、主表不做缓存更新,而从表做。
2、用TADOQuery,但不连接主从表关系。
从表的SQL内容是:SELECT * FROM 从表 WHERE 连接字段名=:查询参数名
经softdog兄指点,虽然未全部理解,我想应该是在主表的afterScroll事件中,当主表
记录指针移动时,设从表查询参数值为主表的与从表的连接字段值,并Requery。
而当从表新增记录时,手工给从表对应的连接字段赋值……

刚才试了一下,以上两个问题已经解决。大家都可以试一下,有什么不明白的,在这个
贴了提问吧!我再测试两天时间,将在12月18日结束这个贴子。
一些朋友也将得到分数。
softdog兄,我将会另开一个问题给分。

万分感谢大家!!!!!!
 

Similar threads

回复
0
查看
735
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部