什么导致ADODB连接关闭,而不是调用close自身

时间:2015-11-25 07:46:15

标签: sql-server excel vba adodb

这是上下文。我已经在我的计算机上测试了一个VBA应用程序,我正在开发它并且工作正常。该应用程序也通过Application.OnTime运行循环,使用Windows身份验证通过ADODB.Connection连接到Sql服务器。只创建了一个conn,但在RecordSet个循环中执行了使用conn的许多OnTime个问题。

虽然VBA应用程序在我的计算机上运行24小时,但当我将应用程序发送到另一台计算机时会出现问题。另一台计算机可以登录到Sql server ,但 RecordSet在5小时后开始失败。什么都没有读,没有输出。

我打电话的例程非常简单。

Sub Rout()
    On Error Resume Next
    If conn Is Nothing Then
        Call connectDB
    End If

    Dim cmd As New ADODB.Command
    cmd.ActiveConnection = conn
    cmd.CommandText = "dbo.[procedureTestEvent]"
    cmd.CommandType = adCmdStoredProc                                  
    Dim rs As Recordset
    Set rs = cmd.Execute

    ThisWorkbook.Sheets("Main").Range("E5").Value = rs!Value    

    DateRun = Now + TimeSerial(0, 0, 2)
    Application.OnTime DateRun, "Rout"
End Sub

现在,当我禁用On Error Resume Next时,弹出错误

运行时错误' 3709':请求的操作需要OLE DB会话对象,当前提供程序不支持该对象。

这是由于conn.State被关闭所致。因为我之前忽略了错误,所以Rout()会继续重复,并且由于RecordSet在没有通知的情况下失败,因此屏幕上不会有任何更新。因此,问题是:

  1. conn.State之后是否有0cmd.Execute的原因?我确信在conn.State=1之后connectDB。我已尝试设置cmd.ConnectionTimeout=10并在waitfor delay '00:00:15'中添加一个人为的procedureTestEvent。即使忽略错误,conn.State在超时后仍然打开。

  2. 知道VBA应用的两个实例之间的唯一区别是Windows登录,conn的自动关闭是否与Windows身份验证相关?请记住,RecordSet在应用程序正常运行几个小时后

0 个答案:

没有答案