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