Excel VBA – 如何强制closures一个ADO连接?

我试图通过VBA将Excel工作表连接到本地Access数据库,并且遇到了Access数据库被从上一个debugginglocking的问题,并且在尝试执行时会引发错误3704或3709(请参见下文)debugging。

现在我是VBA的新手,所以我很有可能没有正确地将它连接到数据库。 有没有办法强制数据库closures?

以下是连接的代码:

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:当对象closures时不允许操作”:

  If cn.State = adStateOpen Then cn.Close Else MsgBox "The connection is already open." End If 

所以我评论了上面的代码,并用下面的代码replace它,但是我得到了“运行时错误3079:连接不能用来执行这个操作,在这种情况下它是closures的或者是无效的。 在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清理连接。 但是,代码在达到这一点之前停止了,现在将我locking在Access数据库之外。 至于我运行的查询,这只是一个基本的select语句与variables:

  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中放置variables的语法是错误的。 我能够再次debugging的唯一方法是重新启动计算机。 任何build议将不胜感激。

我认为问题不在于ADO,而在于代码中缺lesserror handling。 你一定要读一读。

除非另外指定,否则error handling的默认模式将会抛出一个消息框,并且在您单击End之后,它只会在停止的行处结束该例程。 看看错误转到,并创build处理错误后执行的块。 您可以设置一个代码块,每次执行,错误或不会,这将closures您的连接和释放您的对象。 这是如何“强制”连接closures,通过确保代码closures它运行没有失败。 基本的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中仔细testing你的代码。