1

我有一个 Access 应用程序,用作 TimeClock 接口并查找定价信息。它用于触摸屏计算机以及专门使用无线的 Dell Latitude ST 平板电脑。

后端是本地 Windows 7“服务器”计算机上的 SQL Server R2 2008。我最近将应用程序转换为使用绑定到 ADO 记录集的表单,希望应用程序在发生断开连接的情况下更具弹性。我正在使用单个全局 ADO 连接对象。平板电脑配置为始终保持开启状态,但似乎偶尔会断开连接。我们可以花时间对设备和网络进行故障排除,以使其更加稳定。但是,我希望能够编写我的 Access 应用程序,以便它们可以在 WAN/Internet 上使用,这基本上会使网络稳定性超出我的想象和控制范围。相反,我选择专注于使这个特定的应用程序(一个相当小的应用程序)对数据库断开和中断更加友好。

我编写了一个全局函数,它基本上检查 ADO 连接是否打开/连接。但是,如果我断开网络,连接对象仍然显示 State = adStateOpen。

我最初编写了一个测试函数来通过打开一个基本的单记录记录集来测试连接。但是,如果服务器不可用,这会花费太长时间,并且似乎会导致错误沉淀,而不仅仅是测试功能(可能是一些错误的编码)。我什至更改了连接超时设置,但似乎这些超时被忽略了,因为如果服务器确实不可用,我的测试函数将需要大约 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

这是另一个论坛上的类似问题(VB6 而不是 Access)。在我看来,没有达成任何解决方案。

有没有更好的方法来管理我的全局 ADO 连接并检测服务器/网络中断,而不必每次都关闭连接并重新打开它?

4

2 回答 2

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

也许您可以按设定的时间间隔触发它以查看连接的外观。

于 2012-07-23T14:06:39.307 回答
-1

ADO 只是另一个没有连接状态的 ODBC 接口。在 ODBC 中,您可以使用简单的方法来连接、执行操作(如果错误处理错误)。

我在我的 MS Access 程序中解决这个问题的方法是:-

  1. 创建连接
  2. 做事(选择、更新、插入和删除)
  3. 如果出现错误,则重复一次该过程,然后在仍然存在的情况下显示错误。

这适用于基本语句,但是如果您发送多个语句,您可能需要进一步扩展它,例如:-

  1. 连接“con.open”
  2. 开始交易“con.BeginTrans”
  3. 插入行“con.Execute”
  4. 如果所有行都OK 提交事务“con.Commit”

这些行仅在您提交时存储在 taget ODBC 数据源中,因此即使您在插入行的过程中遇到网络断开连接,也不会存储数据。如果它是一个自动过程,您可以继续循环执行上述操作,或者如果需要在代码继续之前解决问题,您可以停止并出现用户错误。

于 2012-07-24T08:49:07.040 回答