DBGrid通常是通过与DataSource和Table或Query控件配合使用的。
MyDB.DB有7个文本字段,800万行。若显示已存在的MyDB.DB的内容,用以上的TDataSource+TDataSet+数据感知控件即可。以上是MyDB.DB中已有数据的情况,下面说一下MyDB.DB是空表的情况。请问如果200万条记录数据是在程序运行过程中的某个大循环中逐条算出来的。循环结束时就得到了一个200万×7的二位数组。
我现在要实现的目标是快速将生成的200万条记录在DBGridEh中显示出来(当然最后还是要添加到数据库的,但是可以酌情延后处理)。经过统计知道,生成这个200万×7的二位数组需要的时间是很少的,大约1秒。但是在循环过程中逐条添加记录到数据库需要很长的时间。所以采先把数据逐条写入数据库,然后再显示出来的方法似乎是行不通的。请问有没有什么办法充分利用已经得到的200万×7的二位数组的数据,将其快速显示在DBGrid中,或者快速添加到数据库中。就好像下面这样理想化实现DBGrid.数据来源:=二维数组

解决方案 »

  1.   

    DBX支持内存表。
    你可以使用TClientDataSet在内存模拟这个表,这就可以和DBGrid关联了,不过问题很明显:
    1.显示这200万条记录在DBGrid是个非常愚蠢的想法;不可能有人去完全看完,而且要考虑显示的开销,会很慢;
    2.这200万最终你还是要写入数据库,这个时间还是少不了,这才是最慢的地方。
      

  2.   

    to 楼上的朋友
    现实情况是这样,已知有某个彩票类商业软件实现以上功能,从生成数据到在DBGridEh显示只需要半秒就够了,就算加上添加到数据库的时间,总共大约也就2秒(1.4G 赛扬III,128M内存)。那人家是怎样做到的呢?显示这200万条记录在DBGrid中和显示100条记录在DBGrid中是没有什么不同的,因为不管记录有多少条,显示出来的只有可视部分的那几行,而在内存中生成200万条记录用不了半秒,占用几兆内存,谈不上什么大的开销。我想既然已有别人能够做到了,想必合诸位高手之力,应该做得更好才对。
      

  3.   

    不知道你用的什么数据库控件。
    我有一个表大约4000行(还涉及到子查询),用DBX连接,TSimpleDataSet 和 DBGrid 显示,
    当TSimpleDataSet的PacketRecords为-1 (读入全部数据)时,DBGrid显示出来大约要10s,
    当我把PacketRecords调整为100,不到1s 就行了。
    BDE,ADO都提供了这类的属性。另外,你还可以用TStringGrid来自己做显示,我想更容易满足你自己的要求(和数组关联)。
      

  4.   

    为什么不用ClientDataSet + DataSource + DBGrid
    本来ClientDataSet就是内存表啊!
      

  5.   

    楼主的描述近乎夸张
    ClientDataSet + DataSource + DBGrid吧
    先切断和DBGrid的关联
    生成数据后再关联上
      

  6.   

    我想那个彩票软件可能是用了多线程技术,用一个线程负责显示一小部分数据。在数据没有完全添加到数据库的时候,根据滚动条的位置生成一个对应DBGridEh可见的部分数据的临时数据集并与DBGridEh连接,随着滚动条位置的则改变不断修改临时数据集的内容并刷新显示。由于我不懂数据库的多线程编程,写出的程序总是运行了一会儿就中断,并且每次出错时已添加的记录数都是不同的。请问如果按这个思路(即用多线程),该如何写这个功能的代码?请给出代码。假设已经通过运算得到了这个200万×7的二维数组了。现在要把它在DBGridEh快速显示并在后台慢慢添加。要求能根据滚动条位置的改变快速显示对应的可视部分的数据(可能这时数据还没有添加的数据库,要用到二维数组中的数据了)