線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1984
推到 Plurk!
推到 Facebook!

如何同步ADOdataset,ADOquery,ADOtable在DBgrid中的显示?

尚未結案
sunyard
一般會員


發表:9
回覆:10
積分:3
註冊:2004-08-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-20 17:26:05 IP:202.110.xxx.xxx 未訂閱
各位先进:    开始时,表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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-20 21:10:48 IP:211.20.xxx.xxx 未訂閱
引言: 第一种:当使用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-22 20:25:06 IP:202.110.xxx.xxx 未訂閱
感谢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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-22 23:37:23 IP:203.204.xxx.xxx 未訂閱
sunyard 你好    1.在Delphi IDE 的除錯模式下執行,出現該訊息是正常的。除非你把Debugger Options裏的Integrated Debugging 的勾選拿掉或直接檔案總管中點選該Exe檔直接執行亦可。    2.AdoDataSet.Refresh需另建一個Button來執行,而不能以按下dbNavigate中的Refresh按鈕來執行(原因如前所述) _______________________________________ 深藍的魚,祝您好運..........連連
sunyard
一般會員


發表:9
回覆:10
積分:3
註冊:2004-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-23 08:49:38 IP:202.110.xxx.xxx 未訂閱
感谢Chance36:        情况一:我已经明白了;        情况二:
引言: 2.AdoDataSet.Refresh需另建一個Button來執行,而不能以按下dbNavigate中的Refresh按鈕來執行(原因如前所述)
可是Dbnavigator1、dbnavigator2,dbnavigator3的Refresh按键我都没用, 都是另外增加的button,却仍然不成功,代码分别为: Adodataset1.refresh; Adoquery1.refresh; Adotable1.refresh;
系統時間:2024-09-29 5:02:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!