有一个系统 C/S 架构
A 输入了东西或修改了东西
B 自动刷新
我用了一个timer ,每5秒钟刷新一次
用了好几个方法都没解决刷新的问题,代码如下:book:=Adoquery1.GetBook; //记录当前数据集指针
book1:=ADOQuery_ypjy.GetBook; //记录当前数据集指针
book2:=ADOQuery_jgyj.GetBook; //记录当前数据集指针
try
beginADOQuery1.Refresh;
ADOQuery_ypjy.Refresh;
ADOQuery_jgyj.Refresh;end
exceptexit;
end;Adoquery1.GotoBook(book);
ADOQuery_ypjy.GotoBook(book1);
ADOQuery_jgyj.GotoBook(book2);这样的方法,A 新增了一个数据,B没有更新。A修改了一个数据,B有更新
*****************************************************************
book:=Adoquery1.GetBook; //记录当前数据集指针
book1:=ADOQuery_ypjy.GetBook; //记录当前数据集指针
book2:=ADOQuery_jgyj.GetBook; //记录当前数据集指针
try
beginADOQuery1.Close;
ADOQuery1.open;
ADOQuery_ypjy.Close;
ADOQuery_ypjy.open;
ADOQuery_jgyj.Close;
ADOQuery_jgyj.Open;end
exceptexit;
end;Adoquery1.GotoBook(book);
ADOQuery_ypjy.GotoBook(book1);
ADOQuery_jgyj.GotoBook(book2);
这样的方法,数据可以刷新,但是,Dbgrideh 的行标(选中那行)老是在跳,虽然我用了book,表现为,我在Dbgrideh 选中了最后一行数据,刷新后,这行数据会自动跳到中间。********************************************************************
book:=Adoquery1.GetBook; //记录当前数据集指针
book1:=ADOQuery_ypjy.GetBook; //记录当前数据集指针
book2:=ADOQuery_jgyj.GetBook; //记录当前数据集指针
try
beginADOQuery1.Requery();
ADOQuery_ypjy.Requery();
ADOQuery_jgyj.Requery();end
exceptexit;
end;Adoquery1.GotoBook(book);
ADOQuery_ypjy.GotoBook(book1);
ADOQuery_jgyj.GotoBook(book2);问题是,B既没有刷新,而且行标会跳。**********************************************************我想实现的效果是,A新增或者修改的数据,行标不要跳,在B那能够看到新的数据。

解决方案 »

  1.   

    在open之前加Adoquery1.DisableControls;
    在GotoBook后加Adoquery1.EnableControls;
    应该能决你的问题.
    但定时刷新的办法只能用于数据量少的情况,这个问题多年前就讨论过,有些数据库带事件触发功能(如interbase 的TIBEvents),如果没有,最好自己用socket来传递更新消息.否则一是效率低二是容易将表锁死.
      

  2.   

    另外给你3个与你有关的参考:
    http://topic.csdn.net/u/20080821/09/349B39EC-54DC-401C-AE37-677DCC194D76.html
    http://topic.csdn.net/u/20080912/14/5E948E3F-D9D2-4109-906A-2EE0701788D1.html
    http://topic.csdn.net/t/20030110/21/1347854.html
      

  3.   

    keiy: 你好,部分多数据的 我有用socket 通知的 多谢你的提议。
    在open之前加Adoquery1.DisableControls; 
    在GotoBook后加Adoquery1.EnableControls; 
    应该能决你的问题.这个还不能解决,表现为,如果焦点选的那个浮标(行标?) 在底部,刷新后,会自动跳到中间的,虽然选中的还是那一行,但是这样让客户感觉到了 那个数据在跳了。
      

  4.   

    这个问题的确存在,我们以前也遇到到,当初有人的解决方案好像是计算当前记录在grid中的位置,然后移动整个数据表,使它和原来一样,但效率太低没有采用,最终是做了客户的工作(反正不影响使用).
      

  5.   

    多谢 keiy 的回帖我想应该有兄弟可以解决这个问题的
      

  6.   

    更改记录用adoquery1.refresh,追加记录后用adoquery1.requery,定位用
          adoquery1.Locate('mdid',id,[]);mdid为字段名,id刷新之前记录的mdid的值。