次の方法で共有

ネットワークが切断された時のODBC接続エラーの取得方法について

Anonymous
2011-12-08T09:16:29+00:00

はじめまして。お世話になります。

【やりたいこと】

1.サブフォームのレコードソースに、ODBCを用いてサーバ上のテーブルを連結します。

 Me("サブフォーム名").Form.RecordSource = "SELECT * FROM テーブルA IN '' [ODBC;driver={SQL Server};server=サーバー名;uid=ログインID;pwd=パスワード;database=データベース名]"

2.ネットワークを切断します。

3.1で連結しているテーブルのデータを修正します。

4.ネットワークを再接続したときに、3の修正内容が反映されている。

【現状】

ネットワークが切断された時、以下のようなメッセージが出力されます。

[Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionRead(recv()).(#10054) [Microsoft][ODBC SQL Server][DBNETLIB]一般的なネットワークエラーです。ネットワークのマニュアルを調べてください。

上記メッセージ表示後に、連結しているテーブルのデータを修正しようとすると、以下のメッセージが表示されます。

これは、ネットワークを再接続して連結しているテーブルのデータを修正するときにも発生します。

[Microsoft][ODBC SQL Server Driver]通信リンクが失敗しました。(#0)

しばらくすると『ODBC--呼び出しが失敗しました。』というメッセージが表示され、

サブフォームのコントロールには『#Name?』と表示されます。

ネットワークを再接続し、Accessを再起動すると直りますが、修正した内容は反映されません。

【質問】

ネットワークが切断された時に発生するエラーの取得方法を教えてください。

また、ネットワークを切断してもその間に修正した内容を反映させる方法があれば教えてください。

よろしくお願いします。

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

  1. Anonymous
    2011-12-10T07:08:07+00:00

    こんにちは、MukkuMukuです。

    接続先とのコネクションはAccessが管理している状態。

    コネクションが異常により切断された場合(例えばネットワーク障害)など無通信状態がODBCのレジストリConnectionTimeoutに設定されている時間を経過するかAccess再起動まで、Accessはキャッシュしていた接続を解放しないです。なので、何らかの方法でネットワーク切断を検知したとしてもODBCエラーが出るような気がします。

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\ODBC]
    "ConnectionTimeout"=dword:00000258
    既定値は 600秒

    しばらくするとエラーが出る。ということについては、
    ODBCの再表示の間隔とか再表示の間隔とかで設定されている時間経過後ということでは?

    ConnectionTimeoutを小さくすれば再接続の可能性が高まるのでエラー検知がし易くなるかもしれませんが、HKLMなので他への影響がないか要検討です。DAOではなくADODB接続でコネクションを管理しながらという感じでしょうか。

    ネットワーク切断中でも追加更新等されたレコードを反映させるためにはということについては、北上さんの提案にあるような作りこみが必要なのでしょう。

    この回答は役に立ちましたか?

    100+ 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

質問作成者が受け入れた回答

  1. Anonymous
    2011-12-09T08:49:38+00:00

    nyandaba さん、こんにちは。

    Answers への投稿、ありがとうございます。

    ネットワークが切断されたときの ODBC 接続のエラーを取得する方法と、Access 2010 で修正したデータをネットワークに再接続したときにサーバー上に反映させる方法についてですね。

    ODBC の接続のエラーは「DBEngine.Errors」を使えば取得できるかと思います。こちらを利用し、ODBC 接続が切断されたときのエラー情報を取得してみてはいかがでしょうか。

    ネットワークに再接続したときにデータベースの修正内容をサーバー上に反映させるには、いったん Access ローカルのテーブルにデータを保持し、ローカルテーブルから SQL Server へデータを移行し、移行に成功したらローカルテーブル内をクリアする、というような動作をとればよいのかな、と思います。

    上の方法で上手くいかないときは、次の項目について投稿するとほかの方もアドバイスしやすいかもしれません。

    ・ネットワークの切断と再接続はどのような処理をしていますか。

    ・再接続したとき、修正したデータベースに対しては、どのような処理をしていますか。

    nyandaba さんからの返信、お待ちしております。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2011-12-12T02:33:35+00:00

    北上さん

    MukkuMukuさん

    返信ありがとうございました。

    LAN/WAN環境で動作が重くなることがあり、

    ネットワークの接続が切断された時に再接続の方法が見つからなかったので質問してみました。

    頂いたアドバイスをもとに、

    ネットワークが切断された時の対応方法として、

    サブフォームの[エラー時]イベントにてエラーを取得し、

    DBEngine.Errorsを使用してAccessを強制的に終了することにしました。

    Private Sub Form_Error(DataErr As Integer, Response As Integer)

        If DBEngine.Errors.Count > 0 Then

            Response = acDataErrContinue

            MsgBox "ネットワークが切断されました。Accessを終了します。" _

            & vbCrLf & "作業途中のデータは保存されません。"

            DoCmd.Quit acQuitSaveNone

        Else

            Response = acDataErrDisplay

        End If

    End Select

    色々と詳しく教えて頂き、ありがとうございました。

    この回答は役に立ちましたか?

    1 人がこの回答が役に立ったと思いました。
    0 件のコメント コメントはありません