检测服务器或网络断开连接

时间:2012-07-23 13:49:46

标签: ms-access ado access-vba

我有一个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连接并检测服务器/网络中断,而无需每次都关闭连接并重新打开它?

2 个答案:

答案 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程序中解决这个问题的方法是: -

  1. 创建连接
  2. 做事(选择,更新,插入和删除)
  3. 如果事情错误重复处理一次,然后显示错误,如果它仍然存在。
  4. 这适用于基本规则,但是如果要发送多个语句,则可能需要进一步扩展它,例如: -

    1. 连接“con.open”
    2. 开始交易“con.BeginTrans”
    3. 插入行“con.Execute”
    4. 如果所有行都正常提交事务“con.Commit”
    5. 当您提交时,行仅存储在taget ODBC数据源中,因此即使您通过插入行获得网络断开连接,也会导致数据无法存储。如果需要在代码继续之前解决问题,您可以继续循环使用上面的内容,如果它是自动进程,或者因用户错误而停止。