首先数据量很大。
使用TQuery控件存放sql查询的结果。自己用sql server查询,结果超过100万条记录,但是看了下TQuery.recordcount只有80多万条。
另外,我试着遍历Query,把每一条结果记录到一个文件中,发现到某一条记录时,报错:Temporary Table resource limit!

解决方案 »

  1.   

    使用BDE連接,看起來不論連接什麼類型的數據庫,都會產生臨時表,而這個臨時表本身可容納的大小是有限制的。建議採用分頁獲取數據。
      

  2.   

    To Avan_Lau:
    这个临时表是大小不可以调节吗?据说通过设置BDE参数可以提高数据查询效率
      

  3.   

    不知是否可調節,即使可調節,但不建議你一下取這麼多的數據出來。可以換成ADO連接避免此問題
      

  4.   

    楼主,遍历Query超过100万条记录速度是很慢的。
    建议
    1、 写日志,记录写到第几行记录出错。
    2、 有可能是写入的文件容量有限制。检查硬盘空间。
    3、 用ADOquery替换。
    4、 分段导出,用主键划分。如1到十万,十万到二十万试试。
      

  5.   

    这是个报表,我遍历Query记录到文件是为了测试 程序实际没有这个可以排除文件容量硬盘空间问题
    我认为问题是Avan_Lau所说的临时表大小限制
      

  6.   

    100W客户可以浏览完这100w条数据??就算非得浏览这100w条数据,为啥不分页呢?就是Query的结果集只返回当前页的数据。不用换组件,修改下源码,以分页方式读取数据。
      

  7.   

    To somemak:
    100万查询出来后经过计算筛选,报表呈现的就几千的样子(但是sql语句中不好直接进行这些筛选)。
    如何分页请指教!!我在程序中写:query.BLOCKREADSIZE := 50,0000; 貌似无效,这个值还是默认的0
      

  8.   

    实际上就是Query动态调用SQL Server的分页SQL语句而已呀
      

  9.   

    谢谢各位回答,要说明下:
    100w是SQL查询出来的必要的数据,客户看到的是经过筛选等处理后的几百几千条记录而已。
    数据库的表已经定下了,程序的写法,用的控件已经定下了,都不能改,这是个用了好多年的商业软件,不是说改就改的,涉及很多东西的。现在有bug只能是‘调整’。
    那个分页倒是挺可以的,但是基类里已经写死了,与数据库交互一次找出这100w的东西(这个我不能改)
    我最想知道的是有无办法改变bde临时表大小!!
      

  10.   

    你的基类把SQL语句都写死了??不会吧??
      

  11.   

    俺表述不明确,是说一次性从数据库找出100w数据,基类用Query控件与SQL交互一次获得,然后遍历Query数据集,这个方式在基类里面已经定了,所以用上述的分页,不好直接实现。现在我的解决办法是 Query的语句稍稍改动下,把这100W全SELECT ...100W... INTO ##temp,
    然后在循环过程中,每次取前50W到Query中,让它循环处理去,完了再取这样做对效率有些影响,但是临时表操作比硬盘I/O要快很多,所以估计也不会差太远吧,而且至少解决问题了 呵呵~~
    学了下分页sql,somemak兄,多谢!
      

  12.   

    其实在循环过程就可以做分页啦,可以省略select那100W条记录的操作
    1.先取出总的记录数(count)
    2.计算出分页的页数 :取整(总记录数/分页的记录数),有余数就再加1
    3.在循环过程中,每次取数到Query中,让它循环处理去,完了再取,循环的次数就是计算出来的那个分页的页数,这里要动态的写SQL分页语句
    例如:
    总记录数:100W,分页的记录数:10W,就要循环10次。
    第一次读取第1至10W记录,按需求处理
    第二次读取第10W+1至20W记录,按需求处理

    循环后,就得出你的最终结果集