当有些用户在计算机从睡眠状态恢复时报告错误时,我有一个旧的visual basic 6应用程序。每个客户端计算机上都没有出现此问题(我会说一些Windows 7)。如果vb6应用程序仍处于打开状态,那么如果他们尝试使用此应用程序,则会崩溃,并显示以下错误消息。
我调试了,我发现了问题:我有一个全局变量来保持与数据库的连接。此变量仅在应用程序开始时初始化一次。当计算机进入睡眠状态并稍后返回时,此变量的状态仍然是“打开”,但实际上连接丢失了!如果我“关闭”然后“打开”这个变量连接我能够查询数据库。
我想知道我丢失数据库连接是否正常?!
以下是一些代码:
' This is my global variable
Global cn As New ADODB.Connection
' Set connection properties for sql server.
cn.ConnectionTimeout = 25
cn.Provider = "sqloledb"
cn.Properties("Data Source").Value = ".\SQL2008"
cn.Properties("Initial Catalog").Value = DB_INITIAL_CATALOG
cn.Properties("User ID").Value = DB_USERNAME
cn.Properties("Password").Value = DB_PASSWORD
cn.Open
' This is a typical query on my database
Set rs = New ADODB.Recordset
strSql = "SELECT * FROM tblUsers"
rs.Open strSql, cn, adOpenKeyset
有什么想法吗?
感谢。
答案 0 :(得分:3)
是的,我以前见过这种事。连接字符串上可能有设置可以帮助减少它,但超时和/或网络丢弃可能会破坏与数据库服务器的基础(通常是TCP)连接。然后,您将在数据库的下一个I / O中看到错误清单。
我建议包装对共享连接的访问权限,以便您可以透明地捕获该特定错误并重试。在类或模块中保持连接的私有性,并使用以下方法:
'Open is called to set the args to connect, these should be saved for reconnect
Public Sub Open(connect params here)
'save arsg to prive members to reconnect
'connect to db
End Sub
Public Function OpenKeyset(sql) As RecordSet
Set rs = New ADODB.Recordset
On Error Resume Next
rs.Open strSql, privateConn, adOpenKeyset
'if the error is the disconnect
If Error.Number = xxx Then 'or inspect the error message or error collection
'turn of error trap
Err.Clear
On Error Goto 0
'reopen db conn
'then retry
rs.Open strSql, privateConn, adOpenKeyset
End If
OpenKeyset = rs
End Function
您甚至可以定期执行无操作数据库操作,例如查询目录或其他任何内容以保持连接的实时和重新连接。如果计算机处于休眠状态,你还可以及时观察大跳跃。
答案 1 :(得分:0)
您应该在vb6代码中捕获睡眠和唤醒事件,任何长时间运行的查询都应该在睡眠时关闭,以便可以关闭dB连接。醒来时,你会做相反的事情。你需要听 WM_POWERBROADCAST消息。https://msdn.microsoft.com/en-us/library/windows/desktop/aa373247(v=vs.85).aspx
祝你好运 叶普