ADO 教學課程

   

此教學課程教您使用 ADO 程式設計模式來查詢與更新資料來源。首先,教學課程會說明完成此工作所需的步驟。接著,教學課程是在 Microsoft Visual Basic 中重複; Microsoft Visual C++,產生 Visual C++ Extensions; and Microsoft Visual J++,產生 ADO for Windows Foundation Classes (ADO/WFC)。

由於以下兩項因素,此教學課程以不同的語言來撰寫程式碼:

教學課程的呈現方式

此教學課程是根據 ADO 程式設計模式。它個別討論程式設計的每個步驟。除此之外,它還以 Visual Basic 程式碼片段來說明每個步驟。最後,則重新說明並整合程式碼片段,成為一個 Visual Basic 範例。

程式碼範例會以其他語言來重覆表示,但不會有討論的資訊。在程式設計語言教學課程中的每個步驟,都標示程式設計模式與說明的教學課程中的相關步驟。請使用步驟的編號,來參照教學課程中的討論資訊。

由於此教學課程是由一些小的程式碼片段所組成,因此您無法執行課程中的這些程式碼。

ADO 程式設計模式說明如下。請利用它作為教學課程的藍圖。

ADO 物件程式設計模式

下一步   步驟 1: 開啟連線

步驟 1:開啟連接 (ADO 教學課程)

   

本步驟的工作

討論

您必須要有建立交換資料必須條件的方法;也就是連接。您連接的資料來源指定於連接字串,但在連接字串中所指定的參數可因每個提供者 與資料來源而異。

ADO 開啟連接的主要方法是 Connection.Open 方法。您也可以用不同的方法,呼叫 Recordset.Open 捷徑方法,在同一作業中開啟連接,並經由連接發出指令。以下為每種方法在 Visual Basic 中的語法:

connection.Open ConnectionString, UserID, Password, OpenOptions

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

比較這兩種方法可了解 ADO 方法運算元一般的特性。

方法參數可以用數種方法指定。例如,Recordset.Open 利用 ActiveConnection 參數,它可以是實際上的 [字串]、代表字串的變數,或代表開啟連接的 Connection 物件。

此教學課程式使用文字性連線字串 - "DSN=Pubs;uid=sa;pwd=;". (資料來源是直接由 "DSN=" 關鍵字指定的。如需詳細資訊,請參閱 Microsoft OLE DB Provider for ODBC 的 "共型連線字串” 一節)。

很多物件的屬性在方法參數被省略時,可以提供引數。例如,您可以設定 Connection 物件 ConnectionString 屬性,提供 Connection.Open 的連線字串資訊,然後省略 Open 方法的 ConnectionString 參數。

此教學課程使用下列 Connection 物件宣告以及 Open 方法:

Dim cnn As New ADODB.Connection

cnn.Open "DSN=Pubs;uid=sa;pwd=;"

下一步   步驟 2: 建立指令


步驟 2:建立指令 (ADO 教學課程)

   

本步驟的工作

討論

指令是資料提供者可以理解的指示,它可以修改、管理或操縱資料來源。不需要特殊的指令語言,不過指令一般是用 SQL 寫成的。查詢指令會要求資料提供者傳回包含資訊列的 Recordset 物件。

將指令指定為:

請參閱相關主題,了解參數化指令簡略的討論。

此教學課程會查詢 Pubs 資料庫 Authors 表格內所有的資訊。Command 物件在宣告時會設定了開啟的 Connection 物件以及指令文字。程式碼如下所示:

Dim cmd As New ADODB.Command

Set cmd.ActiveConnection = cnn

cmd.CommandText = "SELECT * from Authors"

下一步   步驟 3: 執行指令


步驟 3: 執行指令 (ADO 教學課程)

 

目前所在位置

討論

三種可傳回 Recordset 的方法是 Connection.ExecuteCommand.Execute 以及 Recordset.Open。這是它們在 Visual Basic 的語法:

connection.Execute(CommandText, RecordsAffected, Options)

command.Execute(RecordsAffected, Parameters, Options)

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

這些方法會被最佳化,以便善用其特殊物件的長處。

輸出指令前,必須暗地或明確開啟連線。每一種輸出指令的方法代表不同的連線:

另一種差異就是三種方法指定指令的方式:

每一種功能和效能之間的取捨:

請研究這些選項,它們會採用 Recordset 很多的功能。其中特別重要的地方是討論使用 Microsoft Cursor Service for OLE DB。請參閱 Microsoft Cursor Service for OLE DB,了解此討論內涵的詳細資料。

此教學課程會在批次模式變更 Recordset,因此會指定 adLockBatchOptimistic LockType。批次處理需要 Cursor Service,因此 CursorLocation 屬性會設定成 adUseClient。因為 Command 物件已經設定成開啟的連線,所以 ActiveConnection 參數無法指定在 Open 方法中。

Recordset 的宣告和用法如下所示:

Dim rs As New ADODB.Recordset

rst.CursorLocation = adUseClient

rst.Open cmd, , adOpenStatic, adLockBatchOptimistic

下一步   步驟 4: 操縱資料


步驟 4: 操縱資料 (ADO 教學課程)

 

目前所在的位置

討論

Recordset 物件方法和屬性的大量資料,可用於檢查、瀏覽和操縱 Recordset 資料。

您可以將 Recordset 想像是資料列陣列。在指定的任何時間中可以檢查和操縱的資料列是目前的資料列,您在 Recordset 的位置是目前的資料列位置。每次您移到另一個資料列,該資料列會變成目前的資料列。

目前有數種方法會明確地遊走或 “瀏覽” Recordset (Move 方法)。部份方法 (Find 方法) 可以這樣做,但會造成副作用。此外,設定特定的屬性 (Bookmark 屬性) 也可以變更您的資料列位置。Recordset 物件 CursorType 屬性或 Open 方法 CursorType 參數,會決定您是否可以往前或往回瀏覽 Recordset

Filter 屬性可以控制您存取的資料列 (也就是說,您可以看到哪些資料列)。Sort 屬性可以控刖您瀏覽 Recordset 資料列的順序。

您可以使用 AddNew 方法建立新的資料列,或者使用 Delete 方法刪除現有的資料列。

Recordset 有一個 Fields 集合物件,它是代表各個欄位或資料列欄位 (資料行) 的 Field 物件的組合。請使用 Field 物件 Value 屬性來指定或取得資料。您也可以使用 GetRows 方法存取大量的欄位資料。修改 Recordset 之後,請使用 Update 方法將所做的變更傳播到資料來源。

在此教學課程中,您會:

請使用 Move 方法從頭到尾瀏覽排序、過濾的 Recordset。Recordset 物件 EOF 屬性指示您已經到了最後的資料列就停止。當您翻閱 Recordset 的時候,會顯示作者的姓名和原始電話號碼,然後將電話欄位中的區碼改成 “777”。(電話欄位中的電話號碼會格式化成 "aaa xxx-yyyy",其中 aaa 是區碼而 xxx 是交換碼)。

當每一個資料列變更後,就不再符合過濾器指定的規則,所以就不會顯示在 Recordset。當過濾器解除後,所有的資料列會重新顯示。

請參閱結構敘述相關主題,了解 Authors 表格的佈局。程式碼如下所示:

rst!au_lname.Properties("Optimize") = True

rst.Sort = "au_lname"

rst.Filter = "phone LIKE '415 5*'"

rst.MoveFirst

Do While Not rst.EOF

    Debug.Print "Name = "; rst!au_fname; " "; rst!au_lname; _

        ", Phone = "; rst!phone

    rst!phone = "777" & Mid(rst!phone, 4)

    rst.MoveNext

Loop

rst.Filter = adFilterNone

下一步   步驟 5: 更新資料


步驟 5: 更新資料 (ADO 教學課程)

 

目前所在的位置

討論

您剛剛變更了 Recordset 數個資料列的資料。ADO 支援兩個與新增、刪除以及修改資料列的方法。

第一種方法是所做的變更不會立即反應到 Recordset,實際上會反應到內部的備份緩衝區。若您決定不想變更,則在備份緩衝區內的變更就會被捨棄。若您決定要變更,則在備份緩衝區內的變更會套用到 Recordset

第二種方法是所做的變更在您宣告資料列的作業完成時,會立即傳播到資料來源。或者所有對一組資料列所做的變更會集合起來,一直到您宣告作業完成為止 (也就批次模式)。LockType 屬性會決定什麼時候所做的變更會反應到下層的資料來源。CursorLocation 屬性可以影響哪些 LockType 設定可以顯示出來。例如,若 CursorLocation 屬性設定成 adUseClient,就不支援 adLockPessimistic 設定。

在即時模式下,每次呼叫 Update 方法就會將所做的變更傳播到資料來源。在批次模式下,每次呼叫 Update 或移動目前的資料列位置,就會將所做的變更儲存到備份緩衝區,但只有 UpdateBatch 方法才會將所做的變更傳播到資料來源。Recordset 會在批次模式下開啟 (adLockBatchOptimistic),因此會在批次模式下執行更新作業。

視情況不同,更新作業可以在交易中執行。交易會建立一種環境,交易中的作業可以全部成功或全部取消它們的結果。

普通的交易範例是銀行應用程式,當作業從某一個帳戶挪出金額,另一個作業將相同的金額存入另一個帳戶時,雙方必須同時成功。若其中一項作業失敗,則另一項作業必須還原,否則帳戶會出現收支不平衡。

交易一般會配置和保留資料來源有限的資源供長期使用。基於這個理由,建議您交易要越簡短越好。(這也是為什麼此教學課程不會在連線建立後立即開始)。

就實戰經驗來說,此教學課程不需要交易,不過會用一個交易供所有示範用途參考。啟動交易和執行批次更新的程式碼如下所示:

cnn.BeginTrans

rst.UpdateBatch

下一步   步驟 6: 結束更新


步驟 6: 結束更新 (ADO 教學課程)

 

目前所在的位置

討論

想像批次交易發生錯誤而結束誤。您如何依據錯誤的本質和嚴重性以及應用程式的邏輯來解決錯誤。不過,若資料庫與其他使用者共用,典型的錯誤就是有些人在您修改之前,就先修改了欄位。這種錯誤稱為衝突。ADO 會偵測此狀況後報告錯誤。

教學課程中的此步驟有兩個部份:若沒有更新錯誤,則資料來源會反應更新資料。交易被許可。許可交易會完成和結束交易。

接受更新的程式碼如下所示:

cnn.CommitTrans

若發生更新錯誤,它們會被捕捉到錯誤處理常式內。請用 adFilterConflictingRecords 常數來過濾 Recordset,只顯示衝突的資料列。錯誤解決策略只會列印作者的姓名 (au_fnameau_lname),然後回復 (還原) 交易。回復交易會捨棄任何成功的更新作業,然後結束交易。

拒絕更新的程式碼如下所示:

rst.Filter = adFilterConflictingRecords

rst.MoveFirst

Do While Not rst.EOF

    Debug.Print "Conflict: Name =  "; rst!au_fname; " "; rst!au_lname

    rst.MoveNext

Loop

cnn.RollbackTrans

更新結束後,RecordsetConnection 物件會關閉而範例會存在。程式碼如下所示:

rst.Close

cnn.Close

這是說明性教學課程的結尾。