Access (VBA)

Access VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2016)
ODBC読み出し失敗
投稿日時: 20/12/03 19:19:25
投稿者: yamasho

お世話になります。
 
バックエンドSQL Server、フロントエンドAccessの環境です。
リンクテーブルにしてあります。
 
以下のSQLを実行すると、
「odbc 呼び出しが失敗しました」
となってしまいます。
 
 
strSQL = "INSERT INTO W_テーブル(フィールド1,フィールド2)" _
       & " SELECT フィールド1,フィールド2" _
       & " FROM T_テーブル" _
       & " WHERE ID = " & me!ID
     
cn.Execute strSQL
 
 
毎回ではありません。
レコード件数は約5千件です。
 
Accessのテーブルからテーブル「T_テーブル」を開くと
問題なく開けます。
 
何が問題でしょうか?

回答
投稿日時: 20/12/04 10:41:18
投稿者: Suzu

ODBCのエラーは、接続の失敗や、場合によっては、ユニークキーの重複によっても起こりえます。
 
なので、そのメッセージのみでは判断しかねます。
 
 
1.「ODBCの呼び出しが失敗しました」の他に、番号や詳細は出てきませんか?
    Ex.時間切れやタイムアウト
 
2.バックエンドの SQLServer は、ネットワーク上にあるのでしょうか?
  フロントエンドと同じマシンでしょうか?
 
3. サーバー/クライアント 両方の アップデートが最新か確認
 
4. サーバー/クライアント 定期定期bな再起動
 
5. 操作しようとする対象のテーブルに対し、ロックは掛かっていないか?
   (複数人使用の際の、接続方法やレコードセットタイプ
    或いは、同一マシン上の処理ではあるが、別接続にて接続していないか)
 
6.ネットワーク上であるなら、その時のネットワークトラフィック
   同一マシンであれば、その時のマシン負荷
 
7. ファイヤーウォール・ウィルスソフトを切ってみる
 
8. サーバー側のスリープ設定は無いか。
 
9. サーバー側のハードウェアに問題がないか
 
10.マシンとOfficeのビット数が同一か
   ODBCの接続について、DSNを使用しているのか
 
11. ODBC接続のタイムアウト設定
 
12. ODBCデータソースに 「トレース」があると思います。
   そこで、トレースの実行「トレースの開始」を押し、エラーが発生した際のログファイルを確認する
 
13. ADOではなく、DAOを使用する様にし
    エラーが発生した場合に、DBEngineの Errors コレクションを参照させる様にする
 
確認してみてください。

投稿日時: 20/12/05 16:13:26
投稿者: yamasho

お世話になります。
 
1.「ODBCの呼び出しが失敗しました」の他に、番号や詳細は出てきませんか?
    Ex.時間切れやタイムアウト
 
実行時エラー -2147467259(800004005)
 
が出ます。
 
2.バックエンドの SQLServer は、ネットワーク上にあるのでしょうか?
  フロントエンドと同じマシンでしょうか?
 
同じマシンです。
 
3. サーバー/クライアント 両方の アップデートが最新か確認
 
最新になっています。
  
4. サーバー/クライアント 定期定期bな再起動
 
再起動してもダメでした。
 
5. 操作しようとする対象のテーブルに対し、ロックは掛かっていないか?
   (複数人使用の際の、接続方法やレコードセットタイプ
    或いは、同一マシン上の処理ではあるが、別接続にて接続していないか)
  
私ひとりの利用なので、ロックはかかっていないと思います。
 
6.ネットワーク上であるなら、その時のネットワークトラフィック
   同一マシンであれば、その時のマシン負荷
 
タスクマネージャーで確認しましたが、
負荷がかかっているようには見えません。
  
7. ファイヤーウォール・ウィルスソフトを切ってみる
  
切ってもダメでした。
 
8. サーバー側のスリープ設定は無いか。
 
スリープ設定はしていません。
  
9. サーバー側のハードウェアに問題がないか
 
別のPCでも試しましたがダメでした。
よってハードの問題ではないと思われます。
  
10.マシンとOfficeのビット数が同一か
   ODBCの接続について、DSNを使用しているのか
  
Office2016のボリュームライセンス版を使っています。
Windowsは64ビットですが、
マイクロソフトからの推奨でOfficeは32ビットを使っています。
Officeも64ビットにするのは難しいです。
 
11. ODBC接続のタイムアウト設定
  
すみません、やり方が分かりません。
1分ほどカーソルがクルクルしてからエラーになります。
 
12. ODBCデータソースに 「トレース」があると思います。
   そこで、トレースの実行「トレースの開始」を押し、エラーが発生した際のログファイルを確認する
  
すみません、やり方が分かりません。
 
13. ADOではなく、DAOを使用する様にし
    エラーが発生した場合に、DBEngineの Errors コレクションを参照させる様にする
 
DAOで試してみます。
 
取り急ぎご連絡しました。
 
 
 

回答
投稿日時: 20/12/07 16:41:41
投稿者: Suzu

引用:
実行時エラー -2147467259(800004005)
 
が出ます。

 
これだけでは、判断しかねる状態です。
 
その処理が、
・ループ内の一部なのか違うのか
  ループ内であれば、その中で、接続やロックの変更が起こる処理が行われていないか
・エラーが発生する場合の、Me!ID の値がどうなっていて
  その場合の SELECT はきちんとできるのか?
  また、SELCTされたレコードが、 W_テーブル の ユニーク設定に対し重複を起こさないか?
 
 
引用:
私ひとりの利用なので、ロックはかかっていないと思います。

フォームが連結フォームであり、Connection の参照の仕方によっては、
フォームと別接続と認識される事がありますが、それも含めて ロックが掛かっていない事を確認されている
という認識で良いですか。
また、対象となりえるのは、この場合は、W_テーブル の可能性が高いですが
T_テーブル にロックが掛かる可能性もあります。
両方について確認されたのでしょうか。
 
両テーブル共、リンクテーブルですか?
 
 
引用:
別のPCでも試しましたがダメでした。
よってハードの問題ではないと思われます。

 
テスト環境と同じ環境を別に用意して確認されたのですね。
ありがとうございます。
 
 
引用:
Windowsは64ビットですが、
マイクロソフトからの推奨でOfficeは32ビットを使っています。
Officeも64ビットにするのは難しいです。

 
OSが 64bit でも、Officeが 32bitであれば、リンクテーブル の ODBCドライバには 32bitが使用されます。
32bitのODBCの ドライバ等の確認には、32bitの ODBCアドミニストレータ にて確認する必要があります。
 
最近になっているか確認してみてください。
https://www.walbrix.co.jp/blog/2007-12-64bit-windows-32bitodbc.html
毎回ではないとの事なので、設定がまるっきり悪いと言う事ではありませんが、一応確認しておきましょう。
・ドライバタブでのバージョンが最新か
・接続プールタブでの 接続 ドライバの プールタイムアウト
・ Command や Connection のタイムアウト時間を延ばしてテストを行ってみる
https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15
https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/connectiontimeout-property-ado?view=sql-server-ver15
 
 
引用:
12. ODBCデータソースに 「トレース」があると思います。
   そこで、トレースの実行「トレースの開始」を押し、エラーが発生した際のログファイルを確認する
  
すみません、やり方が分かりません。

リファレンスとしては、下記になりますが、DAOでもエラーになるなら試してみてください。
詳しい情報については ネット検索を掛けてみてください。
https://docs.microsoft.com/ja-jp/sql/odbc/admin/setting-tracing-options?view=sql-server-ver15
 
 
優先確認の順番としては
1. ある特定の ID の値の際には、エラーになるのか。
   なる場合には、そのレコードに問題がないかの確認。
 
2. ドライバが最新になっているか
 
3. DAO にて同じ処理を行ってみて エラーが発生する場合には Errorオブジェクトの確認
 
4. ODBC のトレース
 
の順にて行ってみてください。

トピックに返信