簡體   English   中英

Excel VBA - 如何強制關閉ADO連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM