使用 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