我用SQL+ADO编写了一个C\S的软件, 当在客户端统计数据时,数量大时屏幕就停滞了. 用鼠标一点就白屏了. 困扰我很长时间了, 试过多线程查询, 好像说ADO不能多线程查询. 想达到如下效果: 查询时显示进度条, 用户可以中断查询,最好不用等待. 这样该从哪个方向去思考呢?  拜求真解!!

解决方案 »

  1.   

    在客户端统计数据?
    记录数再多,返回的结果也仅仅只是一个整数而已
    说明慢在数据库服务器的统计处理,而是返回的数据量大数据库服务器的统计处理慢,需要优化sql、表结构,甚至需要把统计结果、中间结果预先处理好,存起来——以空间换时间
      

  2.   

    先优化你的SQL语句再看看效果。
    一步一步解决
      

  3.   

    先看看你的SQL 建索引没有,如果数据量大,索引很重要。一般来说SQL SERVER 查询个几十万条数据也不致于你说的还要等很久。还有,你说的ADO不支持多线程不知如何理解,我是经常用多线程来处理数据的。比如说:我在系统启动之后,要得到一些数据处理结果,你不可能在程序启动中等待它的执行,所以就用线程放在后
    台去处理,等到处理完之后再传给相关的显示控件效果感觉还可以。值得注意:如果有几个线程同时要执行,
    必须是给他们独立的ADOQuery,道理很简单了。我曾犯过这种低级错误,还查了很久。:(
      

  4.   

    分页查询应该就可以满足你的要求了。直接把sql脚本给dbgrid 就能看到类似分页效果的
      

  5.   

    数据库是什么的,先将sql在数据库中执行看看效果
    先将数据库端优化一下,看看数据量有多大,如果太大慢是肯定的,可以采用分页形式
      

  6.   

    应该是后台查询时间的过长导致,优化一下sql
    另外前台控制上,让进度条与sql处理多线程
      

  7.   

    时间长的查询,除了考虑优化外,给用户界面加个“请等待”的窗体(不用做进度条),就可以了。白屏主要是windows消息被堵塞了导致。
      

  8.   

    ADO不能多线程查询
    ----------------
    可以。记得:
    function ThreadFunc(P: Pointer): LongInt; stdcall;
    begin
      ActiveX.CoInitialize(nil);  //...  ActiveX.CoUninitialize;
      Result := 1;
    end;
      

  9.   

    如果在客户端调用了多次,每调一句,都加个application.process
      

  10.   

    显示进度条几乎不可能,除非你用个gif(假的);
    要想无假死,这个必须得用到线程来做了。