Excel VBA-如何强制关闭ADO连接?

用户3791508

我试图通过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 And 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清理了连接,并设置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中放置变量的语法错误。我能够再次调试的唯一方法是重新启动计算机。任何建议将不胜感激。

VBlades

我认为问题出在ADO上,而更多的是缺少代码中的错误处理。您绝对应该阅读它。

除非您另外指定,否则错误处理的默认模式将引发一个消息框,并且在单击“结束”后,它将仅在例程停止的行结束该例程。查看“出现错误时转到”,并创建在处理错误后执行的块。您可以设置一个代码块,该代码块每次都会执行,无论是否发生错误,这都会关闭您的连接并释放对象。通过确保关闭代码运行不会失败,这就是“强制”关闭连接的方式。基本外壳看起来像这样:

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中测试您的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章