我试图通过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中放置变量的语法错误。我能够再次调试的唯一方法是重新启动计算机。任何建议将不胜感激。
我认为问题出在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] 删除。
我来说两句