`

如何使用 ADO 的非同步執行

阅读更多
FetchProgressFetchComplete 事件用于监视的一个记录加载,当异步加载记录集。

FetchProgress 事件可为您提供对记录集可用于向用户显示进度指示器的当前状态的信息。

完成记录集时激发 FetchComplete 事件加载。

更多信息
系统必备组件软件要求 FetchProgress 和 FetchComplete 事件在 MDAC 2.5 或更高版本中只工作正常。 您可以从下面的 Micro...

 

系统必备组件

软件要求
  • FetchProgressFetchComplete 事件在 MDAC 2.5 或更高版本中只工作正常。 您可以从下面的 Microsoft 网站下载最新版本的 Microsoft 数据访问组件:
    Microsoft Data Access Components (http://msdn.microsoft.com/library/default.asp?url=/downloads/list/dataaccess.asp)
  • 如果您正在开发中 Microsoft Visual Studio 6.0 应用程序,您必须具有 service pack 3 或更高版本已安装。 您可以安装最新的 service pack,Microsoft Visual Studio 6.0 为从下面的 Microsoft 网站:
    Visual Studio Product Updates (http://msdn.microsoft.com/vstudio/downloads/updates.asp)

编码要求

  • 当您打开记录集时,您必须为记录集选项指定 adAsyncFetch
  • 您必须使用客户端游标,因为由 ActiveX 数据对象 (ADO) 客户端游标引擎返回 FetchProgressFetchComplete 事件。
  • 在 Visual Basic 必须声明在模块级别用 WithEvents 关键字使用 Dim Recordset。

属性

有两个影响 ADO 的异步行为的记录集属性。 应能打开记录集之前设置这些属性。

  • 提取的初始大小 决定之前创建异步线程同步被提取多少条记录。 这允许小型的记录集,以创建无需创建一个线程的额外开销。 默认情况下,这是设置为 50。 若要保证称为 FetchProgressFetchComplete,请将此值设置为 0。
  • 背景抓取大小 确定多少条记录被提取到 FetchProgress 事件调用之间。 默认情况下,这是设置为 15。

事件

FetchProgress

FetchProgress 具有四个参数:

  • 进度 是当前记录集中的记录数。

    第一次调用 FetchProgress,进度是等于初始提取大小加上背景抓取的大小。 对于每个附加的调用进度等于以前的值加上背景抓取大小。
  • MaxProgress 是要返回预期的最大值。

    MaxProgress 不等于实际将返回的记录数。 ADO 具有提取记录以获取此值。 这意味着 MaxProgress 以往任何时候都只是最佳猜测。 MaxProgress 通常等于进度加上背景抓取的大小。

    FetchProgess 始终调用 FetchComplete 之前调用。 在这种情况下进度和 MaxProgress 是为彼此相等。 此 MaxProgress 等于实际的检索的记录数。
  • adStatus 的值确定是否发生了任何错误。 此值通常是 adStatusOK

    您可能会通过 adStatus 的值设置为值 adStatusUnwantedEvent 禁用 FetchProgress 事件。
  • pRecordset 是对该记录集本身的引用。

FetchComplete

FetchComplete 具有三个参数:

  • 如果 adStatus adStatusErrorsOccurred,您可以检查以确定发生了什么错误 pError。 如果您的代码调用 Cancel 方法执行查询之前,可能会发生这种情况例如执行。
  • adStatus 的值确定是否发生了任何错误。

    您可能会通过 adStatus 的值设置为值 adStatusUnwantedEvent 禁用 FetchComplete 事件。
  • pRecordset 是对该记录集本身的引用。

示例代码

下面的示例演示如何使用 Visual Basic 中的 FetchProgressFetchComplete 事件。

该示例使用名为 Pubs 一个 ODBC 数据源连接到附带 SQL Server 的 Pubs 数据库。

  1. 在 Microsoft Visual Basic,创建新的 标准 EXE。 默认情况下,Form1 添加到项目。
  2. 项目 菜单上单击选择 引用,然后选择 Microsoft ActiveX 数据对象库
  3. 项目 菜单上单击以选择 组件,然后选择 Microsoft DataGrid 控件 6.0 (OLEDB)
  4. 将一个 DataGrid、 一个 文本框 中和 命令按钮 拖到 Form1 上。
  5. 下面的代码添加到 Form1 的 代码 窗口:
       Option Explicit
    
       Const strConn = "DSN=Pubs"
       Const strDefaultSQL = "SELECT * FROM Titles"
     
       Dim cn As ADODB.Connection
       Dim WithEvents rs As ADODB.Recordset
    
       Private Sub Form_Load()
          Command1.Caption = "Go"   
          Text1.Text = strDefaultSQL
       
          Set cn = New ADODB.Connection
          cn.Open strConn
       End Sub
    
       Private Sub Command1_Click()
          Dim strSQL As String
          strSQL = Text1.Text
       
          Set rs = New ADODB.Recordset
          With rs
             .CursorLocation = adUseClient
          
             .Properties("Initial Fetch Size") = 2
             .Properties("Background Fetch Size") = 4
          
             Debug.Print "Start"
             Debug.Print "Initial Fetch Size: " & _
                         .Properties("Initial Fetch Size")
             Debug.Print "Background Fetch Size" & _
                         .Properties("Background Fetch Size")
          
             .Open strSQL, cn, , , adAsyncFetch
          End With
       End Sub
    
       Private Sub rs_FetchProgress(ByVal Progress As Long, _
                                    ByVal MaxProgress As Long, _
                                    adStatus As ADODB.EventStatusEnum, _
                                    ByVal pRecordset As ADODB.Recordset)
                                    
          Debug.Print "Fetch: " & Progress & _
                      "  Max: " & MaxProgress
          
       End Sub
    
       Private Sub rs_FetchComplete(ByVal pError As ADODB.Error, _
                                    adStatus As ADODB.EventStatusEnum, _
                                    ByVal pRecordset As ADODB.Recordset)
                                 
          If adStatus <> adStatusOK Then
             Debug.Print "Failed"
             Debug.Print "Error: " & pError.Number & " - " & pError.Description
          Else
             Set DataGrid1.DataSource = pRecordset
             Debug.Print "Done"
          End If
       
       End Sub
    					
  6. strConn 改为您的数据库有效的连接字符串和 strDefaultSQL 更改为有效的 SQL 查询从数据库返回的记录。
  7. 运行代码。 单击 搜索 按钮开始读取记录集。 在 视图 菜单上单击以选择 即时 窗口。 Visual Basic 立即窗口显示异步查询的进度。

*********************************************************

试了不行

下面的行

 

' WithEvents 關鍵字宣告物件類別的變數。
'
引發事件的物件稱作事件來源 (event source),來處理事件來源所引發的事件。
' WithEvnets
用來對應 ActiveX 物件所引發的事件。僅適用於物件類別模組。
'
您可以用 WithEvents 來個別宣告變數,但不可用來建立陣列,也不可與 New 同時使用。

Dim WithEvents cn As ADODB.Connection
Dim WithEvents Recordset
物件 As ADODB.Recordset

Private Sub cn_ConnectComplete(ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pConnection As ADODB.Connection)
'
資料庫連線建立完成會觸發 ConnectComplete 事件
End Sub

Private Sub cn_Disconnect(adStatus As ADODB.EventStatusEnum, _
ByVal pConnection As ADODB.Connection)
'
中斷資料庫連線會觸發 Disconnect 事件
End Sub

Private Sub cn_ExecuteComplete(ByVal RecordsAffected As Long, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pCommand As ADODB.Command, _
ByVal pRecordset As ADODB.Recordset, _
ByVal pConnection As ADODB.Connection)
'
Connnection 物件使用 Execute 方法執行 SQL 命令完成時會觸發 ExecuteComplete 事件
End Sub

Private Sub Form_Load() ' 表單載入事件
OpenCN ' 開啟資料庫連線
End Sub

Private Sub OpenCN() ' 開啟資料庫連線 ; Connection 的非同步執行
Dim strCN As String
'
因為使用 WithEvents , 所以必須再使用 New 關鍵字來建立一個物件類別的新執行個體
Set cn = New ADODB.Connection

' 資料庫連線字串
strCN = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:/XXOO/ABC.mdb;Persist Security Info=False"

With cn
'CursorLocation
屬性 , 設定或傳回資料指標服務的位置‧
'adUseClient
使用本端資料指標程式庫所提供的用戶端資料指標‧
'
本端資料指標服務通常具備多項驅動程式之資料指標所沒有的功能,
'
因此,就可以啟動的功能而言,使用這個設定值有其優點‧對於往後追溯相容性,
'
同義字的 adUseClientBatch 也受支援‧
'adUseServer
預設值‧使用資料提供者或驅動程式提供者所提供的資料指標‧
'
這些指標有時候具有很大的彈性,可容許他人對資料源所做的變更‧
'
然而,Microsoft Client Cursor Provider (例如不相關的 Recordset) 的某些功能,
'
無法用伺服端的資料指標來模擬,因而在這個設定值下不能使用這些功能‧
.CursorLocation = adUseClient
'adConnectUnspecified (
預設值) 同步化建立連線。
'adAsyncConnect
非同步化建立連線。可以使用 ConnectComplete 事件來確定連線資料庫是否完成。
.Open strCN, , , adAsyncConnect
End With

'adStateClosed
資料庫連線狀態為關閉
'adStateOpen
資料庫連線狀態為開啟
Do Until cn.State = adStateOpen
' Do Loop
迴圈是為了等待資料庫連線建立完成
'
若無此迴圈 , 則程式將繼續往下執行 (資料庫連線會繼續非同步的執行建立),
' 而不等待資料庫的連線建立是否完成
DoEvents
Loop
End Sub

Private Sub OpenRS() '
開啟資料錄() ; Connection 的非同步執行
'
常數 說明
' adCmdText
表示提供者會將 Source 評估為指令的文字定義。
' AdCmdTable
表示 ADO 會產生一個 SQL 查詢,從 Source 中指定的資料表傳回所有資料列。
' AdCmdTableDirect
表示提供者會從 Source 中指定的資料表傳回所有資料列。
' AdCmdStoredProc
表示提供者會將 Source 評估為一個預存程序。
' AdCmdUnknown
表示 Source 引數中未知的指令類型。
' AdCmdFile
表示保留的 (已儲存的) Recordset 會從 Source 中指定的檔案還原。
' AdAsyncExecute
表示 Source 作非同步執行。
' AdAsyncFetch
表示在 Initial Fetch Size 屬性中指定的初始數量被抓取後,剩下的資料列就會被非同步地抓取。
'
如果所需的資料列未被抓取,則會凍傷主要的執行緒,直到取得所需的資料列。
' AdAsyncFetchNonBlocking
表示在抓取時,絕不凍結主執行緒。
'
如果未抓取到所需的資料列,則目前的資料列會自動移到檔案的尾端。
Set Recordset物件 = Connection物件.Execute(SQL語法, , adAsyncExecute)
Do Until Recordset
物件.State = 1 ' Recordset 的開啟(執行)狀態
DoEvents
Loop
End Sub

Private Sub Recordset物件_FetchComplete(ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
'
當非同步動作將所有的資料錄取至(傳入)Recordset 便會觸發此事件。
End Sub

分享到:
评论

相关推荐

    ado[1].net中文手册 学习 ado.net的重要资料

    执行命令:描述 ADO.NET Command 对象,并说明如何使用它来对数据源执行查询和命令。 使用 DataReader 检索数据:描述 ADO.NET DataReader 对象,并说明如何使用它从数据源返回结果流。 将存储过程用于命令:描述如何...

    ADO.NET本质论.pdf

    重点讨论了ado.net如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问api(包括ole db,ado,odbc和jdbc)的程序员,提供了帮助其迁移到ado.net许多易用的...

    ADO.NET 2.0技术内幕(高清 中文 带书签 全)

    执行查询,包括参数化查询和非同步查询,并获取结果;创建DataSet对象以处理脱机数据,并研究常用场景;使用Microsoft SQL Server 2005中新的公共语言运行时特性和XML数据类型;为简单和复杂的更新生成逻辑和使用...

    ado.net 中文手册(html)

    使用 ado.net 连接到数据源 执行命令 使用datareader检索数据 将存储过程用于命令 从数据库中获取单个值 从数据库中获取blob 值 执行数据库操作和修改数据 从sql server中以xml形式...

    ado连接池实例

     当多个线程更新相同的资源时,应使线程同步以避免冲突。  大多数访问VCL对象和更新窗体的方法必须从主VCL线程内部调用。  以下为创建和使用一个新线程的过程:  (1)单击File|New|Thread菜单项,创建一个...

    Access+2000中文版高级编程

    8.11 使用非常规的优化技术 232 8.11.1 性能调整的陷阱 232 8.11.2 诊断慢速查询 232 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 ...

    Access 2000中文版高级编程(part1)

    8.11 使用非常规的优化技术 232 8.11.1 性能调整的陷阱 232 8.11.2 诊断慢速查询 232 8.11.3 用查询设计网格以解决模糊字段的引用问题 233 8.12 使用分析器向导 233 8.12.1 表分析器向导 234 8.12.2 性能分析...

    Visual C++编程技巧精选500例.pdf

    180 如何使用事件对象同步进程? 181 如何在两个执行程序间进行数据通信? 182 如何使用工作线程? 183 如何正常终止线程? 184 如何异常终止线程? 185 如何获取线程退出码? 186 如何使用线程优先级? 187 如何使用用户...

    ASP.net技术内幕

    13.6 使用强类型的DataSet 13.7 小结 &lt;br/&gt;第14章 使用ADO.NET创建搜索页面 &lt;br/&gt;14.1 使用SQL Server全文搜索 14.1.1 配置Full-Text Search Service 14.1.2 对数据库数据执行任意...

    定时读取SQL文件执行入库程序

    因数据库同步太耗网络资源,同步数据不多可采取产生SQL同步的方式,这个小程序,可以定时读取指定SQL文件连接数据库并执行的功能,配合ftp下载或推送就可实现同步。 采用ADO方式连接,config.ini文件可设置连接字符...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    27.1 为何使用并行处理来执行多任务处理 550 27.2 在桌面应用程序中实现多任务处理 551 27.2.1 任务、线程和线程池 552 27.2.2 创建、运行和控制任务 553 27.2.3 使用task类实现并行处理 557 27.2.4 使用...

    ASP3《高级编程》(第一部分)

    14.3.1 配置的和非配置的组件 447 14.3.2 COM+类别 447 14.4 创建一个ASP COM组件 447 14.4.1 组件的接口 449 14.4.2 创建组件 449 14.5 小结 457 第15章 COM+应用程序 458 15.1 微软组件服务(COM+) 458 ...

    ASP3《高级编程》(第二部分)

    14.3.1 配置的和非配置的组件 447 14.3.2 COM+类别 447 14.4 创建一个ASP COM组件 447 14.4.1 组件的接口 449 14.4.2 创建组件 449 14.5 小结 457 第15章 COM+应用程序 458 15.1 微软组件服务(COM+) 458 ...

    Visual.C#2010从入门到精通

    20.2 使用ActiveX控件开发ADO应用程序 404 20.2.1 创建工程 404 20.2.2 添加ADO的ActiveX控件 405 20.2.3 添加DataGrid控件 406 20.2.4 运行程序 407 20.3 使用ADO对象控件开发应用程序 407 20.3.1 引入ADO库文件 ...

    ExcelVBA程序设计.doc

    6.使用ADO链接到ACCESS数据库 334 7.从EXCEL执行ACCESS任务 336 8.创建新ACCESS数据库 336 9.打开ACCESS窗体 338 10.打开ACCESS报表 343 11.运行ACCESS查询 345 12.运行选择查询 347 13.运行参数查询 348 14.调用...

    Excel_VBA教程

    6.使用ADO链接到ACCESS数据库 334 7.从EXCEL执行ACCESS任务 336 8.创建新ACCESS数据库 336 9.打开ACCESS窗体 338 10.打开ACCESS报表 343 11.运行ACCESS查询 345 12.运行选择查询 347 13.运行参数查询 348 14.调用...

Global site tag (gtag.js) - Google Analytics