1

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接続を管理し、サーバー/ネットワークの中断を検出するためのより良い方法はありますか?

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 回繰り返してから、まだエラーがある場合はエラーを表示します。

これは基本的なステートメントで機能しますが、次のような複数のステートメントを送信する場合は、さらに拡張する必要がある場合があります。

  1. 「con.open」を接続
  2. トランザクション開始「con.BeginTrans」
  3. 行を挿入する「con.Execute」
  4. すべての行がOKの場合トランザクション「con.Commit」をコミットします

行は、コミット時にのみターゲット ODBC データ ソースに保存されるため、行を挿入する途中でネットワークが切断された場合でも、データは保存されません。コードを続行する前に問題を解決する必要がある場合は、自動化されたプロセスの場合は上記をループし続けるか、ユーザー エラーで停止することができます。

于 2012-07-24T08:49:07.040 に答える