有这样一个要求:用户需要数据即时刷新。用什么方法好?我用的是TIMER,
但看了任务管理器的性能后,发现内存在不断增加。这个程序是三层结构的,
我把SQL语句写在TIMER里后,系统启动后报错:
Clientdataset2:Missing data provider or data packer
分不够加!谢谢各位了。我很急

解决方案 »

  1.   

    用Udp吧,从服务器端向客户端发消息
      

  2.   

    楼上的 close open 也得有个时间段吧.
      

  3.   

    每次关闭前释放:data
    data:=null;
    将实时刷新时间延长。最好在服务器上调用方法,不要在客户端直接COMMANDTEXT:=‘SELECT’;
      

  4.   

    你建一个更新数据的中间层,只要是更新数据的都通过这层,只要一更新你就就通过UDP,SOCKET发送消息比如中间层更新数据时:
    ServerSocket.Socket.Connections[i].SendText('Client Refresh');
    在Client端中的ClientSocket的OnRead事件中:
    var str:string;
    begin
    str:=Socket.ReceiveText;
    if str='Client Refresh' then
    begin
    ClientDataSet.Close;
    ClientDataSet.CommandText:='select * from table';
    ClientDataSet.Open;
    end;
      

  5.   

    w1w2w3w4(gt):
        是不是将 ServerSocket 放在中间层
                ClientSocket  放在客户端??
    不好意思,问的很白痴吧.我第一次接触网络编程.
      

  6.   

    那 ServerSocket.Socket.Connections[i].SendText('Client Refresh');
    应该放在 DataSetProvider 的afterapplyupdate 或者 是afterapplyexecute 中了??
    不好意思,实在麻烦你.搞定候,再给你上分.
      

  7.   

    你试在AfterApplyUpdates里.更新完后就可以发消息了,当然你也可以直接在AfterUpdateRecord事件里得到刚更新后的数据传给客户端.7里已没ServerSocket等,你最好采用TUDPSOCEKT
      

  8.   

    w1w2w3w4(gt) 说的方式与楼主用的MIDAS不一样,楼主用的是DCOM而w1w2w3w4(gt) 说的是SOCKT。
    完全不对;
    下付例子:
    应用层:function TEasy_Dcom_Server.resultrecord(const sql: WideString): OleVariant;  //调用刷新的数据表
    begin
      if queryrecord(aquery2,sql) then  //select
      begin
        result:=dspquery2.Data;
      end else
      begin
        result:=null;
      end;
    end;客户端:
    sql:='select * from yourtable';
    clientdataset1.close;
    clientdataset1.data:=null;
    clientdataset1.data:=dm.socktconnection1.appserver.resultrecord(sql);
    clientdataset1.open;将查询放在应用层,加快查询速度,减少查询时间
    (当然要考虑网络流通时间)。
      

  9.   

    queryrecord是字定义函数? dspquery2呢?不好意思
      

  10.   

    Erice(白雪公猪) 同志你是否真搞清了楼主想要做什么?MIDAS的即时更新有你所讲的那么容易你不是要告诉我设置下poAutoRefresh, poPropogateChanges?或许MIDAS里有实时更新的方法但绝不是你上面那几行就做到的.
    不信你运行多个客户端试试,一个客户端更新了其它用你上面的那个更本没什么反应.
    只所以加了SOCKET就是因为没有想出好的其它MIDAS中的方法才这样试的做的.但你上面那个也够搞笑.现在的问题就是你怎样去驱动让它去实时刷新纪录?
      

  11.   

    这个问题已经解决了.感谢各位的支持.
    只是我很疑惑,
    w1w2w3w4(gt)兄,您所说的 
    ServerSocket.Socket.Connections[i].SendText('Client Refresh');
    .
    .
    .
    是对的,但是为什么没有说全呢,是疏忽了还是其它原因...
    要知道为了这个I 我可是两天两夜没睡啊.偏偏这个I是很关键的.
    我不知道咱们中国的程序员为什么不能很好的沟通?为什么要在技术上有所保留
    这个问题,网上的范例也是这样,关键的地方都处处隐含.好像不这样做就不能显示是
    高手.咱们中国的程序员再也不能这样了.看看人家比利时.80年代末起步的,现在是世界
    第一软件出口大国了.如果人家也象咱这样,会有今天软件的盛世么?
    w1w2w3w4(gt)兄,我无意也无权对您指责,相反我对你的点滴很感激,只是希望您下次把
    文章全点.发发个人意见,暂时不结贴.看看,听听战友的意见
      

  12.   

    呵呵
    这个问题我也想知道哟。
    我呢试过几种方法。
    1:就是在需要时用Close;   Open;
    行是行得通,可这样的话有点网络方面的问题影响执行效率。
    2:在TDataSetProvider的Option属性中改PoAutoRefresh也行不通。
    3:ClientDateSet1.Data:=DataSet.Delta;
    可是如果是新增一笔数据而且有一字段是自增的又怎么办呢?
      

  13.   

    yutish2002兄:
     第一种方法是万万不可得.我也试过.然后看监测系统性能,乖乖,内存是以一兆增加得(定时为1秒).
      我给你个思路:服务器上放个SERVER 通讯.客户机上放个 CLIENT 通讯. 客户机完成数据提交,刷新,删除等.都通过CLIENT 发送个信息. SERVER 接受到后,再判断又几个客户处于连接状态得基础上,返回这个信息.CLIENT 收到后,针对不同得讯息,做不同得处理.可以得.我试过了
      

  14.   

    用户需要数据即时刷新。用什么方法好?
    在客户端用两个ClientDataSet组件:在新增时用一个组件直接更新数据库(insert语句--修改update语句)而另一个组件则将数据append..post的方法加入记录集;删除先用(Delete语句直接删除数据库中的数据)然后在删除记录集中的数据。
      

  15.   

    对哦,实际三层结构中,经常有使用服务器通知客户端的需要,但Delphi提供的三层控件都不可以从服务器端对客户端进行操作,然后只能在服务器与客户端加上一个Socket控件来进行控制操作,嘿嘿!真是够晕的!!
      

  16.   

    我测试的好像sqlserver一定要把内存吃的还剩10M为止,这个问题不知道有没有人碰到过?
      

  17.   

    来了看到deluxtx(tx)的话至能惭愧一番如果我全部会我是不会躲藏的问题是以前我也没整过>_<,我也没整过实在是说不出什么.最后祝工作顺利,更重要的是以后如果我要做这个的话也要请你多帮忙