痛哭的人:关于ado主从表的头痛问题...若解决,另奉200分!

h_q_p 2002-10-08 10:34:10
近段将以前用BDE写的系统改ADO.主从表是用ADOQuery,在form上,主表用
TDBEdit控件作为输入控件,从表用TDBGrid作输入控件。
现问题是:
当新增时一笔主表后新增从表时:DBGrid中只能显示当前输入之明细资
料,即输入第二笔时,第一笔不见了,增第二笔时,前二笔不见了,但保
存后显示正常。

请教各位:怎样才能显示全部资料?
...全文
934 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
键行天下 2002-10-18
  • 打赏
  • 举报
回复
没劲!
键行天下 2002-10-18
  • 打赏
  • 举报
回复
</font><font size=10>刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!刷新!</font><<font>
l_xiaofeng 2002-10-16
  • 打赏
  • 举报
回复
TO:wushenjian(Maverick) 楼主已经说用ADO,所以方法不适用。
不妨试试forgot(让一切随风)的方法。
腊月三毛 2002-10-16
  • 打赏
  • 举报
回复
这个我也是遇到过,好象很多的人都不明的一样。一个说你要提交(UpdateBatch),一个说你要用TADOTable的MasterSource来关联等等。
其实这些结果都是一样。他的情况是主表新增,还没Post之前,新增从表数据,从表Post后记录就不见了(这时主表没有Post,更不用说是UpdateBatch了),直到主表Post之后,从表才能见到数据(如有LockType为ltBatchOptimistic的话,则要UpdateBatch后才能看到新增的数据。而做主从表理论上都是用ltBatchOptimistic为好,正象BDE的缓冲的效果一样)。说用TADOTable的人全是没有经事实测试的,在这瞎蒙。不过我不知这是不是ADO的BUG,我也要去找找补丁来试试。
我的解决方案笨了些,我用了ltBatchOptimistic,如果主表是新增时,在从表新增第一笔时我将主表Post,这时请表的STATE为dsEdit再新增从表就没事了。这样就是取消时一定要CancelUpdates了,不然仅Cancel主表的记录都已经Post了。
wushenjian 2002-10-16
  • 打赏
  • 举报
回复
如果用sql语句插入的话,会有这个问题。
改用:
withd adodataset do
begin
Append;
Fieldbyname('').Vaule:=...
post;
end;
supersoho 2002-10-16
  • 打赏
  • 举报
回复
up
forgot 2002-10-16
  • 打赏
  • 举报
回复
在ADO中最好不要用Cancel或者Refresh等事件。
这样写
ADOQuery1.Close;
ADOQuery1.Open;
或者
Adotable.active:=false;
Adotable.active:=true;
重新打开ADO数据集的同时,也把Cache清空了。
h_q_p 2002-10-16
  • 打赏
  • 举报
回复
謝謝各位支持!

用forgot(让一切随风) 的方法基本正常,但在cancel時出錯:
Project Project1.exe raised exception class EPleException with message 'Row handle referred to a deleted row or a row marked for deletion'.Process stopped. Use Step or Run to continue.

請各位幫著看看,謝謝!

代碼如下:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, DBCtrls, DB, Grids, DBGrids, ExtCtrls, ADODB ;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
DataSource1: TDataSource;
DataSource2: TDataSource;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
btnADD: TButton;
btnEdit: TButton;
btnDelete: TButton;
btnSave: TButton;
btnCancel: TButton;
dxDBGrid1: TdxDBGrid;
dxDBGrid1no: TdxDBGridMaskColumn;
dxDBGrid1StartEnd: TdxDBGridMaskColumn;
dxDBGrid1school: TdxDBGridMaskColumn;
DBNavigator1: TDBNavigator;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
procedure btnADDClick(Sender: TObject);
procedure btnEditClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure ADOQuery1AfterScroll(DataSet: TDataSet);
procedure ADOQuery2NewRecord(DataSet: TDataSet);
procedure DBGrid1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//新增代碼
procedure TForm1.btnADDClick(Sender: TObject);
begin
ADOQuery1.Append;
ADOQuery2.Edit;
end;

//編輯代碼
procedure TForm1.btnEditClick(Sender: TObject);
begin
ADOQuery1.Edit;
ADOQuery2.Edit;
end;

//刪除代碼
procedure TForm1.btnDeleteClick(Sender: TObject);
begin
ADOQuery1.Delete;//明細通過觸發器處理
end;

//保存代碼
procedure TForm1.btnSaveClick(Sender: TObject);
begin
ADOQuery1.UpdateBatch();
ADOQuery2.UpdateBatch();
end;

//取消代碼
procedure TForm1.btnCancelClick(Sender: TObject);
begin
ADOQuery1.CancelUpdates;
ADOQuery2.CancelUpdates;
end;

//手工控制主從表關聯代碼
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
ADOQuery2.Parameters[0].Value := ADOQuery1.FieldbyName('no').Value;
ADOQuery2.Close;
ADOQuery2.Open;
end;

//明細新增記錄時,手工為新記錄關聯字段賦值
procedure TForm1.ADOQuery2NewRecord(DataSet: TDataSet);
begin
ADOQuery2.FieldbyName('no').value := ADOQuery1.FieldbyName('no').Value;
end;

procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
with ADOQuery2 do
begin
if ((UpdateStatus = usModified) or (UpdateStatus = usInserted))
and (ADOQuery2.FieldByName('no').value = null) then
FieldByName('no').value := ADOQuery1.fieldbyname('no').value;
end;
end;

end.
hailiang111 2002-10-08
  • 打赏
  • 举报
回复
当增加的时候,把主从表关联的主表主键赋值即可。
zxkid 2002-10-08
  • 打赏
  • 举报
回复
你的主数据集与从数据集有没有关联起来?
daniel007 2002-10-08
  • 打赏
  • 举报
回复
Delphi好像一直有这个问题,不信你用delphi的sql explore添加数据试试看?
l_xiaofeng 2002-10-08
  • 打赏
  • 举报
回复
建议你再用一个ADOQUERY或者ADOTABLE连DBGRID,然后添记录的时候刷新.
h_q_p 2002-10-08
  • 打赏
  • 举报
回复
to neilwq(啄木鸟) :
for d6?
hongqi162 2002-10-08
  • 打赏
  • 举报
回复
关注!!!!
neilwq 2002-10-08
  • 打赏
  • 举报
回复
有专门ado的补丁
borland网站有下载
hansion3406 2002-10-08
  • 打赏
  • 举报
回复
详细检察一下你的程序:
当记录插入后是否把 ADOQUERY.CLOSE
当插入第二条时再把 ADOQUERY.OPEN
解决:
当插入后不要对它进行CLOSE操作(或类似的操做)
h_q_p 2002-10-08
  • 打赏
  • 举报
回复
to SayForever(恒) :
保存後顯示正常,不正常是在從表新增時...

to neilwq(啄木鸟) :
現用環境是w2k+sp2及D6+sp2,D6好像還沒而額外的補丁吧?難道是MADC?

neilwq 2002-10-08
  • 打赏
  • 举报
回复
装ado的补丁程序
SayForever 2002-10-08
  • 打赏
  • 举报
回复
保存后數據集(Refresh)刷新一次﹐試試。
greathong 2002-10-08
  • 打赏
  • 举报
回复
Delphi 6 中的Ado 怎么样啊!
是否也有相关的问题呢...
加载更多回复(5)
这是一套元旦班级活动班会PPT模板,共24张; 幻灯片模板以喜庆元旦节日主题制作,封面使用了淡雅群山、灯笼、古典折扇、梅花等素材进行设计。充满了节日气氛。 元旦活动PPT内容简介: 1、元旦的定义 2、世界各地的元旦趣闻 3、交流个人成长故事 4、新年的心愿和目标 元旦的定义 元旦是一年的首日(1月1日) “元”含有第一和开始之意,“旦”则是一轮红日从地面开始升起 “元”和“旦”何在一起,就是要人们以蓬勃朝气迎接崭新的一年 世界各地的元旦趣闻 中国:元旦,即世界多数国家通称的"新年",是公历新一年的第一天。元,谓"首";旦,谓"日";"元旦"意即"首日"。"元旦"一词最早出现于《晋书》:“颛帝以孟夏正月为元,其实正朔元旦之春 ”。中国古代曾以腊月、十月等的月首为元旦,汉武帝起为农历1月1日,中华民国起为公历1月1日。1949年中华人民共和国以公历1月1日为元旦,因此元旦在中国也被称为"阳历年"。 英国:元旦前一天,家家户户都必须做到瓶中有酒,橱中有肉。英国人认为,如果没有余下的酒肉,来年便会贫穷。除此之外,英国还流行新年“打井水”的风俗,人们都争取第一个去打水,认为第一个打水人为幸福之人,打来的水是吉祥之水。英国人在除夕的深夜,常带上糕点和酒出去拜访,他们不敲门,就径直走进亲友家去。按英国人的风俗,除夕千夜过后,朝屋里迈进第一只脚的人,预示着新的一年的运气。如果第一个客人是个黑发的男人,或是个快乐、幸福而富裕的人,主人就将全年吉利走好运。如果第一个客人是个浅黄头发的女人,或是个忧伤、贫穷、不幸的人,主人在新的一年中将遭霉运,会遇上困难和灾祸。除夕在亲友家作客的人,在未交谈前,要先去拨弄壁炉的火,祝福主人“开门大吉”。在英国中部的一些地区,新年早上出门时,不管熟识还是陌生,都会互送铜钱,他们认为这样做,不但对方一年有财气,同时也会给自己带来幸运。 印度:印度的元旦被人称为“痛哭元旦”、“禁食元旦”。他们在新年第一天,谁也不许对人生气,更不准发脾气。有些地方,过年不但不庆祝,反而相抱大哭。他们认为,元旦一开始,岁月易逝——人生短暂,用哭声来示自己的感叹。有些地区的人们则以禁食一天一夜来迎接新的一年,由元旦凌晨开始直到午夜为止。 西班牙:西班牙人在元且前夕,所有家庭成员都团聚在一起,以音乐和游戏相庆贺。午夜来临,十二点的钟声刚开始敲第一响,大家便争着吃葡萄。加果能按钟声吃下12颗,便象征着新年的每个月都一切如意。元旦这天,最忌孩子们骂人、打架和哭啼,认为这些现象是不祥之兆。所以,元旦之日大人总是尽量满足孩子们的一切要求。同时,这天人们身上必携一枚金币或铜币以示吉祥。 德国:德国人在元旦期间,家家户户都要摆上一棵枞树和横树,树叶间系满绢花,示繁花如锦,春满人间。他们在除夕午夜新年光临前一刻,爬到椅子上,钟声一响,他们就跳下椅子,并将一重物抛向椅背后,以示甩去祸患,跳入新年。在德国的农村还流传着一种过新年的风俗——“爬树比赛”,以示步步高升。 新加坡:农历除夕时,孩子们有守岁的习惯,直到午夜待家长祭祀神灵和祖先的活动结束后方能就寝,第二天清晨则起个大早,高高兴兴的从长辈那里拿“红包”(压岁钱)去看舞龙、舞狮队的沿街演,男女老少穿着节日的盛装,带上礼品走访亲友,每个人脸上都洋溢着一种节日的气氛。过年时,人们爱吃油炸糯米和红糖做成的甜年糕。 朝鲜:朝鲜和我国一样,在新年也有贴窗花、桃符的习俗,以祈求上天保佑,驱走鬼怪,赐给幸福。元旦黎明,人们把一些钞票塞进预先扎好的稻草人中,扔到十字路口,示送走邪恶,迎接吉祥福星。黄昏,人们又将全家人一年中脱落的头发烧掉,祝愿家人四季平安。新年期间,朝鲜人除了享以美酒佳肴外,还必须要做一种用糯米加上松子、栗子粉、枣泥和蜂蜜等,蒸煮成与我国的八宝饭相类似的甜饭食用,以预示家里人丁兴旺日子过得象蜜一样甜。 ... ... ... 关键词:元旦PPT模板,动态元旦班会幻灯片模板免费下载,学校元旦活动PPT模板,.PPTX格式;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧