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.数据来源:=二维数组
MyDB.DB有7个文本字段,800万行。若显示已存在的MyDB.DB的内容,用以上的TDataSource+TDataSet+数据感知控件即可。以上是MyDB.DB中已有数据的情况,下面说一下MyDB.DB是空表的情况。请问如果200万条记录数据是在程序运行过程中的某个大循环中逐条算出来的。循环结束时就得到了一个200万×7的二位数组。
我现在要实现的目标是快速将生成的200万条记录在DBGridEh中显示出来(当然最后还是要添加到数据库的,但是可以酌情延后处理)。经过统计知道,生成这个200万×7的二位数组需要的时间是很少的,大约1秒。但是在循环过程中逐条添加记录到数据库需要很长的时间。所以采先把数据逐条写入数据库,然后再显示出来的方法似乎是行不通的。请问有没有什么办法充分利用已经得到的200万×7的二位数组的数据,将其快速显示在DBGrid中,或者快速添加到数据库中。就好像下面这样理想化实现DBGrid.数据来源:=二维数组
解决方案 »
- 菜鸟问题:Delphi中是否有平方或立方的函数?
- 如何在程序进行数据库操作的时候保持窗体的刷新,而不是跟程序死掉了一样?
- 请教全局变量
- 如何在Delphi程序中判断一个ActiveX控件是否已注册?
- olecontainer嵌入的EXCEL表格,如何读取选中单元格的值和行、列(主要针对合并的单元格)?
- getcomputername问题?
- 请高手指教vb和delphi的区别
- 解决就结贴,关于DBGRID显示数据问题?
- delphi6 中,在SQL Explorer中创立数据库,打开时被要求输入用户名和密码,但数据库建立时并没有设密码,这是怎么回事?
- 请问如何得到显示器分辩率
- 关于TStringGrid的简单问题
- 该学什么?
你可以使用TClientDataSet在内存模拟这个表,这就可以和DBGrid关联了,不过问题很明显:
1.显示这200万条记录在DBGrid是个非常愚蠢的想法;不可能有人去完全看完,而且要考虑显示的开销,会很慢;
2.这200万最终你还是要写入数据库,这个时间还是少不了,这才是最慢的地方。
现实情况是这样,已知有某个彩票类商业软件实现以上功能,从生成数据到在DBGridEh显示只需要半秒就够了,就算加上添加到数据库的时间,总共大约也就2秒(1.4G 赛扬III,128M内存)。那人家是怎样做到的呢?显示这200万条记录在DBGrid中和显示100条记录在DBGrid中是没有什么不同的,因为不管记录有多少条,显示出来的只有可视部分的那几行,而在内存中生成200万条记录用不了半秒,占用几兆内存,谈不上什么大的开销。我想既然已有别人能够做到了,想必合诸位高手之力,应该做得更好才对。
我有一个表大约4000行(还涉及到子查询),用DBX连接,TSimpleDataSet 和 DBGrid 显示,
当TSimpleDataSet的PacketRecords为-1 (读入全部数据)时,DBGrid显示出来大约要10s,
当我把PacketRecords调整为100,不到1s 就行了。
BDE,ADO都提供了这类的属性。另外,你还可以用TStringGrid来自己做显示,我想更容易满足你自己的要求(和数组关联)。
本来ClientDataSet就是内存表啊!
ClientDataSet + DataSource + DBGrid吧
先切断和DBGrid的关联
生成数据后再关联上