C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 「ODBC 呼び出しが失敗しました」のエラーで困っています。


(過去ログ 88 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■52303 / inTopicNo.1)  「ODBC 呼び出しが失敗しました」のエラーで困っています。
  
□投稿者/ エルドラド (1回)-(2010/08/05(Thu) 11:29:28)

分類:[その他の言語] 

 
お世話になります。

以下のようなAccessプログラムがあるのですが
ODBC 呼び出しが失敗しました(エラーaF3146)がたまに発生し困っております。

【環境】
  OS:Windows 2003 Server + SP2
  DB:SQL Server 2005 + SP3
  Access2000 + SP3

※いずれも同じサーバー機上で動作しています。

不定期にSQL Server上に作られるデータ(仮に"テーブルA"とします)を
一定時間毎にタイマーで監視し、条件にあうデータが存在すれば
そのデータを元に帳票の印刷 or スナップショットファイルの作成を行うAccessプログラムです。

・AccessからSQL Serverのテーブルに対してリンクを張っています(ODBC)
・帳票はAccessのレポート機能でレイアウトを作成しています。
・リンクしたテーブルを使用したクエリがあります。
・レポートのレコードソースに上記のクエリを指定しています。

タイマー1(30秒間隔)
 SQL SeverにADO接続し、ストアドプロシージャを起動しています。ストアドの内容は↓
 テーブルAに条件にあうデータが存在すればその情報を元にテーブルB、テーブルCを作成(トランザクション処理)

タイマー2(0.5秒間隔)
 テーブルB、テーブルCを監視し、存在すれば帳票の印刷 もしくは スナップショット作成を行います。
 帳票の印刷、スナップショットファイルの作成はVBAにて、DoCmd.OpenReport、DoCmd.OutputTo を使用しています。


所々にログメッセージをテキスト出力するロジックを追加しエラーが発生してる箇所は特定できました。
帳票の印刷、スナップショット作成(DoCmd.OpenReport、DoCmd.OutputTo)の行で発生しているようです。
ただ、印刷処理が行なわれる度に必ずエラーが発生する訳ではなく、100件、200件程度の印刷が
正常に処理された後にエラーが発生することが多いです。


何かお気づきの点がございましたらよろしくお願いします。

引用返信 編集キー/
■52306 / inTopicNo.2)  Re[1]: 「ODBC 呼び出しが失敗しました」のエラーで困っています。
□投稿者/ 魔界の仮面弁士 (1733回)-(2010/08/05(Thu) 12:36:02)
No52303 (エルドラド さん) に返信
> ODBC 呼び出しが失敗しました(エラーaF3146)がたまに発生し困っております。

実行時エラー'3146' ODBC--呼び出しが失敗しました。のエラーについては、
発生原因が多岐に渡るので、なかなか追跡しにくいのですよね…。

・Errors コレクションに、追加のエラー情報が格納されていないか確認する。

・タイムアウトの可能性を考慮し、ODBCTimeout や QueryTimeout などを調整してみる。

・件数が多いとエラーになるパターンや、特定のデータが来たときにエラーになるパターンも
 あるので、同じデータに対して再現性があるかどうかを確認しておいてください。

・型の違いに注意。INNER JOIN や WHERE などにおいて、decimal/integer/varchar といった
 異なる型を比較してしまうと、特定のデータの組み合わせで ODBC 側がエラーになる事があります。
 (特に、mdb 側のテーブルと連結していて、異種 DB 間クエリーとなっている場合)

・稀にドライバー側の問題という事もあるので、修正プログラムが存在しないか調査する。
 (可能であれば、他社製の有償 ODBC ドライバに差し替えて検証してみる)

・どうしても駄目なら、レポート作成時に ODBC テーブルをインポートしてしまい、
 (またはサーバー側から mdb にエクスポートさせる)、それを利用する。
引用返信 編集キー/
■52420 / inTopicNo.3)  Re[2]: 「ODBC 呼び出しが失敗しました」のエラーで困っています。
□投稿者/ エルドラド (2回)-(2010/08/09(Mon) 10:08:26)
No52306 (魔界の仮面弁士 さん) に返信

お世話になっております。
返答が遅くなり申し訳ありません。

> 実行時エラー'3146' ODBC--呼び出しが失敗しました。のエラーについては、
> 発生原因が多岐に渡るので、なかなか追跡しにくいのですよね…。
>
> ・Errors コレクションに、追加のエラー情報が格納されていないか確認する。

DBEngine.Errors から詳細なエラー情報(?)を得られるようにコーディングを追加してみました。
次回エラーが発生したときにもう少し詳しい情報が得られるといいのですが。。。


> ・タイムアウトの可能性を考慮し、ODBCTimeout や QueryTimeout などを調整してみる。

・ADOのCommandTimeout
・QueryTimeout
・クエリをデザインで開き、クエリロパティの「ODBCタイムアウト」

以上3つに関しては 600(10分間)を設定しています。


> ・件数が多いとエラーになるパターンや、特定のデータが来たときにエラーになるパターンも
>  あるので、同じデータに対して再現性があるかどうかを確認しておいてください。

エラーが発生した場合、タイマーによる監視をストップするようにしています。
再度プログラムをスタートするとエラーで正常に印刷されなかったデータから処理を始めますが
その時は正常に印刷されます。


> ・型の違いに注意。INNER JOIN や WHERE などにおいて、decimal/integer/varchar といった
>  異なる型を比較してしまうと、特定のデータの組み合わせで ODBC 側がエラーになる事があります。
>  (特に、mdb 側のテーブルと連結していて、異種 DB 間クエリーとなっている場合)

mdb側にはテーブルは存在せず、データは全てリンクテーブルから得ています。


> ・稀にドライバー側の問題という事もあるので、修正プログラムが存在しないか調査する。
>  (可能であれば、他社製の有償 ODBC ドライバに差し替えて検証してみる)

管理ツール → データソース(ODBC) → システムDNS 等を新規作成する時に選ぶ
データソースのドライバーの事でしょうか?

現状は

名前   :SQL Server
ファイル :SQLSRV32.DLL

を使用しています。

他に SQL Native Client というドライバが存在します。
こちらのドライバを使用するべきだったのでしょうか。
とりあえずこちらのドライバを使用するように変更してみました。


> ・どうしても駄目なら、レポート作成時に ODBC テーブルをインポートしてしまい、
>  (またはサーバー側から mdb にエクスポートさせる)、それを利用する。

参考にさせていただきます。


今のサーバー機を使う以前は以下の環境で同じAccessプログラムを使用していました。

【環境】
  OS:Windows 2000 Server + SP4
  DB:SQL Server 2000 + SP不明
  Access2000 + SP反映せず

この時はODBCエラーの発生は数ヶ月に1回という程度でした。
今のサーバー機に変わってからは、まとめて印刷処理が発生する週1日に1,2回はエラーが発生します。

OSやDBのバージョンも関係しているのでしょうか。。。

引用返信 編集キー/
■52450 / inTopicNo.4)  Re[3]: 「ODBC 呼び出しが失敗しました」のエラーで困っています。
□投稿者/ すなふきぬ (26回)-(2010/08/09(Mon) 23:08:35)
No52420 (エルドラド さん) に返信
> ■No52306 (魔界の仮面弁士 さん) に返信
>
> この時はODBCエラーの発生は数ヶ月に1回という程度でした。
> 今のサーバー機に変わってからは、まとめて印刷処理が発生する週1日に1,2回はエラーが発生します。

以前から不具合はあったみたいですね。

ソース見ていないので何とも言えませんが、テーブルB、Cのデッドロックとかの可能性はないですか?
あと、B,Cの存在判定はテーブルの有無だけで判断されてそうですが、ストアドのトランザクション側でロック処理はされていますか?
ACCESS側でエラー処理(On Error GoToとか)をされていますか?

おそらく、以前から不具合が発生していたということは、設計ミスの可能性があるので落ち着いて考えてみるのが良いと思います。
引用返信 編集キー/
■52512 / inTopicNo.5)  Re[4]: 「ODBC 呼び出しが失敗しました」のエラーで困っています。
□投稿者/ エルドラド (3回)-(2010/08/12(Thu) 10:04:34)
No52450 (すなふきぬ さん) に返信

> 以前から不具合はあったみたいですね。
> ソース見ていないので何とも言えませんが、テーブルB、Cのデッドロックとかの可能性はないですか?
> あと、B,Cの存在判定はテーブルの有無だけで判断されてそうですが、ストアドのトランザクション側でロック処理はされていますか?
> ACCESS側でエラー処理(On Error GoToとか)をされていますか?

On Error の記述はしていますがエラーとして返ってくるのは「ODBC 呼び出しが失敗しました」のみでした。
そういう仕様(?)みたいですね。


今週早々にODBCのドライバを"SQL Server"から"SQL Native Client"に変えてみましたが昨日また同じエラーが発生してしまいました。
ただ今回は DBEngine.Errors から詳細なエラー情報を得ることができました。
結果を申しますと テーブルBにもCにも関係なく、まったく別のテーブル(ログテーブル)のInsert時のキー重複エラーが原因でした。
※印刷処理時にレポートのロジックでログの書込み処理があったのを見落としていました。

原因が判明しましたのでプログラム修正を行い、様子を見てみようと思います。ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -