dポイントプレゼントキャンペーン実施中!

DB2のデーターベースに、ADOで接続して、レコードを取得していますが、同じ事をして、取得出来るときと、できないときがあります。
できない時は、objRec.EOF=true
になり、処理が終了してしまいます。
誰が、この原因の探り方や、ヒントなどわかる人がいたら、教えていただけませんでしょうか。

以下、ソースの引用
Set objCon = WScript.CreateObject("ADODB.Connection")
strCon="DSN=mans;UID=admin;PWD=pass"

objCon.Open strCon

Set objRec=CreateObject("ADODB.Recordset")
objRec.Open strSQL, objCon, adOpenStatic

If objRec.EOF Then
Wscript.Echo "no data!"
WScript.quit
End If

後の処理に進む

A 回答 (4件)

scriptから実行したことがないので、エラー内容がよくわかりませんが、


一度目でできなくてその後できるようになるというのは、timeoutを食らっている可能性があると思います。
objCon.ConnectionTimeout
の値を倍くらいに設定してみたら何か変わりますか?
若しくは、VB(A)から同じコードを投げたら、別のエラーメッセージが帰ってきますか?
    • good
    • 0
この回答へのお礼

お返事が遅れましてすみませんでした。
仕事で忙しくてなかなか回答を確認する時間がありませんでした。
おっしゃるとおり、接続タイムアウトの時間が短かったのが原因だったです。
ご指摘の通り、その設定を私の場合は、360秒と長くするとこの現象はなくなりました。

お礼日時:2010/03/12 23:09

今までは何ともなかったが突然


生じるようになったのならば
DB2やプログラムの問題ではなく、
別の問題でしょうね。あるいは
端末のOSに問題がある場合もありうる
ということもちらっと浮びます。VISTA
での挙動は時折耳にします。当方は
MySQL、PostgreSQL、XPなので再現はできま
せん。すこし前もレコードセットを
VISTAに落とす時の挙動についてここで
書き込みをしています。
vbsのバージョン、ADOや他のミドルウエア
の問題まで考えるのかというところですかね。
    • good
    • 0
この回答へのお礼

お返事が遅れましてすみませんでした。仕事が忙しくなかなか見る暇がありませんでした。
丁寧なアドバイス、ありがとうございます。

お礼日時:2010/03/12 23:13

1番目と3番目はあまり意味のない


ものかもしれません。目的は
MoveFirstが機能し、かつカレント
レコードがない場合にエラーを
返すかがポイントです。
そのうえでMoveFirstでカレント
レコードの位置を先頭にもっていき、
質問のEOFがTrueとならないように
でき、次の処理行くことができる
ようにする、ということです。
したがって、本命は2番目の方法が
機能するかです。
これで対処できなければまったく
別の問題があるのではと思います。

この回答への補足

ご回答有難うございました。おっしゃる事はよくわかります。ただ、わたしのばあい、一回vbsファイルを実行してレコードが取れず、その同じファイルを直ぐに実行すると、二回、三回実行するうちに、レコードが取得出来たりするんです。別のSQLツールでレコードが取得できるのを確認した上で、実行してます。
こんな、へんな動きをするのはいま迄見た事がありません。
割り込みが発生したというエラーがでた事もありますが、このエラーの原因は一つとは限らないようです。
私が作ったプログラムでは、最初、レコードが取得出来ない時にも、もMoveFirstを実行しようとしてたので、発生したように思います。

補足日時:2010/02/28 22:04
    • good
    • 0

DB2がADOをどこまでサポートしているかは


わかりませんが、MoveFirstはサポート
していると思いますので、

On Error Resume Next
objRec.MoveFirst
If objRec.EOF Then
Wscript.Echo "no data!"
WScript.quit
End If
On Error Goto 0

とするか、

On Error Resume Next
objRec.Movefirst
If Err.Number = 0 Then
WScript.Echo "no data!"
WScript.Quit
End If
On Error Goto 0

とするか、あるいは

On Error Resume Next
objRec.Movefirst
If Err.Number = 0 Then
WScript.Echo "no data!"
WScript.Quit
End If
On Error Goto 0

On Error Resume Next
If objRec.EOF Then
Wscript.Echo "no data!"
WScript.quit
End If
On Error Goto 0

と続けてみるかです。

として強制的にカレントレコードの
位置を最初のレコードにしたらどう
でしょう。
レコードがなければエラーがでるし、
レコードがあればエラーナンバーは
0でIf文を抜けます。
エラーがなければOn Error Goto 0で
On Error Resume Nextを無効化して
次に進みます。そのときはカレント
レコードの位置は最初のレコードに
設定されています。
最初はOn Error Resume Nextと
On Error Goto 0をはずして空の
テーブルに対して実行してみて
エラーが出るようであれば
MoveFirstが機能しているいうことで
もとに戻し、データのあるテーブルで
実行してみてください。
最初の方法は何か矛盾を含んで
いますが。
こんなところです。ほかに何かあったかな。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!