ADO异步查询显示进度条

一般,ADO都是以同步的方式来处理数据。这就是说,当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行。但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时,应用程序仍然能够先继续执行。而当ADO处理数据完毕之后,ADO会以事件的方式通知应用程序,此时应用程序可以再根据ADO执行的结果来采取相应的动作。

使用异步执行方式有许多用途,例如,如果应用程序需要处理花费大量时间的动作,那么ADO可以选择以异步执行方式让ADO在后台执行,而让应用程序继续处理图形用户接口或用户输入的数据。

在ADO中使用异步执行方式非常简单,只需要对ADO数据集的ExecuteOptions属性值进行适当的设定即可。现在就让我们以一实际的范例应用程序来说明如何让ADO以异步的方式来处理数据。

1)在Delphi集成开发环境中关闭所有的项目。

2)建立一个新的应用程序项目,在主窗体中放入TADOConnection对象连接到数据库。

3)在主窗体中放入TADODataSet组件。设定它的Connection属性值为步骤2)的TADOConnection,并且在它的CommandText属性值中使用Select*fromADOTestDatas以取得所有的数据。再设定它的Active属性值为True以打开范例数据表。

4)放入TDataSource组件,设定它的DataSet属性值为步骤3)加入的TADODataSet组件。

5)放入TDBNavigator和TDBGrid组件,设定它们的DataSource组件为步骤4加入的TDataSource组件。

6)在主窗体中放入两个TButton组件以及一个TProgressBar组件,并且设定它的相关属性值。

7)最后在主窗体中放入一个TADOCommand组件。设定它的Connection属性值为步骤2)的TADOConnection,并且在它的CommandText属性值中使用Selectcount(*)fromADOTestDatas以便从ADOTestDatas数据表中取得所有数据的笔数。

8)在主窗体的OnActivate事件处理程序中撰写如下的程序代码:
procedureTForm1.FormActivate(Sender:TObject);
var
sRecNo:String;
begin
ProgressBar1.Max:=ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo:=IntToStr(ProgressBar1.Max);
Self.Caption:=‘共有‘+sRecNo+‘笔数据‘;
end;
OnActivate事件处理程序首先执行TADOCmmand的SQL命令,并且从它回传的暂时Recordset对象中取出ADOTestDatas数据表中所有数据的笔数,然后再指定给TProgressBar的Max值,最后指定给窗体的Caption属性值。

9)双击窗体中的eoAsyncFetchNonBlocking按钮,并且在它的OnClick事件处
理程序中撰写如下的程序代码:
procedureTForm1.Button2Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetchNonBlocking];
finally
lStart:=GetTickCount;
ADODataSet1.Active:=True;
end;
end;
在上面的程序代码中先关闭步骤3)的TADODataSet,再设定它的ExecuteOptions属性值为使用异步方式来存取数据。最后再打开步骤3)的TADODataSet组件,从ADOTestDatas数据表中取得数据。

10)双击窗体中的eoAsyncFetch按钮,并且在它的OnClick事件处理程序中撰
写如下的程序代码:
procedureTForm1.Button1Click(Sender:TObject);
begin
try
ADODataSet1.Active:=False;
ADODataSet1.ExecuteOptions:=[eoAsyncFetch];
finally
lStart:=GetTickCount;
ADODataSet1.Active:=True;
end;
end;
在上面的程序代码中先关闭步骤3)的TADODataSet,再设定它的ExecuteOptions属性值为使用同步方式来存取数据,再打开步骤3)的TADODataSet组件,从ADOTestDatas数据表中取得数据。

在异步方式中,ADO会以OnFetchProgress事件来通知应用程序ADO还在处理数据之中,并且以OnFetchComplete事件来通知应用程序ADO已经处理数据完毕了。
程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范例应用程序在这两个事件处理程序中实现的程序代码。

11)在步骤3)的TADODataSet组件的OnFetchProgress事件处理程序中撰写如下的程序代码:
procedureTForm1.ADODataSet1FetchProgress(DataSet:TCustomADODataSet;
Progress,MaxProgress:Integerv;arEventStatus:TEventStatus);
begin

//注意,每次循环的进度步距不是1,在这有可能是15,第一次提取的记录数量也很大,所以对于小数据量,没有意义
ProgressBar1.Position:=Progress;
end;
上面的程序代码只是在ADO持续处理数据时不断更新主窗体中TProgressBase
的显示状态。

12)在步骤3)的TADODataSet组件的OnFetchComplete事件处理程序中撰写如下的程序代码:
procedureTForm1.ADODataSet1FetchComplete(DataSet:TCustomADODataSet;
constError:Error;varEventStatus:TEventStatus);
begin
lEnd:=GetTickCount;
ShowMessage(‘总共花了‘+FloatToStr((lEnd-lStart)/1000.0)秒+‘‘);
end;
上面的程序代码是当ADO处理完数据之后便显示一个对话框,显示ADO处理数据所花费的时间。
现在请编译并且执行这个范例应用程序。图3-13是以异步的方式来存取ADOTestDatas这个范例数据表中数据的画面。从图中可以看到,当ADO存取数据时应用程序仍然可以不断地更新主窗体中的TprogressBar。如果使用同步的方式执
行,TProgressBar便无法这样更新状态。此时我们也可以移动主窗体的位置等,可见应用程序不会因为ADO在存取大量的数据而造成应用程序无法继续工作。

当ADO以异步的方式执行时,OnFetchProgress和OnFetchComplete事件可以帮助程序员取得非常有用的状态信息。

如果你也执行这个范例应用程序,那么可以比较一下当ADO在同步执行模式和异步执行模式中处理数据时哪一种模式比较有效率。可能你会惊讶地发现异步执行模式可以提供更好的执行效率

(邦畿千里,摘自李维《Delphi5.xADO/MTS/COM+高级程序设计篇》,并进行整理)

http://blog.csdn.net/shuaihj/article/details/3725786

时间: 2024-10-07 10:16:20

ADO异步查询显示进度条的相关文章

关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。

关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 界面上2个控件,一个按钮和一个进度条using System;using System.Threading;using System.Windows.Forms; namespace WindowsFormsApplication2{    public partial class Form1 :

winform 加载窗体时弹出另一个窗体并显示进度条的源码

winform 加载窗体时弹出另一个窗体并显示进度条的源码 //frmA: 源窗体 //------------------------------------------ //引用 using System.Threading; BackgroundWorker worker; public frmA() { InitializeComponent(); worker = new BackgroundWorker(); worker.DoWork += new DoWorkEventHandl

【CentOS】cp显示进度条

问题描述: 使用CentOS的cp时,对于大文件的拷贝或者mv,需要等待很长时间,现在需要显示cp或mv的进度 问题解决: Advanced copy 参考官网:http://beatex.org/web/advancedcopy.html 解决方法: 效果预览: [CentOS]cp显示进度条,码迷,mamicode.com

easyui datagrid控制显示进度条

实际项目中当我们在前台分页的时候需要控制datagrid加载数据时显示进度条,而datagrid默认只有在通过url方式加载数据时才显示进度条,以下代码是手动控制: 打开进度条: $('#searchAddrDg').datagrid('loading');//打开等待div 关闭进度条: $('#searchAddrDg').datagrid('loaded');//关闭loding进度条:

ProgressIndicator显示进度条以及一些文字信息

//ProgressIndicator可以显示进度条以及一些文字信息,不过这个属性一般都在cs文件中操作. private void PhoneApplicationPage_Loaded(object sender, System.Windows.RoutedEventArgs e) {     private Microsoft.Phone.Shell.ProgressIndicator _progressIndicator = new Microsoft.Phone.Shell.Progr

显示进度条

static void jindutiao_ZF(Args _args){ RunBaseProgress progress; integer i,j;; i = 10000; progress = new RunBaseProgress(1); progress.setCaption('进度');progress.setTotal(i); progress.updateInterval(1); while(j != i) { j =j+100; progress.setCount(j); pr

基于Jquery插件Uploadify实现实时显示进度条上传图片

网址:http://www.jb51.net/article/83811.htm 这篇文章主要介绍了基于Jquery插件Uploadify实现实时显示进度条上传图片的相关资料,感兴趣的小伙伴们可以参考一下 先了解了解Uploadify,具体内容如下 Uploadify是一个简单易用的多文件上传方案.作为一个Jquery插件,Uploadify使用简单,并具有高度的定制性. Uploadify特性: Uploadify简单说来,是基于Jquery的一款文件上传插件.它的功能特色总结如下: 1).支

VC下载文件显示进度条

VC下载文件显示进度条 逗比汪星人2009-09-18上传 by Koma http://blog.csd.net/wangningyu http://download.csdn.net/detail/wangningyu/1674247

Java Swing程序开发—右下角显示进度条

虽然自己不喜欢Java的GUI程序,但是工作原因,听从上级安排. 转入正题:这篇文章实现在桌面右下角显示一个进度条,显示当前程序运行的进度.而且鼠标能够拖动进度条.有需要的童鞋,可以直接拷贝代码过去使用! Java参考代码: import java.awt.Dimension; import java.awt.Insets; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.Mouse