能否边查询,边显示?

lzg827 2010-01-07 09:16:03
我这边软件使用的是三层结构,大数据量查询的时候,效率不理想,并且“死机”,白屏。

我想实现的功能是将大数据量的查询分解为若干小的查询。用多线程进行。最后汇总为一个数据集。

目前基本功能已经实现,但有一点不足:全部数据装载到ClentdataSet后,才显示数据。
这个过程大概有几秒(数据量大的时候)。
既然已经是多线程查询了,能否边查询,边显示?
顶者有分啊
...全文
234 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄土大风 2011-01-13
  • 打赏
  • 举报
回复
猛然发现,我回复的这个贴子已经事隔一年了,
黄土大风 2011-01-13
  • 打赏
  • 举报
回复
总结:当gridView需要加载大数据量的记录时UI会因为等侍数据获取而死掉。
解决办法:另起一个线程用dataread填充dataTable 然后在主线程中设置数据源为这个dataTable。这样就实现了当数据量大的时候 数据像SQL2005一样一行一行的加载,就不至于UI死掉了。
annabellaip 2010-01-13
  • 打赏
  • 举报
回复
可以在循环中加入Application.ProcessMessages;
就像这样
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 999999 do
begin
Canvas.TextOut(10, 10, IntToStr(i));
Application.ProcessMessages;
end;
end;

譬如: 运行中你拖动窗体, 循环会暂停下来...
ahjoe 2010-01-13
  • 打赏
  • 举报
回复
不要太柯求,显示个“查询中,请稍等”吧,一般人还是等得了几秒钟的
wxsan 2010-01-13
  • 打赏
  • 举报
回复
数据查询,时间大致花在一下几点:

1、服务端查询时间;
2、数据传输时间;
3、客户端数据集装载时间;

首先,第二点:数据传输时间基本上受制于网络,除非你考虑压缩传输及其他高效方法,但基本上收效不大;
其次,服务端的查询时间,这个千万不要忽略,在大数据量情况下,查询设置尤其重要;举个例子:服务端
有个AdoQuery,只使用它进行查询而不更新数据,则可以进行以下设置,则速度可以成倍提高:
AdoQuery.CursorLocation := clUseServer;
AdoQuery.CursorType := ctOpenForwardOnly;
AdoQuery.LockType := ltReadOnly;
AdoQuery.EnableBCD := True;

再次,使用clientdataset数据集装载数据,如果数据量比较大,从数据转化为记录还是需要一定的时间的;

从上面3点可以看到,最好优化的就是服务端的查询,其他2点可能你费很大力气也很难提高多少的;
lzg827 2010-01-13
  • 打赏
  • 举报
回复
TO wxsan
大侠,你说的这几个设置后貌似效率有很大的不同。
能否详细讲讲这几个的意义,我找了很多地方都说的不明白。
另外,AdoQuery.CursorLocation := clUseServer; 这个我如果在两层中用,在第一次运行时,clUseServer比clUseClient反而慢很多,是为什么呢?
AdoQuery.CursorType := ctOpenForwardOnly; 是不是只能支持有主键的数据集?CursorType里面其他几个属性又是什么意思呢?


lzg827 2010-01-12
  • 打赏
  • 举报
回复
TO fenshm
你好,谢谢的关注
能否再详细点,特别是关于你说的“数据集控件”到底做什么样的事情。
最好来点例子和代码,o(∩_∩)o...
7年 2010-01-12
  • 打赏
  • 举报
回复
弄个进程条咋样
zxf52 2010-01-12
  • 打赏
  • 举报
回复
有2个办法,嘿嘿

1.就是捕获你向下滑动的消息,当你譬如点滚动轴的时候,这时候计算现在的id,后台用select top 100 where id > _id的方法。。。这样每次显示100个,每次要向下时,后台马上再取数据。。。
2.你分页显示,嘿嘿。每页就100条,就算100万条记录,你都很快,嘿嘿
lzg827 2010-01-11
  • 打赏
  • 举报
回复
兄弟们,汹涌乱入啊。
fenshm 2010-01-11
  • 打赏
  • 举报
回复
大量查询数据的时候
可以多取几个条件啊、像月份查询、分查询等。
还有都已经用3层了,建议写个数据集控件,功能数据承载能力都更强。(:
lzg827 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 luckyrandom 的回复:]
三层没玩过。。两层有异步,那就是你所需要的
[/Quote]

To luckyrandom
谢谢你的关注
能否再说详细点,即使是在两层里面。
Harryfin 2010-01-08
  • 打赏
  • 举报
回复
是通过packetrecords,试试具体效果怎样
Q315054403 2010-01-08
  • 打赏
  • 举报
回复
三层没玩过。。两层有异步,那就是你所需要的
dd_zhouqian 2010-01-08
  • 打赏
  • 举报
回复
是不是通过设置packetrecord来控制?
lzg827 2010-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huangheguyun 的回复:]
学习中
[/Quote]

Harryfin:
可否详细说说,来段代码看看。
kfcoffe 2010-01-08
  • 打赏
  • 举报
回复
mark
chdaner 2010-01-08
  • 打赏
  • 举报
回复
关注中
Harryfin 2010-01-08
  • 打赏
  • 举报
回复
“貌似增量获取数据的”改为“貌似可以增量获取数据的”
Harryfin 2010-01-08
  • 打赏
  • 举报
回复
clientdataset貌似增量获取数据的,这样就能满足你的需求了
加载更多回复(3)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧