SQL実行エラー 重大な例外について

解決


さやか  2006-08-08 18:42:14  No: 96220

いつもお世話になっております。
ネットやマイクロソフトのサイトで散々調べましたが
原因、解決方法が分からなかった為、質問させて頂きます。

開発環境
VB6.0
SqlServer2000  Version8.0

今のプログラムで、データ抽出条件画面があります。
例えば、年齢、性別、氏名等。
年齢指定をすれば、SQLに年齢条件が追加される、
性別条件も指定すれば、さらにSQLに追加される
最終的に、全ての繋がったSQLを実行して抽出する
プログラム仕様になっています。

今回、これに新たな条件「来店日(仮)」を追加しました。

ここで問題が起こったのですが、「来店日」を条件に
実行すると、正しくSQL通り抽出されるのですが、
連続して抽出を実行すると、
-------------------------------------------------------
[SQL実行エラー  -2147217900]
SqlDumpExceptionHandler:プロセス51で重大な例c0000005  
EXCEPTION_ACCESS_VIOLATIONが発生しました。
SQL Serverはこのプロセスを終了していま…
-------------------------------------------------------
というエラーメッセージが表示されます。

一件、SQLの問題ではと思い、そのSQLを、SQLクエリアナライザで
繰り返し実行しましたが、問題なく抽出出来ました。

VBでのSQL実行処理は、同期実行で、
コードとしては、
-------------------------------------------------------
Dim AdoCon      As ADODB.Connection
'--- 新規の接続を開く ---
Set AdoCon = New ADODB.Connection
'--- 同期実行 ---
AdoCon.Execute vstrSql, rlngRecordCount  
-------------------------------------------------------

同じ条件でSQLを実行すると、
上記コードの、「AdoCon.Execute」で、エラーとなります。

自分として納得出来ないのは、今回追加した「来店日」を
条件に入れた状態で、「連続」抽出するとエラーになるという事です。
SQLクエリアナライザでは問題なく動き、VB側でも、一回目、または
別の条件を実行してから(同じ条件を連続実行しない為)
再度「来店日」を条件に入れて抽出すると正常に動くという事です。

AdoCon.Executeに、私の知らない暗黙のルールでもあるのかと
思い、こちらに質問させて頂きました。

「それはSQL板だ」等ご指摘でもお願いしたいと思います。

ご指摘、ご教授、どうぞ宜しくお願いします。


特攻隊長まるるう  2006-08-08 19:33:59  No: 96221

連続して実行した場合に失敗する場合は、接続を
閉じてないことが多いんですが、使い終わった接続
(Connection)とかは終了処理を実行していますか?

もしくは、何度も実行する事が分かっているなら、
接続を開いたまま、その接続を使いまわし、コマンドの
実行のみ繰り返すという設計にします。


さやか  2006-08-08 20:45:45  No: 96222

特攻隊長まるるう様、早々のレスありがとうございます。

SQL実行後、毎回ConnectionのCloseをしております。

-------------------------------
'--- 同期実行 ---
AdoCon.Execute vstrSql, rlngRecordCount
'--- 新規の接続を閉じる ---
AdoCon.Close

Set AdoCon = Nothing
-------------------------------

また、常に連続実行するとは限らないので、
毎回接続を閉じるようにしています。

予想ですが、ユーザーさんが連続実行する場合は
年齢、来店日を条件にして実行し、抽出結果人数が少ないので
年齢幅を広げて再実行とかいうパターンだと思います。

不思議なのは、「来店日」の期間を2006/01/01〜2006/02/01
で2回連続実行するとエラーになるのに、
2回目以降、範囲日付を変えていくとエラーにならない事です。
---------------------------------
1回目:2006/01/01〜2006/02/01
2回目:2006/01/01〜2006/02/02
3回目:2006/01/01〜2006/02/03
4回目:2006/01/01〜2006/02/02(←2回目と同じにすると…)
---------------------------------
4回目でエラーになります。

こうなると、SQLの問題なのかと思えてもくるのですが、
最初に書きました通り、クエリアナライザでは問題なく通るSQLなので
かなりやっかいなエラーだと感じております。


特攻隊長まるるう  2006-08-08 21:33:34  No: 96223

エラーメッセージの『EXCEPTION_ACCESS_VIOLATION』から
いくつか情報が引っ掛かったけど、Ver7.0のバグでならあった
らしい。。。
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B314117
…関係ないですかねぇ。ま、他の人の回答も待ってみてください。


あん  2006-08-08 22:13:32  No: 96224

SQLプロファイラで
VBで実行したときと
クエリアナライザで実行したときの
違いを調べてみれば何かわかるかも


さやか  2006-08-08 22:13:52  No: 96225

特攻隊長まるるう様、ご丁寧にありがとうございます。

こちらでも調べていて、SQLServerのバグかも…
と原因の一つの候補にはしていましたが、
このシステムは各地で稼動している為、
サービスパックをあてるのは難しいのが現状です。
(同じシステムの人がSP4をインストールしようとして
  失敗したと言っていました。やり方の問題かもしれませんが。)

SQLになると、別板になってしまいますね。
VB+SqlServer2000の組み合わせは多いと思いますので、
レスくださったように、他の人の回答も待たせて頂きます。

その間に、エラーの出るSQLを書き直して試してみます。
それでエラーが出なくなれば、また書き込みさせて頂きます。

ありがとうございます。


さやか  2006-08-08 22:39:50  No: 96226

あん様、レスありがとうございます。

SQLプロファイラの存在を初めて知り、
今使い方で苦戦中です。

VBでエラーになると、SQLServerが暴走するのか、
タイムアウトになる事もあり、
再起動しないとDBが使用不可となる為、
危険ではありますが、何もしないよりいいので、
出来る限り調べてみます。

ありがとうございます。


もげ  2006-08-09 01:47:11  No: 96227

サービスパックはいくつがあたってますか?
[FIX] SQL Server 2000 Service Pack 3 をインストール後、SQL Server が起動せず、アクセス違反が発生する
http://support.microsoft.com/default.aspx?scid=kb;ja;814572


さやか  2006-08-09 02:02:08  No: 96228

もげ様、レスありがとうございます。

サービスパックは全く当たっていない状態です。

話はそれますが、大事なOS環境を記述するのを忘れていました。
win2000  sp4です。
(WINDOWSにはサービスパックが当たってます…。)

他の条件のSQLはどれだけVBで繰り返し実行しても
タイムアウト等のエラーは出ないので、VBのADO関係かと
思ったのですが…。
SQL寄りになってしまいすいません。


シロ  2006-08-09 02:18:22  No: 96229

以下、何かのご参考にでもなれば

・ADOに値を設定する際の型は、来訪日の型と一致していますか?
・根本解決ではないですが、もし>=、<=で範囲していしているのであれば
  betweenにしてもエラーは出ますでしょうか。


あん  2006-08-09 03:12:37  No: 96230

SQLサーバーにはキャッシュ機能があります。
同じSQL文があるとキャッシュを使用する場合があります。
キャッシュを使用しようとするとメモリエラーがでるみたいですね。
キャッシュうの検索キーはSQL文になっていますので
試しに、同じSQL文でも多少違う文にすると
エラーにならないでしょう。  試してみてください。
エラーにならなければ、SQLサーバーのキャッシュ機能の不良ですね。


もげ  2006-08-09 04:13:46  No: 96231

バグのFIXやセキュリティ対策が行われているので、
SQLServerのサービスパックの適用を強く推奨します(SP3a以上)。
あと、ADO(MDAC)も最新にしておきましょう。
SQLServer2000へアクセスするには、
MDACは2.6以上が前提条件になります。


さやか  2006-08-09 19:40:19  No: 96232

早々にレスを頂いていたのに気づくのが遅れて失礼しました。

シロ様
期間指定の仕方によっては、「>=」「<=」「BETWEEN」全て使います。
先ほど「<=」の条件で連続実行を行ってみましたら、
SqlServerが暴走(?)して再起動しました。

>ADOに値を設定する際の型は
上記は、SQL文の「来店日」の型の事でしょうか。
だとしましたら、問題ないと思います。

あん様
2006/08/08(火) 11:45:45に書き込みしましたように、
確かに少しでも違う条件だと、エラーになりません。
キャッシュ機能があるという事は知っていましたが、
それがどう悪さ(?)をするのかはわかっていません。

>エラーにならなければ、SQLサーバーのキャッシュ機能の不良ですね。
泣けてきます…。

これはSQL文によるのでしょうか。
エラーの起こるSQL文は、集計関数とサブクエリを使用し、
クエリアナライザで実行すると2秒で結果が出るものです。
これを、昨日作り変えて、SQLは少し簡略的になったが
実行に7秒かかるものにしました。

作り変えたSQLでは、時間はかかるものの、繰り返し
同じ条件で実行してもエラーが出なくなりました。

クエリアナライザでは問題ないのに、VBでADOのExecuteで
実行するとエラーになる理由がわからないんです…。

もげ様
そうですね、サービスパックはあてるべきだと思います。
しかしながら、当システムは、複数各地のユーザーに
VBのEXEのみを配信する形になっており、
サービスパックの配信までは出来ない状況です。
(ユーザーさんはサービスパックをあてれるスキルはありません。)
なので、SqlServerのサービスパックを開発者の私のPCに入れて
正常動作しても、各地で動いているPCと環境が異なってしまい、
不具合の原因となってしまいます。

SQLを変更すれば動く事が確認出来たので、おそらくその方向で
対応すると思います。
処理時間がかかる件は、上と相談になると思います。
SQLのサービスパックについても、今後対応を必要とすると思います。

>あと、ADO(MDAC)も最新にしておきましょう。
C:\Program Files\Common Files\System\ado\msado15.dllの
バージョンを確認した所、2.61.7326.0でした。
こっちは大丈夫そうです。

------------------
頂いたレスへのお返事が遅くなり失礼いたしました。
レスありがとうございます。


あん  2006-08-09 20:25:19  No: 96233

>クエリアナライザでは問題ないのに、VBでADOのExecuteで
>実行するとエラーになる理由がわからないんです…。
SQLプロファイラで違いを確認してみましたか?


さやか  2006-08-09 21:08:44  No: 96234

あん様
>SQLプロファイラで違いを確認してみましたか?

すいません、使い方がよくわからなかったのと、
連続実行すると高確立でフリーズしてSqlServerが使えなくなり
PC再起動になるので調査が出来ない状態です。

Sort Warnings(メモリ内でソートが完了しなかったとき)
が出ているので、他の条件でもこれが出るか確認してみます。

SQLサーバーがダメになったので再起動します。


さやか  2006-08-09 22:48:52  No: 96235

プロファイラで確認した所、
クエリアナライザでVBでエラーとなるSQLを実行しましたら
-------------------------
SQL:BachCompleted  |  SQL文
-------------------------
と表示されるだけでした。

VBで実行しますと、
-------------------------
Audit Login
SQL:BachCompleted  |  SQL文
Audit Logout
-------------------------
と表示され、二度目に実行すると、
-------------------------
Audit Login
-------------------------
で止まり、SQLサーバーがフリーズ状態になります。

調べるポイントが違いますでしょうか。

現状、VBよりSQLサーバー寄りになってきており、
エラーが出るSQLを書き直したらエラーが出なくなった事が
わかりましたので、原因は不明なままですが、
こちらでは解決にした方がいいかと思います。

しかしながら、調査漏れの指摘やご指導があればと思い、
勝手ながら解決チェックまでは少し時間をあけさせてください。

今の時点では、同じ現象が出てお困りの方は、
①SQLサーバーのサービスパックをあててみる。
②SQL文を変えてみる。
③プロファイラで調査してみる。
※VBのDB接続チェックが正常な事前提。
ですね…。

皆様、貴重なお時間を割いて頂きありがとうございます。


さやか  2006-08-11 01:58:04  No: 96236

お世話になります。

結果報告させて頂きます。

苦肉の策で、原因だけでも掴む為、
SQLサーバーにSP4をあてました。
(エラー時はSPが全くあたっていない状態でした。)

その結果、同じSQLを実行してもエラーが起こらなくなりました。

各地のPCにどうにかしてSP4をあてる方法を考えるか、
その他の方法になるかはわかりませんが、
解決しましたので完了とさせて頂きます。

回答頂いた皆様、ありがとうございました。
また、プロファイラの存在を教えてくださった、あん様、
あれ以来調査に使用しています。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加