如何同步ADOdataset,ADOquery,ADOtable在DBgrid中的显示? |
尚未結案
|
sunyard
一般會員 發表:9 回覆:10 積分:3 註冊:2004-08-12 發送簡訊給我 |
各位先进: 开始时,表bminfo中存在三条记录: bmdm bmmc
1111 aaaaaaa
2222 bbbbbbb
3333 ccccccc FormShow事件发生时,Dbgrid1,Dbgrid2,Dbgrid3显示内容一致。 有以下两种情况:
第一种:当使用Dbnavigator3(即对应ADOTable1)的删除按钮删除3333的记录后,按Dbnavigator1和Dbnavigator2的refresh按钮,报错:
“数据源中此行键值已被修改,现在本地行被删除”
第二种:当使用Dbnavigator1(或Dbnavigator2)的增加按钮,加入一条新记录时,使用Dbnavigator3的refresh按钮,但是Dbgrid3却没有显示出新记录。 问题:
1) 为何会这样?
2)如何在程序中忽略第一种情况下的“数据源中此行键值已被修改,现在本地行被删除”的错误提示?
3)为何在第二种情况下,refresh不出新增加的记录?照理说,refresh是针对缓冲区的数据集进行更新的啊,应该可以的? 以下为代码: procedure TForm1.FormShow(Sender: TObject);
begin
// Test code for TADOdataset
with ADOdataset1 do
begin
CommandText:='select * from bminfo';
Active:=true;
end;
datasource1.DataSet:=ADOdataset1;
Dbgrid1.DataSource:=datasource1;
Dbnavigator1.DataSource:=datasource1; // Test code for TADOQuery
with ADOQuery1 do
begin
close;
sql.Clear;
sql.add('select * from bminfo');
active:=true;
open;
end;
datasource2.DataSet:= ADOQuery1;
Dbgrid2.DataSource:= datasource2;
Dbnavigator2.DataSource:= datasource2; // Test code for TADOtable
ADOTable1.TableName:='bminfo';
ADOTable1.Active:=true;
datasource3.DataSet:=ADOtable1;
Dbgrid3.DataSource:=datasource3;
Dbnavigator3.DataSource:=datasource3; end; 程序执行时的贴图:
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 第一种:当使用Dbnavigator3(即对应ADOTable1)的删除按钮删除3333的记录 后,按Dbnavigator1和Dbnavigator2的refresh按钮,报错: “数据源中此行键值已被修改,现在本地行被删除” 第二种:当使用Dbnavigator1(或Dbnavigator2)的增加按钮,加入一条新记录 时,使用Dbnavigator3的refresh按钮,但是Dbgrid3却没有显示出新记录。sunyard 你好 1.當你使用AdoTable的Refresh時(Dbnavigator2的refresh按下一樣的),原記 錄若已被刪除以致於與現在的資料錄不一致時,adoDataSet會舉發錯誤訊息(如你 所見),但你可以用Try... Except 攔截下來,但由於 AdoDataset.Refresh是在Dbnavigator中呼叫的,所以我們會找不到攔截點,必須 自行呼叫Refresh的Method,才能使用Try...Except攔截,具體作法如下: 把Dbnavigator的Refresh按鈕隱藏起來,再新增一個按鈕(Caption設為更新),在 其OnClick事件中自行呼叫Refresh Method。 procedure TForm1.BitBtn1Click(Sender: TObject); begin Try AdoDataSet2.Refresh; Except // 不顯示訊息 End; end;2.由於每個AdoDataSet(所有的TDataSet的後代),會自行管理進入Insert或 Edit狀態到Post之間的所有異動,在還沒Post之前,別的DataSet是不會反應其異 動的資料的。所以當第一個DataSet進入Insert狀態(按下新增的按鈕),再按另一 個Dbnavigator的Refresh當然看不到其新增的資料啊!(因為還沒有Post) 以上簡短說明,希望你可以了解。 _______________________________________ 深藍的魚,祝您好運..........連連 發表人 - chance36 於 2004/08/20 21:17:00 |
sunyard
一般會員 發表:9 回覆:10 積分:3 註冊:2004-08-12 發送簡訊給我 |
感谢Chance36:
引言: 第一种:当使用Dbnavigator3(即对应ADOTable1)的删除按钮删除3333的记录 后,按Dbnavigator1和Dbnavigator2的refresh按钮,报错: “数据源中此行键值已被修改,现在本地行被删除” 第二种:当使用Dbnavigator1(或Dbnavigator2)的增加按钮,加入一条新记录 时,使用Dbnavigator3的refresh按钮,但是Dbgrid3却没有显示出新记录。情况1:我按照您提供的方法,可是依然“数据源中此行键值已被修改,现在本地行被删除”;是否要在except下加入忽略信息提示的代码?还是有别的原因? 情况2: 我是在按完Dbnavigator2(或Dbnavigator1)的POST按键后,再按的Dbnavigator3的Refresh按键,还是看不到增加的记录。我可能还未真正领会您所说的“自行管理進入Insert或Edit狀態到Post之間的所有異動”,??? |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
sunyard 你好 1.在Delphi IDE 的除錯模式下執行,出現該訊息是正常的。除非你把Debugger Options裏的Integrated Debugging 的勾選拿掉或直接檔案總管中點選該Exe檔直接執行亦可。 2.AdoDataSet.Refresh需另建一個Button來執行,而不能以按下dbNavigate中的Refresh按鈕來執行(原因如前所述) _______________________________________
深藍的魚,祝您好運..........連連
|
sunyard
一般會員 發表:9 回覆:10 積分:3 註冊:2004-08-12 發送簡訊給我 |
感谢Chance36: 情况一:我已经明白了; 情况二:
引言: 2.AdoDataSet.Refresh需另建一個Button來執行,而不能以按下dbNavigate中的Refresh按鈕來執行(原因如前所述)可是Dbnavigator1、dbnavigator2,dbnavigator3的Refresh按键我都没用, 都是另外增加的button,却仍然不成功,代码分别为: Adodataset1.refresh; Adoquery1.refresh; Adotable1.refresh; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |