写程序将几十万条数据从SQL Server导出成文本文件我用的是最古老的方法,用ADOQuery打开数据集,然后循环写入TXT文件中,效率特别低:
while not qr.Eof do
begin
  …………
  Writeln(……);
  qr.Next;
  …………
end;
在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
而且我发现,速度慢和写文件没有关系,我把 WriteLN 函数注释掉,让这个循环空转,耗费的时间是差不多的。我用 smexport  控件做了测试,比我的快了五六倍,研究了一下它的源码,发现它用的方法和我的差不多,
但不知为何会快那么多。百思不得其解。如果谁想要这个控件,可以把邮箱留在下面。PS:不要建议我使用SQL Server自带的导出功能或者使用第三方控件。

解决方案 »

  1.   

    1. 
    ADOQuery的屬性設為ltReadOnly2. 
    在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
    ---------------------------------------
    那就分多次取,每次取幾萬條記錄.3.
    狠一點,再考慮多線程,每個線程一個文件,寫完後,全部放一個文件就好了.
      

  2.   

    *******ADOQuery的屬性設為ltReadOnly 
    尝试过了, 不行
    *********在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
    不知如何实现每次取几万条,再去用分页算法??好像没必要。 smexport 控件没这样做,一样很快。
    **********狠一點,再考慮多線程,每個線程一個文件,寫完後,全部放一個文件就好了. 
    我觉得没必要,  smexport     控件根本就没这么做,速度照样很快。
      

  3.   

    将ADOQuery的CursorType属性设为ctOpenForwardOnly,LockType属性设为ltOptimistic试一下呢?
      

  4.   

    发一个我看一下效果什么样?前几天好象看到谁也是导数据慢,,研究一下,谢谢[email protected]
      

  5.   

    TO  chris_mao : 
    这些方法都试过了,速度没有变化,还是那么慢。
    TO WANGXUELLD :已经把控件发送给你。
      

  6.   

    把那个控件发我看看呢,很想知道其中的奥秘。
    chris.mao.zb#163.com
      

  7.   

    改用Interface吧,放弃VCL封装的ADO组件,直接操作ADO,如果慢,那是MS的问题了
      

  8.   


      呵呵  我也想要 
      [email protected]
      

  9.   

    用 dbExpress 看看,Borland 自己的数据库存储引擎,比 ADO 猛很多...
      

  10.   

       1. DisableControls  
        2. ReadOnly
       3.写一个类,用List来实现导出,像DBGridToExcel差不多的方法
       (一定得先把数据放在List里(内存要求高))
      4.TStringList.SaveAs()(UTF-8)像XML一样保存;
      5.EnableControls
       6.List.clear List.Free
        再不行就来多线程或者加入几个Time
        
      

  11.   


    问题已经解决。在循环导出数据前,调用 ADOQuery.DisableControl 即可,速度超快,10万条数据用了5秒钟导出。没有使用多线程。我是每1000条数据写一次文件的。先用个TSringList对象缓存起来,凑够1000条数据就写到TXT文件里去。
      

  12.   

    补充一下,smexport 控件也是这么做的,速度还可以。楼上留了邮件的,已经把控件发给你们了。楼下的不要再留邮件了,奥秘已经找到了。