QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

ASPでADODB.Recordset エラー発生

お世話になります。
旧環境(Windows2000 + Oracle8.1.6 + 【Microsoft ODBC for Oracle】 + ASP + IIS5.0)で実行できていたASPのPGを
新環境(Windows2003 Server + Oracle9.2.0.1 + 【Oracle in OraHome92】 + ASP + IIS6.0)へ移行しようとしたら
以下のエラーが出てしまいます。
エラーメッセージとソース(エラーが出ているであろう部分のみ)を以下に記述します。

####エラーメッセージ####
ADODB.Recordset エラー '800a0e78'

オブジェクトが閉じている場合は、操作は許可されません。

####①エラーが出ているソース####
Set objCon = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.Recordset")
objCon.Open "AAA","user","password"
strSQL="SELECT TRUNC(SYSDATE) TARGET_DATE FROM DUAL "

objRS.Open strSQL, objCon, 3

*ここらへんでエラーが出ている模様*
if objRS.RecordCount > 0 then
if IsNull(objRS("TARGET_DATE")) then
target_date_temp_ = Date
else
target_date_temp_ = objRS("TARGET_DATE")
end if
else
target_date_temp_ = Date

end if

また、他にも移行したPGがありますが、そちらは正常にDBから値を取得できています。
そのソースも以下に記述します。

####②正常に実行されるソース(一部)####
Set db=Server.CreateObject("ADODB.Connection")
db.open "BBB","user","password"
strSQL="SELECT TRUNC(SYSDATE) TARGET_DATE FROM DUAL"

Set rs=db.Execute(strSQL)

恐らく、Recordsetオブジェクトの使い方が悪いのかなぁと思うのですが(エラーの出ない②は
Recordsetオブジェクトは使用していないので・・・)、腑に落ちないが、旧環境ではエラーが
出ないのに、なぜ新環境でエラーが出るのか?

以上、長くなってしまいましたが、よろしくお願いしますm(_ _)m

質問者:まちゃみん

回答

まちゃみんさんの書き込み (2005-09-06 10:59) より:

エラーメッセージとソース(エラーが出ているであろう部分のみ)を以下に記述します。

ここらへんでエラーが出ている模様

そういう場合は、怪しい部分の前後に何かを出力するコードを入れたりしましょう。
発生場所を完全に特定することで、初めてデバッグが開始できます。

オブジェクトが閉じている場合は、操作は許可されません。

うーん。

objRS.Open strSQL, objCon, 3

これをやめて、ADODB.Connection または Command の、
Execute メソッドから Set してもダメですかね?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさん、ご返答ありがとうございます。

RecordCountプロパティを使用したかったので、Recordsetオブジェクトを使用しています。
SQLでカウントを取るようにすれば、Recordsetオブジェクトは使用せずにADODB.Connectionの
Execute メソッドで実行できるようになると思うんですが、DBのデータ量が結構あるし、
カウントを取りたいSQL文も×8本くらいあるので、できればSQLでカウントするのは避け
たいのです。

どうすればRecordsetオブジェクトを使えるようになるんでしょう?
まさか、自分の新環境下では使えない?
ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓

投稿者:まちゃみん

編集 履歴 (0)

じゃんぬねっとさん、ご返答ありがとうございます。

RecordCountプロパティを使用したかったので、Recordsetオブジェクトを使用しています。
SQLでカウントを取るようにすれば、Recordsetオブジェクトは使用せずにADODB.Connectionの
Execute メソッドで実行できるようになると思うんですが、DBのデータ量が結構あるし、
カウントを取りたいSQL文も×8本くらいあるので、できればSQLでカウントするのは避け
たいのです。

どうすればRecordsetオブジェクトを使えるようになるんでしょう?
まさか、自分の新環境下では使えない?
ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓

投稿者:まちゃみん

編集 履歴 (0)

こんにちは。

ADOのRecordSetのOpenメソッドについてもっと詳しく調べてみましょう。

パラメータの設定でレコードカウントの取得ができるはずです。

ここらへんでエラーが出ている模様
もう少し根気強くやるべきだと思います。
ASPについてはネットで探せばいくらでも資料がありますよ。

投稿者:とっと

編集 履歴 (0)

とりあえず。
RecordsetのRecordCountがうまく取れていない可能性があります。

「On Error Resume Next」を入れて、
徹底的にデバッグしてみては?

おそらく、
>objRS.Open strSQL, objCon, 3

>if objRS.RecordCount > 0 then
あたりでエラーが起きているのではないかと思います。

「If Err.Number<>0 Then 〜」で調べてみては?
おそらくこれでは答えは出ませんが、突破口にはなると思います。

投稿者:らい

編集 履歴 (0)

連続カキコすいません。

まちゃみんさんの書き込み (2005-09-06 10:59) より:

####①エラーが出ているソース####

Set objCon = Server.CreateObject("ADODB.Connection")

Set objRS = Server.CreateObject("ADODB.Recordset")

objCon.Open "AAA","user","password"

strSQL="SELECT TRUNC(SYSDATE) TARGET_DATE FROM DUAL "

objRS.Open strSQL, objCon, 3

えと、常駐先にはOracleは入っていないので、ほかのもので実験してみたのですが、
どれでもカウントを取れるみたいですねぇ。
ただ、ちょっと下のコードを試してみてもらえます?

objRS.Open strSQL, objCon, 0, 1

いわゆる、デフォというやつですが。
(最後の1は、念のためReadOnlyにしているハズです。)

投稿者:らい

編集 履歴 (0)

Recordsetのエラーではなく、
結局ConnectionがOpen状態で確立できていないのでは
ないでしょうか。

objCon.StateがadStateOpen(=1)になっていることは
確認しましたか?

確かProviderがRecordCountをサポートしない場合も
値としては-1が返ってきて、エラーになることはなかったように記憶しています。

投稿者:platini

編集 履歴 (0)

まちゃみんさんの書き込み (2005-09-06 13:53) より:

RecordCountプロパティを使用したかったので、Recordsetオブジェクトを使用しています。

あれ? Execute メソッドの戻り値は Recordset じゃなかったでしたっけ?

で、先にも書いたように場所の特定はまだですか?

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

らいさん

えぇと、言葉で表現するのが難しいのですが、らいさんの指摘にあったobjRS.Open strSQL, objCon, 0, 1 に変えて実行したところ、
DBから値を取得できるようになったのですが、相変わらず、objRS.RecordCountが上手く動作
していません。(-1が返ってきます)
platiniさんの書込みに「RecordCountをサポートしない場合、-1が返ってくる」
とありますが、これはやはりサポートしていないんでしょうか?

投稿者:まちゃみん

編集 履歴 (0)

じゃんぬねっとさん

お世話になります。
らいさんのご指摘どおりにデバックを行い、エラー箇所、ようやく特定できました。
遅くなりましてすみませんでした。

objRS.Open strSQL, objCon, 3
↑ここは正常にオープンできています。

if objRS.RecordCount > 0 then
↑やはりここでエラーとなっています。

以上、よろしくお願いします。

投稿者:まちゃみん

編集 履歴 (0)

じゃんぬねっとさんの書き込み (2005-09-06 16:19) より:

あれ? Execute メソッドの戻り値は Recordset じゃなかったでしたっけ?

そのはずです。

まちゃみんさんの書き込み (2005-09-06 16:54) より:

if objRS.RecordCount > 0 then

↑やはりここでエラーとなっています。

どんなエラーが起こっているのか書いてもらえないとわからないです。
とりあえず、Err.Descriptionや、Hex(Err.Number)を取得して調査してみましょう。

あと、逆に本当に「objRS」にRecordsetが入っているかどうかも調べてみましょう。
もしかしたら、入っていないかも。
確認してみるには、




iCnt = 0
While Not objRS.EOF
  iCnt=iCnt + 1
  objRS.MoveNext
Wend
Response.Write iCnt

とやってみて、0以外の数字が表示されたら、何か入ってる…って、
これは完全にカウントじゃないか!Σ(‾□‾

# かなり時間がたってるので、もしかして解決してるかも。

投稿者:らい

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。