ADO的异步执行方式

转载 2004年07月22日 17:15:00

     当A D O开始处理数据后,应用程序必须等到A D O处理完毕之后才可以继续执行。但
是除了同步执行方式之外, A D O也提供了异步执行的方式,允许当A D O处理时,
应用程序仍然能够先继续执行。而当A D O处理数据完毕之后, A D O会以事件的方
式通知应用程序,此时应用程序可以再根据A D O执行的结果来采取相应的动作。
使用异步执行方式有许多用途,例如,如果应用程序需要处理花费大量时间的动
作,那么A D O可以选择以异步执行方式让A D O在后台执行,而让应用程序继续处
理图形用户接口或用户输入的数据。
在A D O中使用异步执行方式非常简单,只需要对A D O数据集的E x e c u t e O p t i o n s
属性值进行适当的设定即可。现在就让我们以一实际的范例应用程序来说明如何让
A D O以异步的方式来处理数据。
下载
1) 在D e l p h i集成开发环境中关闭所有的项目。
2) 建立一个新的应用程序项目,在主窗体中放入TA D O C o n n e c t i o n对象连接到
数据库。
3) 在主窗体中放入TA D O D a t a S e t组件。设定它的C o n n e c t i o n属性值为步骤2) 的
TA D O C o n n e c t i o n,并且在它的C o m m a n d Te x t属性值中使用Select * from ADOTe s t D a t a s
以取得所有的数据。再设定它的A c t i v e属性值为Tr u e以打开范例数据表。
4) 放入TDataSource组件,设定它的DataSet属性值为步骤3) 加入的TADODataSet
组件。
5) 放入T D B N a v i g a t o r和T D B G r i d组件,设定它们的D a t a S o u r c e组件为步骤4加
入的T D a t a S o u r c e组件。
6) 在主窗体中放入两个T B u t t o n组件以及一个T P r o g r e s s B a r组件,并且设定它
的相关属性值。此时主窗体如图3 - 1 2所示。
图3-12 范例应用程序的主窗体
7) 最后在主窗体中放入一个TA D O C o m m a n d组件。设定它的C o n n e c t i o n属性
值为步骤2) 的TA D O C o n n e c t i o n,并且在它的C o m m a n d Te x t属性值中使用S e l e c t
count(*) from ADOTe s t D a t a s以便从A D O Te s t D a t a s数据表中取得所有数据的笔数。
8) 在主窗体的O n A c t i v a t e事件处理程序中撰写如下的程序代码:
第3章撰写使用A D O技术的应用系统(二) 1 1 1
下载
p r o c e d u r e TForm1.FormActivate(Sender: TObject);
v a r
sRecNo : String;
b e g i n
ProgressBar1.Max := ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo := IntToStr(ProgressBar1.Max);
Self.Caption := '共有' + sRecNo + ' 笔数据' ;
e n d ;
O n A c t i v a t e事件处理程序首先执行TA D O C m m a n d的S Q L命令,并且从它回传
的暂时R e c o r d s e t对象中取出A D O Te s t D a t a s数据表中所有数据的笔数,然后再指定
给T P r o g r e s s B a r的M a x值,最后指定给窗体的C a p t i o n属性值。
9) 双击窗体中的e o A s y n c F e t c h N o n B l o c k i n g按钮,并且在它的O n C l i c k事件处
理程序中撰写如下的程序代码:
p r o c e d u r e TForm1.Button2Click(Sender: TObject);
b e g i n
t r y
ADODataSet1.Active := False;
ADODataSet1.ExecuteOptions := [eoAsyncFetchNonBlocking];
f i n a l l y
lStart := GetTickCount;
ADODataSet1.Active := True;
e n d ;
e n d ;
在上面的程序代码中先关闭步骤3) 的TA D O D a t a S e t,再设定它的E x e c u t e O p t i o n s
属性值为使用异步方式来存取数据。最后再打开步骤3) 的TA D O D a t a S e t组件,从
A D O Te s t D a t a s数据表中取得数据。
10) 双击窗体中的e o A s y n c F e t c h按钮,并且在它的O n C l i c k事件处理程序中撰
写如下的程序代码:
p r o c e d u r e TForm1.Button1Click(Sender: TObject);
b e g i n
t r y
ADODataSet1.Active := False;
ADODataSet1.ExecuteOptions := [eoAsyncFetch];
f i n a l l y
lStart := GetTickCount;
1 1 2 Delphi 5.x ADO/MTS/COM+高级程序设计篇
下载
ADODataSet1.Active := True;
e n d ;
e n d ;
在上面的程序代码中先关闭步骤3) 的TA D O D a t a S e t,再设定它的E x e c u t e O p t i o n s
属性值为使用同步方式来存取数据,再打开步骤3) 的TA D O D a t a S e t组件,从
A D O Te s t D a t a s数据表中取得数据。
在异步方式中, A D O会以O n F e t c h P r o g r e s s事件来通知应用程序A D O还在处理
数据之中,并且以O n F e t c h C o m p l e t e事件来通知应用程序A D O已经处理数据完毕了。
程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范
例应用程序在这两个事件处理程序中实现的程序代码。
11) 在步骤3) 的TA D O D a t a S e t组件的O n F e t c h P r o g r e s s事件处理程序中撰写如下
的程序代码:
p r o c e d u r e TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; v a r EventStatus: TEventStatus);
b e g i n
ProgressBar1.Position := Progress;
e n d ;
上面的程序代码只是在A D O持续处理数据时不断更新主窗体中T P r o g r e s s B a s e
的显示状态。
12) 在步骤3) 的TA D O D a t a S e t组件的O n F e t c h C o m p l e t e事件处理程序中撰写如
下的程序代码:
p r o c e d u r e TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
c o n s t Error: Error; v a r EventStatus: TEventStatus);
b e g i n
lEnd := GetTickCount;
S h o w M e s s a g e ( '总共花了' + FloatToStr((lEnd - lStart) / 1000.0) + ' 秒' ) ;
e n d ;
上面的程序代码是当A D O处理完数据之后便显示一个对话框,显示A D O处理
数据所花费的时间。
现在请编译并且执行这个范例应用程序。图3 - 1 3是以异步的方式来存取
A D O Te s t D a t a s这个范例数据表中数据的画面。从图中可以看到,当A D O存取数据
第3章撰写使用A D O技术的应用系统(二) 1 1 3
下载
时应用程序仍然可以不断地更新主窗体中的T p r o g r e s s B a r。如果使用同步的方式执
行,T P r o g r e s s B a r便无法这样更新状态。此时我们也可以移动主窗体的位置等,可
见应用程序不会因为A D O在存取大量的数据而造成应用程序无法继续工作。
图3-13 范例应用程序以异步方式执行的画面
图3 - 1 4是当A D O处理数据完毕并且触发O n F e t c h C o m p l e t e事件处理程序时显示的
画面。从这两个画面中我们可以看到,当A D O以异步的方式执行时,O n F e t c h P r o g r e s s
和O n F e t c h C o m p l e t e事件可以帮助程序员取得非常有用的状态信息。
图3-14 范例应用程序以异步方式执行的画面

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

VS与MySQL通过ADO方式连接

1.下载好MySQL之后,安装开发员的版本,用命令行在数据库test下建立表st并插入了两条记录,然后OBDC添加用户、系统DSN 驱动程序是MySQL OBDC 5.3 ANSI Driver ...
  • BCD_not_CBD
  • BCD_not_CBD
  • 2015年08月29日 08:45
  • 742

异步调用四大方法

C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方...
  • jackthj
  • jackthj
  • 2016年02月29日 13:38
  • 1865

C#异步调用四大方法详解

C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方...
  • bfboys
  • bfboys
  • 2016年10月05日 10:18
  • 1354

ADO读取Excel的简单例子

一、简单说明: 工程名字ADO_Excel,类型是console app, 非empty有预编译头stdafx.h。 编译说明: 1.确保C盘下面路径有msado15.dll,没有安装office2...
  • Blues1021
  • Blues1021
  • 2015年02月04日 12:14
  • 6053

ADO方式连接数据库

ADO方式连接数据库分为如下步骤: 1.ADO对象的导入 在使用ADO技术时需要导入一个ADO动态链接库msado15.dll。该动态库位于系统盘下的"Program Files\Common Fil...
  • hola_f
  • hola_f
  • 2016年08月03日 16:32
  • 2873

C++ ADO方式连接mysql数据库

对于软件开发其实说白了就是在不停地和数据打交道, 所以数据库的操作是必不可少的, 接下来介绍VC开发中利用ADO建立ODBC数据源来访问MySQL数据库.        从我接触的数据库编程方式来说,...
  • lbcab
  • lbcab
  • 2016年05月06日 10:02
  • 4080

代码分析ADO.NET数据异步处理

http://developer.51cto.com/art/200911/160714.htm 为你解析ADO.NET应用程序 归纳总结ADO.NET对象 学习笔记:教你使用ADO.NET...
  • mituan1234567
  • mituan1234567
  • 2014年03月05日 15:51
  • 442

ADO对象之Connection用法总结

Connection对象的属性有如下几个: 1.ConnectionString:是连接字符串,通过传递包含一系列由分号分隔的“argument=value”语句的详细连接字符串,可指定用于建立连接...
  • hfchenle
  • hfchenle
  • 2016年07月05日 16:49
  • 152

iOS-GCD学习之同步异步线程去执行串行操作

今天碰到一个需求,在网上找了一下资料,不得不感叹GCD之强大实用。 队列:串行队列,并行队列,全局队列,主队列 //串行队列 同步执行任务 会在当前线程内执行 ...
  • Axing1991
  • Axing1991
  • 2016年09月05日 18:42
  • 1932

C#执行异步操作的几种方式比较和总结

原文地址:http://www.cnblogs.com/durow/p/4826653.html 转载此文的目的就是想让自己记住曾经寻找过这些资料 感谢这位博主的无私奉献 0x0...
  • shipeng22022
  • shipeng22022
  • 2017年02月24日 15:06
  • 653
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ADO的异步执行方式
举报原因:
原因补充:

(最多只允许输入30个字)