我在做一程序时,用到了TIMER控件定时扫描数据库SQL SERVER(1秒),但是中间执行时间有时不止一秒,我就在TIMER的ONTIMER时间中写了这么一段
TRY
TIMER.ENABLE:=FALSE
FINALLY
TIMER.ENABLE:=TRUE
这样解决了上一次数据库操作还未结束,下一次操作有进来的问题。
现在我想问的是:我在TRYFINALLY中用ADO访问,但是如果在一次查询数据库的时候,由于数据量大(40万条数据),时间耗费比较多(1分钟左右),我的整个界面就好象死了一样,没有反映了。我怎么办?

解决方案 »

  1.   

    再说一下,数据库操作也在TRYFINALLY中进行!!
      

  2.   

    你可以考虑以下的方法:
    1、不要一次获取太多的数据40万条。就是400条人处理还需要很长的时间,所以你每次最好处理一小部分数据。
    2、如果操作的数据与前台没有交互,那么使用存储过程处理,这样可以充分利用服务器的资源。
    3、如果想前台有响应,你可以考虑使用多线程操作数据库,这样你的前台就不会没有相应了。
    4、如果操作频率很标准,最好通过服务器端机型处理。在中可以内建的JOB功能让数据库自动去完成操作,根本不需要人为干预,不知道SQL Server中有没有类似的功能。
    5、如果表的记录总在不但的增加中,那么最好定期重构索引,这样也能提高效率。
      

  3.   

    我发现主要是在执行ADOQUERY.OPEN时,由于数据量大,一直在查询,等待的时间比较长,因此导致程序无法响应,我想有没有办法在这段时间对前端界面进行重画!
      

  4.   

    同意Delphi_Li的说法,不要一次取太多数据!
    但如果你一定要这样做的话,我有两种方法:
    1.用多线程去完成操作(如果你特别需要的话)
    2.在作AdoQuery.Open之前让应用程序交出控制权(Application.HandleMessage),处理完费时的操作后再归还控制权(Application.ProcessMessage)
      

  5.   

    rocinsky(独酒) 的方法不错,我觉得最好还是使用多线程的方法。
    注意数据同步的问题。
      

  6.   

    谢谢各位了,rocinsky(独酒)的方法我试过了,好象不太灵,线程小弟暂时还没用过,还不太会用,我也想用这个方法,不知有无资料可以借鉴一下!!!
      

  7.   

    谢谢各位了,rocinsky(独酒)的方法我试过了,好象不太灵,线程小弟暂时还没用过,还不太会用,我也想用这个方法,不知有无资料可以借鉴一下!!!
      

  8.   

    向你这样的程序,存储过程是比较合理的
    他能节省时间
    速度能提高一些
    你也可以用一些加速语句
    比如
    with等