[英]Excel VBA - How to force close an ADO connection?
我試圖通過VBA將Excel工作表連接到本地Access數據庫,我遇到了Access數據庫從以前的調試被鎖定的問題,並且在嘗試時嘗試錯誤3704或3709(見下文)調試。
現在我是VBA的新手,所以很有可能我沒有正確地將它連接到數據庫。 有沒有辦法迫使數據庫關閉?
以下是連接代碼:
Dim objAccess As Object
Dim strFile, strConnection As String
strFile = "Address of SampleDB.accdb"
Set objAccess = CreateObject("Access.Application")
Call objAccess.OpenCurrentDatabase(strFile)
'get the connection string
strConnection = objAccess.CurrentProject.Connection.ConnectionString
objAccess.Quit
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = strConnection
因此,為了檢查狀態是否打開,我寫了一個if塊進行檢查,但是當我在cn.CloseConnection行上得到“運行時錯誤3074:關閉對象時不允許操作”時:
If cn.State = adStateOpen Then
cn.Close
Else
MsgBox "The connection is already open."
End If
所以我對上面的代碼進行了評論,並將其替換為以下代碼,但我得到“運行時錯誤3079:連接不能用於執行此操作。在此上下文中它已關閉或無效。” 在set rs.ActiveConnection = cn行。 它進入(cn.State和adStateOpen)= adStateOpen是真正的第一部分。
If (cn.State And adStateOpen) = adStateOpen Then
MsgBox "cn Connection is already open."
Else
cn.Open strConnection
MsgBox "Connection is now open"
End If
Set rs = Nothing
Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn
我通過使用cn.Close和Set cn = Nothing來清理最后的連接。 但是,代碼在到達該點之前停止,現在將我鎖定在Access數據庫之外。 至於我運行的查詢,它只是一個帶變量的基本select語句:
Dim iArea As String
Dim strSQL As String
Dim dId As Integer
iArea = "Sales"
strSQL = "SELECT [deptID] FROM [tblDept] WHERE [deptArea]='" & iArea & "'"
rs.Open
Set rs = cn.Execute(strSQL)
dId = rs.Fields(0)
MsgBox dId
rs.Close
Set rs = Nothing
代碼最初停止了,因為我在SQL中放置變量的語法是錯誤的。 我能夠再次調試的唯一方法是重新啟動計算機。 任何建議將不勝感激。
我認為問題不在於ADO,而在於代碼中缺少錯誤處理。 你一定要讀它。
除非您另行指定,否則默認的錯誤處理模式將拋出一個消息框,單擊“結束”后,它將在它停止的行上結束例程。 查看On Error Goto,並創建在處理錯誤后執行的塊。 您可以設置每次執行的代碼塊,錯誤與否,這將關閉您的連接並釋放您的對象。 這就是你通過確保關閉它的代碼運行而“強制”關閉連接的方式。 基本shell看起來像這樣:
Sub MySub()
On Error Goto MySub_ErrorHandler
'...Code here...
'1. If error happens, goto 2.
ExitMe:
'4. Clean up and run the code which needs to definitely run here. Close connections, deallocate your objects, etc.
'5. Finally, exit the routine with all loose ends tied up.
Exit Sub
MySub_ErrorHandler:
'2. Handle the error here...
'3. Then go to ExitMe...
Goto ExitMe
End Sub
將代碼放在ExitMe中會產生錯誤; 在這種情況下,代碼執行將再次轉到MySub_ErrorHandler,您可以進入無限循環。 因此,請務必在ExitMe中測試您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.