DBGrid是否可以支持显示非数据库形式的内存数据?(30分)

  • 主题发起人 主题发起人 TENTODBV
  • 开始时间 开始时间
T

TENTODBV

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGrid通常是通过与DataSource和Table或Query控件配合使用的。
MyDB.DB有7个文本字段,200万行。若显示已存在的MyDB.DB的内容,用以上的TDataSource+TDataSet+数据感知控件即可。

以上是MyDB.DB中已有数据的情况,下面说一下MyDB.DB是空表的情况。请问如果200万条记录数据是在程序运行过程中的某个大循环中逐条算出来的。循环结束时就得到了一个200万×7的二位数组。
我现在要实现的目标是快速将生成的200万条记录在DBGridEh中显示出来(当然最后还是要添加到数据库的,但是可以酌情延后处理)。经过统计知道,生成这个200万×7的二位数组需要的时间是很少的,大约1秒。但是在循环过程中逐条添加记录到数据库需要很长的时间。所以采先把数据逐条写入数据库,然后再显示出来的方法似乎是行不通的。

请问有没有什么办法充分利用已经得到的200万×7的二位数组的数据,将其快速显示在DBGrid中,或者快速添加到数据库中。就好像下面这样理想化实现

DBGrid.数据来源:=二维数组
 
你可以找个内存表呀,rxlib里就有
 
用TClientDateSet,
操作内存表,速度不会慢的
 
楼上能否给出示例代码?
我刚才装了RxLib 2.75,由于没有例子,MemTable不知道怎么用。
 
TClientDataSet+TDataSource+TDBGrid

在TClientDataSet中CreateDataSet,就可以建立内存表
 
to 117777
内存表如何使用?
 
......200万条记录在DBGridEh中显示出来...... 绝对无意义!!!
 
To 楼上的 SuperLeo
如果200万条记录在DBGridEh中显示只需要不到1秒,那么为什么不让它显示呢?而且由于我要提供“删除鼠标选定(多选)的若干行”操作,假如我要选择的是第3条和的190万条记录,如果不全部显示那如何实现呢。
不管记录有多少条,实际显示出来的只有对应表格控件的可视部分的那几条。不会增加什么开销的.我曾试过用类似StringGrid+滚动条这样的组合,把StringGrid行数设为恰好一页,通过计算滚动条滑块位置来绘制表格控件的可视部分来实现,是可以做到平滑滚动效果的。只是可惜没能处理好鼠标向下拖动引起翻页,或者是选取多个跨页的不连续的行块时如何记录所选行的序号。
 
同意SuperLeo的说法。如果真的有那么多的数据的话,不可能没有分类别、层次结构的,完全没有必要一下子显示这么多数据,毕竟还有不少人的机子速度承受不了。
 
我在学习数据库编程,找了一个彩票软件叫博奥的来参照,它速度很快,30选7分解后添加到paradox表并在DBGridEh中显示出来只需要半秒。我想知道怎样才能达到这样的速度。因为彩票各注间没有分类别、层次结构,所以要全显示出来。
我观察了一下,该软件30选7分解后在DBGridEh中显示出来只需要半秒,这时滚动条滑块滚动到最末。这时数据好像还没有存到paradox表中,因为这时paradox表大小没变,但是只要我把滚动条拖动到大约中间位置后(有一点延迟,需要大约1-2秒),数据应该就已存到paradox表中了,这从文件大小可以看出来。我想该软件可能是用了某种缓存技术。但是2秒就可以把200万条记录(该paradox表有8个字段,7个是号码字段,另一个是标记字段,都是字符型字段)添加到paradox也算极快了。究竟是怎样实现的呢?
 
这个例子只要10秒左右的时间
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'Field1';
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 10;
Name := 'Field2';
end;
with IndexDefs.AddIndexDef do
begin
Fields := 'Field1';
Name := 'IntIndex';

end;
CreateDataSet;
for i:=1 to 20000 do
begin
ClientDataSet1.Insert;
ClientDataSet1.FieldByName('Field1').AsInteger :=i;
ClientDataSet1.FieldByName('Field2').AsString :=IntToStr(i);
ClientDataSet1.Post;
end;
end;

end;
 
经测试楼上的代码并不算快,我把for 循环中所有的语句改为一行
ClientDataSet1.AppendRecord([i,IntToStr(i)]);
运行测试,用时为1.96妙,但是请注意这仅仅是2万条记录,每个记录才两个字段的情况。这和添加200万条记录(8个字段)仅需2秒相差太远了!
 
这么快,我用Access 数据库显示 8000 多条记录
第一次用了 8秒,
第二次用了 3秒。
 
你把200万行都添加到Grid中除了能测试机器、算法性能外还有其他什么意义?

客户能看200行就不错了。
 
我愿意出50分求一段完整的代码(只要这个功能实现)

帖子在这里,给出就揭帖:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2276414

或者致信:
archonwang@126.com
收到也揭帖!
 
"你把200万行都添加到Grid中除了能测试机器、算法性能外还有其他什么意义?"
觉得没有意义可能是由于你做不到,或者你认为不可能做到,或者是虽然能做到但是代价太大。因为用一般的常见的方法要达到这样的效果的确不可想象。但是确实有人做到了,并且系统开销并不大(就算开销大点,能有这样的效果我也认为值得)。
“你把200万行都添加到Grid中除了能测试机器、算法性能外还有其他什么意义?”退一步说,就算是测试机器、算法性能,能达到这样快速度的算法,贴出来也是很有意义的。
 
记得有这样的故事,火车刚发明的时候速度还很慢,比马慢多了,遭到了不少人的讥笑。可是现在呢?面对第一台电子计算机那样庞然大物,有谁会想到它会发展到今天这样先进?
 
查询的操作不会很慢,但是显示。。。。噩梦
这是不可能有什么好结果的操作
如果还有并发,当有多个用户同时向服务器提交200W数据的时候,估计从服务器到客户机全部都跨了
 
to TENTODBV
1、显示部分:根据你的要求将200 x 7 的二维整型数组显示在StringGrid中,我用时 = 0.5秒。但是,大概前面110万条记录,可以正确显示,过了110万后显示就不正确了,不知道是不是StringGrid不支持。
2、保存到数据库:你可以采用线程进行后台添加,我想你说的叫博奥彩票软件可能也是采用这种方法的。
因为根据你说的数据创建好,数据库没有变化,而过了一段时间后,数据就加到数据库中,所以我推断它是采用线程进行后台添加的。

>>我观察了一下,该软件30选7分解后在DBGridEh中显示出来只需要半秒,这时滚动条滑块>>滚动到最末。这时数据好像还没有存到paradox表中,因为这时paradox表大小没变,但是>>只要我把滚动条拖动到大约中间位置后(有一点延迟,需要大约1-2秒),数据应该就已存>>到paradox表中了,这从文件大小可以看出来。我想该软件可能是用了某种缓存技术。但>>是2秒就可以把200万条记录(该paradox表有8个字段,7个是号码字段,另一个是标记字>>段,都是字符型字段)添加到paradox也算极快了。究竟是怎样实现的呢?

 
to liuchengr
关于StringGrid的行数限制,我曾经问过,有网友做了回答
http://expert.csdn.net/Expert/topic/1942/1942102.xml?temp=.18211
 
后退
顶部