gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:58:26 26 4
gpt4 key购买 nike

我正在尝试通过 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 block 来检查,但此时我在 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 is true 部分。

    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 数据库之外。至于我运行的查询,它只是一个带有变量的基本选择语句:

    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,并创建在处理错误后执行的 block 。您可以设置每次执行(无论是否出错)的代码块,这将关闭您的连接并释放您的对象。这就是“强制”连接关闭的方式,方法是确保关闭连接的代码不会失败。基本外壳如下所示:

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

关于vba - Excel VBA - 如何强制关闭 ADO 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24498338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com