TimeClockインターフェイスとして使用され、価格情報を検索するAccessアプリケーションがあります。タッチスクリーンコンピュータと、ワイヤレスのみを使用するDellLatitudeSTタブレットで使用されます。
バックエンドは、ローカルのWindows7「サーバー」コンピューター上のSQLServerR22008です。私は最近、切断が発生した場合にアプリケーションがより回復力があることを期待して、ADOレコードセットにバインドされたフォームを使用するようにアプリケーションを変換しました。単一のグローバルADO接続オブジェクトを使用しています。タブレットコンピュータは常にオンのままになるように構成されていますが、接続が失われることがあります。デバイスとネットワークのトラブルシューティングに時間を費やして、デバイスをより安定させることができます。ただし、Accessアプリケーションを作成して、WAN /インターネット経由で使用できるようにしたいと考えています。これにより、基本的にネットワークの安定性が見えなくなり、制御できなくなります。代わりに、この特定のアプリケーション(かなり小さいアプリケーション)をデータベースの切断や中断に対してより使いやすくすることに焦点を当てることを選択しました。
基本的に、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
別のフォーラムでの同様の質問(AccessではなくVB6)があります。解決策に到達しなかったように私には思えます。
接続を閉じて毎回再度開くことなく、グローバルADO接続を管理し、サーバー/ネットワークの中断を検出するためのより良い方法はありますか?