我有一个Access应用程序,用作TimeClock接口并查找定价信息。它可用于触摸屏计算机以及仅使用无线的Dell Latitude ST平板电脑。
后端是本地Windows 7“服务器”计算机上的SQL Server R2 2008。我最近将应用程序转换为使用绑定到ADO记录集的表单,希望应用程序在发生断开连接时更具弹性。我正在使用单个全局ADO连接对象。平板电脑配置为始终保持开启但似乎偶尔会丢失连接。我们可以花时间对设备和网络进行故障排除,使其更加稳定。但是,我希望能够编写我的Access应用程序,以便它们可以在WAN / Internet上使用,这基本上可以使网络稳定性超出我的控制范围。我选择专注于使这个特定的应用程序(一个相当小的应用程序)更加友好,数据库断开连接和中断。
我编写了一个全局函数,它基本上检查ADO连接是否打开/连接。但是,如果我断开网络连接,连接对象仍会显示State = adStateOpen。
我最初编写了一个Test函数,通过打开一个基本的单记录记录集来测试连接。但是,如果服务器不可用,这会花费太长时间,并且似乎导致错误的沉淀超出了测试功能(可能是一些糟糕的编码)。我甚至更改了连接TimeOut设置,但似乎忽略了那些超时,因为我的测试功能在服务器确实不可用的情况下需要大约15秒(或者是30秒)返回。
我现在改变了我的功能,每次关闭连接,然后重新打开它。它似乎非常低效,但它是我发现在服务器断开连接后使我的应用程序正常工作的唯一方法,而不必关闭并再次打开应用程序。服务器断开或网络中断实际上非常罕见(基本上不存在),尤其是在有线机器上。
Public Function IsGConOpen(Optional bOpenCon As Boolean = True) As Boolean
IsGConOpen = False
If bOpenCon = True Then
Dim sConString As String
sConString = Config.ADOConString
If sConString = "" Then
Call InitGlobalSettings
sConString = Config.ADOConString
End If
If sConString = "" Then Exit Function
If gCon Is Nothing Then
Set gCon = New ADODb.Connection
Else
If gCon.State = adStateOpen Then
gCon.Close
End If
End If
With gCon
.Provider = "MSDataShape"
.ConnectionString = sConString
.CursorLocation = adUseClient
.ConnectionTimeout = 5
.CommandTimeout = 5
.Open
End With
If gCon.State = adStateOpen Then
IsGConOpen = True
End If
Else
If gCon Is Nothing Then
IsGConOpen = False
ElseIf gCon.State = adStateOpen Then
IsGConOpen = True
End If
End If
End Function
Here's a similar question (VB6 instead of Access) on a different forum.在我看来,没有达成任何解决方案。
是否有更好的方法来管理我的全局ADO连接并检测服务器/网络中断,而无需每次都关闭连接并重新打开它?
答案 0 :(得分:0)
我总是喜欢在服务器的IP上执行ping检查以查看我是否有连接,这样我可以限制等待我的ping检查的时间尽可能短,我没有最初写下面的代码,但确实适应了我的需要:
Public Function SystemOnline(ByVal IPAdd As String) As Boolean
Dim oShell, oExec As Variant
Dim strText, strCmd As String
strText = ""
strCmd = "ping -n 2 -w 1000 " & IPAdd
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec(strCmd)
Do While Not oExec.StdOut.AtEndOfStream
strText = oExec.StdOut.ReadLine()
If InStr(strText, "Reply") > 0 Then
SystemOnline = True
Exit Do
End If
Loop
End Function
然后我称之为:
If Not SystemOnline("11.111.11.111") Then
'Disconnected
Else
'Connected
End If
也许您可以按设定的时间间隔启动它,以查看连接的外观。
答案 1 :(得分:-1)
ADO只是ODBC的另一个接口,它没有连接状态。在ODBC中,您可以使用简单的方法连接,执行操作,如果错误处理错误。
我在MS Access程序中解决这个问题的方法是: -
这适用于基本规则,但是如果要发送多个语句,则可能需要进一步扩展它,例如: -
当您提交时,行仅存储在taget ODBC数据源中,因此即使您通过插入行获得网络断开连接,也会导致数据无法存储。如果需要在代码继续之前解决问题,您可以继续循环使用上面的内容,如果它是自动进程,或者因用户错误而停止。