写程序将几十万条数据从SQL Server导出成文本文件我用的是最古老的方法,用ADOQuery打开数据集,然后循环写入TXT文件中,效率特别低:
while not qr.Eof do
begin
…………
Writeln(……);
qr.Next;
…………
end;
在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
而且我发现,速度慢和写文件没有关系,我把 WriteLN 函数注释掉,让这个循环空转,耗费的时间是差不多的。我用 smexport 控件做了测试,比我的快了五六倍,研究了一下它的源码,发现它用的方法和我的差不多,
但不知为何会快那么多。百思不得其解。如果谁想要这个控件,可以把邮箱留在下面。PS:不要建议我使用SQL Server自带的导出功能或者使用第三方控件。
while not qr.Eof do
begin
…………
Writeln(……);
qr.Next;
…………
end;
在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
而且我发现,速度慢和写文件没有关系,我把 WriteLN 函数注释掉,让这个循环空转,耗费的时间是差不多的。我用 smexport 控件做了测试,比我的快了五六倍,研究了一下它的源码,发现它用的方法和我的差不多,
但不知为何会快那么多。百思不得其解。如果谁想要这个控件,可以把邮箱留在下面。PS:不要建议我使用SQL Server自带的导出功能或者使用第三方控件。
ADOQuery的屬性設為ltReadOnly2.
在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
---------------------------------------
那就分多次取,每次取幾萬條記錄.3.
狠一點,再考慮多線程,每個線程一個文件,寫完後,全部放一個文件就好了.
尝试过了, 不行
*********在前几万条还可以,越往后越慢,最后一秒种只能导出几十条。
不知如何实现每次取几万条,再去用分页算法??好像没必要。 smexport 控件没这样做,一样很快。
**********狠一點,再考慮多線程,每個線程一個文件,寫完後,全部放一個文件就好了.
我觉得没必要, smexport 控件根本就没这么做,速度照样很快。
这些方法都试过了,速度没有变化,还是那么慢。
TO WANGXUELLD :已经把控件发送给你。
chris.mao.zb#163.com
呵呵 我也想要
[email protected]
2. ReadOnly
3.写一个类,用List来实现导出,像DBGridToExcel差不多的方法
(一定得先把数据放在List里(内存要求高))
4.TStringList.SaveAs()(UTF-8)像XML一样保存;
5.EnableControls
6.List.clear List.Free
再不行就来多线程或者加入几个Time
问题已经解决。在循环导出数据前,调用 ADOQuery.DisableControl 即可,速度超快,10万条数据用了5秒钟导出。没有使用多线程。我是每1000条数据写一次文件的。先用个TSringList对象缓存起来,凑够1000条数据就写到TXT文件里去。