2010-06-23 VBA環境下的ADO編程方法全程解析

說明:網上的很多資料很全,但是唯一的缺點就是讀起來有點兒費勁。這篇ADO編程詳解,是在我的新書(別急,還沒出版呢!)中的一小節,大家能讀懂不?如此菜鳥的技術,在各位大蝦面前獻醜了。
 
ActiveX數據對象ADO是一種數據訪問接口,可以與符合OLE DB標準的數據源通信,以檢索、操作和更新數據。ADO的最大優點是易於使用,速度快,內存佔用低,佔用磁盤空間少等。一般而言,利用ADO進行數據訪問和操作的主要步驟是:
1)連接數據源;
2)設置查詢命令;
3)執行查詢命令。
在典型情況下,需要在編程過程中按照步驟進行編程。但是,由於 ADO 有很強的靈活性,所以很多情況下只需執行部分模塊就能完成需要的功能。
 
ADO對象庫中主要有9個對象,即:ConnectionCommandRecordsetRecordFieldErrorPropertyParameterStream。這9個對象中又有三個即ConnectionCommandRecordset是最爲常用的,很多情況下只需要這三個對象即可完成數據的讀取和操作。
 

12.4.2 Connection對象

ADO Connection 對象代表了打開的、與數據源的連接,好像在應用程序和數據庫中建立了一條數據傳輸連線,該對象代表了與數據源進行的惟一會話。如果是C/S數據庫系統,該對象可等價於到服務器的實際網絡連接。通過此連接,用戶可以對被連接到的數據源進行訪問和操作。
如果需要多次訪問某個數據庫,用戶應當使用 Connection 對象來建立一個連接。如下例所示的就是在ASP語言中創建Connection對象並建立連接:
<%
Set Conn=Server.Createobject("ADODB.Connection")
Conn.Provider="Microsoft.Jet.OLEDB.4.0"
Conn.Open "C:/Webdata/Northwind.Mdb"
Response.Write(Conn.Provider)
Conn.Close
%>
在上面的例子中使用了Connection對象的Provider屬性和Open方法,關於Connection對象的更多屬性和方法,請參閱幫助中心的ADO程序員參考。

 

Connection對象在C/SB/S開發過程中是必備的ADO對象,但是在Access開發中,用戶既可以自己定義Connection對象,也可以直接使用VBACurrentProject對象的Connection屬性來實現連接,如下例所示:
自行定義Connection對象實現連接:
Dim Cnn as New ADODB.Connection
Dim Rst As New ADODB.Recordset '定義對象變量
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D: \ADO.Mdb"
Set Rst.Activeconnection = Cnn
使用Access VBACurrentProject對象的Connection屬性實現連接:
Set rst = New ADODB.Recordset
rst.ActiveConnection = CurrentProject.Connection

12.4.3 Command對象:

ADO Command 對象用於執行面向數據庫的一次簡單查詢。此查詢可以是創建、添加、取回、刪除或更新記錄等動作。
如果該查詢命令用於取回數據,則此數據將以Recordset 對象返回。這意味着被取回的數據能夠利用Recordset對象的屬性、集合、方法或事件進行操作。
Command對象中,可以使用 CommandText 屬性定義命令的可執行文本,通過 Parameter 對象和 Parameters 集合定義參數化查詢或存儲過程參數,可使用 Execute 方法執行命令並在適當的時候返回 Recordset 對象。

 

如果不想使用 Command 對象執行查詢,可以將查詢字符串傳送給Connection 對象的 Execute 方法或 Recordset 對象的 Open 方法。但是,當需要使命令文本具有持久性並重新執行,或使用查詢參數時,就使用 Command 對象了。
如下例所示的就是在ASP語言中創建Command對象並建立調用:
<%
Set Conn = Server.Createobject("ADODB.Connection")
Set Cmd = Server.Createobject("ADODB.Command")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath("Data.mdb")
cmd.ActiveConnection = Conn
'ActiveConnection屬性使打開的連接與 Command 對象關聯
cmd.CommandText = "Select * from student"
'CommandText 屬性定義命令,可在ACCESS的查詢表中建立查詢表(表名亦即存儲過程名稱),或直接書寫SQL語句
Set rs = cmd.Execute
'Execute 方法執行命令並在適當的時候返回 Recordset 對象
...'應用rs,可輸出記錄
%>
在上面的例子中使用了Command對象的ActiveConnection屬性和CommandText屬性。

 

Access開發中,用戶定義使用Command對象,也可以直接使用更簡單的Recordset對象的Open方法,來直接打開查詢字符串,如下例所示:
Set rs = as New ADODB.Recordset '建立數據庫對象
rs.activeconnection = CurrentProject.Connection '建立連接
rs.cursortype = adopendynamic
rs.locktype = adlockoptimistic
rs.Open sql '按照設置的SQL查詢方法,打開數據庫對象

12.4.4 Recordset對象:

讀者可以看到,在前面的兩小節舉例中,都用到了Recordset對象,那麼什麼是Recordset對象,爲什麼每個例子中都需要使用該對象呢?
ADO 中,Recordset對象是最重要且最常用於對數據庫的數據進行操作的對象。ADO Recordset對象用於容納來自數據庫表的記錄集。任何涉及數據的查詢、修改、創建與刪除操作,都需要創建該對象,並在該數據集中進行操作。
當用戶首次打開一個 Recordset 對象時,當前記錄指針將指向第一個記錄,同時 BOF EOF 屬性爲 False。如果沒有記錄,BOF EOF 屬性爲 True
Recordset對象是通過指針來對集合中的數據進行操作的,在ADO中定義了 4 中不同的指針類型:
1)動態指針AdOpenDynamic - 允許用戶查看其他用戶所作的添加、更改和刪除
2)鍵集指針AdOpenKeyset - 類似動態遊標,不同的是用戶無法查看其他用戶所做的添加,並且它會防止您訪問其他用戶已刪除的記錄。其他用戶所做的數據更改仍然是可見的。
3)靜態指針AdOpenStatic - 提供記錄集的靜態副本,可用來查找數據或生成報告。此外,由其他用戶所做的添加、更改和刪除將是不可見的。當您打開一個客戶端 Recordset 對象時,這是唯一被允許的遊標類型。
4)僅向前指針AdOpenForwardOnly - 只允許在 Recordset 中向前滾動。此外,由其他用戶所做的添加、更改和刪除將是不可見的。
需要注意的是:一旦打開Recordset,你就無法改變CursorType屬性。但是,如果你首先關閉Recordset,改變CursorType屬性,然後重新打開Recordset,那麼你仍可以有效地改變遊標的類型!
Recordset對象中,用戶需要通過CursorType 屬性來設置遊標的類型。
Recordset對象中,還有一個重要的屬性是LockType。在任何可能被多用戶同時修改的數據庫中,開發者必須預見到可能發生多個用戶同時對同一條記錄進行操作時的情況。當這種情況出現時,數據的完整性就不能得到保證。爲了處理這種情況,ADO允許用戶在對Recordset對象進行更新時決定事件控制的類型,當一個用戶編輯時,如何由他對記錄進行鎖定。這就是由LockType屬性所決定的。LockType屬性有四個值:
1adLockReadonly:默認值,只讀,無法更改數據。這是Recordset的默認值,如果用戶把鎖定方式設爲該值,那麼用戶將不能更新 Recordset
2adLockPessimistic:保守式記錄鎖定。提供者執行必要的操作確保成功編輯記錄,通常採用編輯時立即鎖定數據源的記錄的方式。如果設置爲此類鎖定,記錄被鎖定,且只有在編輯開始到將記錄更新的提交給數據提供者這段時間內進行編輯的用戶纔可以訪問!
3adlockoptimistic:開放式記錄鎖定(逐條)。提供者使用開放式鎖定,只在調用 Update 方法時鎖定記錄。只有在將數據提交給數據提供者的那一瞬間才把記錄鎖定。
4adlockBatchOptimistic:開放式批更新。設定爲這種類型的鎖定製式將被稱爲批量更新模式的Recordset 可以加快更新Recordset修改數據的速度,但因爲同時更新多個記錄,它也會惡化與併發訪問相關的問題!
在介紹了Recordset對象的幾個重要屬性後,Access中對Recordset對象的使用舉例如下所示。
Dim sql As String
Dim rs As New ADODB.Recordset '定義數據對象
sql = "SELECT * FROM 客戶表 'sql字符串賦值
rs.activeconnection = CurrentProject.Connection '建立連接
rs.cursortype = adopendynamic '設置指針類型
rs.locktype = adlockoptimistic '設置鎖定方式
rs.Open sql '按照設置的SQL查詢方法,打開數據庫對象
If rs.EOF Then
DoCmd.Beep
MsgBox ("用戶名或密碼錯誤,請重新輸入!")
....
 
在運行該過程前,先到VBA編輯器的【引用】對話框中,選擇引用“Microsoft ActiveX Data Objects 2.8 Library”對象庫,否則會提示“用戶定義類型爲定義”的錯誤提示。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章