VB 版 (精华区)

发信人: zxfsnow (希望的春天), 信区: VB
标  题: 深入ADO6
发信站: 哈工大紫丁香 (2000年06月05日12:36:26 星期一), 转信

发信人: ming (drwxr-x---), 信区: VB
标  题: 深入ADO(6)
发信站: 虎踞龙盘东南站 (Tue Nov  2 10:37:08 1999), 转信


异步获取和事件处理

  ADO 2。0也可以让你以这样的方式执行命令:即以异步方式获取数据。这发生在调用
Open方法的语法中。

  recordset.Open Source, ActiveConnection, CursorType, LockType, Option
s

  跟通常一样,Source参数被指定一个有效的SQL字符串(甚至可能是一个被存储的过
程的名字),一个先前被存储的文件的名字,或者是一个Command对象。Options参数限
定命令,并且可能影响提供者处理它的方式。特别是它可以设定值为adExecuteAsync或
adFethchAsync。adFetchAysnc意味着Source命令必须是以异步的方式执行,也就是说
,该方法是立即返回的并且提供者在操作结束时激活一个事件。就另一方面来说,adF
etchAsync使得第一块中的那些行被同步地取出(跟通常一样)。其大小由记录集中的
CacheSize属性中所存的值来决定。剩下的那些行被异步的载入。

  当一个软件以异步的方式运行时,平台应该提供一种方式使得用户知道它什么时候结
束。对于这问题有不同的实现方法,Platform SDK使用的是同步对象,Microsoft Int
ernet Explorer Remote Scripting使用的是回调函数。ADO选择的是第三种方法,也许
对RAD编程者来说是最合适的一种方法:事件。

  这当中有两类事件:与Connection对象相关的事件(ConnectionEvent接口)和属于R
ecordset对象的(RecordEvent接口)在许多情况下你的程序将会在特定的操作发生的
前后被通知。在一个操作发生后引发的事件总是伴随着一个Error对象用以描述操作的
结果。在操作前引发的事件使得你可以控制下一步的指令的参数。可能到达你的应用程
序的事件会太频繁。通过正确地设定一个事件的Status参数,你可以避免更进一步的通
知。

  WillChangeField cFields, Fields, adStatus, pRecordset

  CFields参数是在下一个Fields数组中的Field对象的数目。Fields包含着带有挂起的
变化的Field对象。相关的记录集是通过pRecordset参数维持的。adStatus是一个类型
EventStatusEnum对象,它的值通常设为adStatusOK。如果你不想再要这些通知。现将
它设为:

  Set adStatus = adStatusUnwantedEvent

  处理ADO事件可能是容易的,这将取决于你所使用的语言。如同你可能猜到的那样,
用Visual C++时你应该从库中得到连接指针并调用它的Advise方法。这要求你在你的代
码部分有相当大的编程量,但将给你提供很多灵活性。实际上,你可以定义一个简单的
处理多个对象引发的事件处理。另一方面,所有输出接口中的方法都必须被执行,即使
是用最简单的语句也行:

  return S_OK;

  与Visual C++相比,Visual Basic 和Visual J++就节省了你一些工作。特别是Visu
al Basic要求你为每个对象都写相应的事件处理,这是由于事件处理过程是基于名称的
。使用WithEvents关键字是在Visual Basic中获取事件的最好方法。(如果你用Visua
l C++的话,WithEvent所做的将比你用Visual C++实现的功能可能有些不同)

  Visual J++遵循的是略微有所不同的实现方法:它是源于Java语言的基于Listener的
事件模型。一般说来,你需要定义一个类执行输出接口并将这个类附在引发事件的类的
实例上。这是最底限度的要求。 通过对ADO 2。0内置的支持,WFC将它极大地简化了。
它用起来跟用Visual Basic一样简单,但远比Visual C++简单。

  ConnectionEventHandler handler = new

  ConnectionEventHandler(this,”onConnectComplete”);

  先前的片段在ConnectionEvent接口中定义了一个类以执行onConnectComplete事件。
接着你将如下的 “Listener”函数添加到对象的事件处理中。

  Connection conn = new Connection();

  conn.addOnConnectComplete(handler);

  于是,对于同样的一个事件你有了多个处理。

--

  每一刻都存在,不一样的精彩


--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:7.872毫秒