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

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


【やりたいこと】
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を再起動すると直りますが、修正した内容は反映されません。


【質問】
ネットワークが切断された時に発生するエラーの取得方法を教えてください。
また、ネットワークを切断してもその間に修正した内容を反映させる方法があれば教えてください。
よろしくお願いします。

回答
回答
こんにちは、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接続でコネクションを管理しながらという感じでしょうか。

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

150 ユーザーがこの回答を役に立ったと思いました。

·

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

お役に立てず、申し訳ございません。

素晴らしい! フィードバックをありがとうございました。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。おかげで、サイトの改善に役立ちます。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。

回答
回答
nyandaba さん、こんにちは。
Answers への投稿、ありがとうございます。

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

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

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

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

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

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

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

1 人がこの回答を役に立ったと思いました。

·

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

お役に立てず、申し訳ございません。

素晴らしい! フィードバックをありがとうございました。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。おかげで、サイトの改善に役立ちます。

この回答にどの程度満足ですか?

フィードバックをありがとうございました。

 
 

質問情報


最終更新日: 2024年5月10日 表示数 21,550 適用先: