这是上下文。我已经在我的计算机上测试了一个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
在没有通知的情况下失败,因此屏幕上不会有任何更新。因此,问题是:
conn.State
之后是否有0
到cmd.Execute
的原因?我确信在conn.State=1
之后connectDB
。我已尝试设置cmd.ConnectionTimeout=10
并在waitfor delay '00:00:15'
中添加一个人为的procedureTestEvent
。即使忽略错误,conn.State
在超时后仍然打开。
知道VBA应用的两个实例之间的唯一区别是Windows登录,conn
的自动关闭是否与Windows身份验证相关?请记住,RecordSet
在应用程序正常运行几个小时后