使用 ADO 的非同步執行

使用 ADO 的非同步執行

如何使用 ADO 的非同步執行

' 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