- - PR -
ASPでADODB.Recordset エラー発生
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-06 10:59
お世話になります。
旧環境(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から値を取得できています。 そのソースも以下に記述します。 ####A正常に実行されるソース(一部)#### 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オブジェクトの使い方が悪いのかなぁと思うのですが(エラーの出ないAは Recordsetオブジェクトは使用していないので・・・)、腑に落ちないが、旧環境ではエラーが 出ないのに、なぜ新環境でエラーが出るのか? 以上、長くなってしまいましたが、よろしくお願いしますm(_ _)m | ||||||||||||
|
投稿日時: 2005-09-06 11:59
そういう場合は、怪しい部分の前後に何かを出力するコードを入れたりしましょう。 発生場所を完全に特定することで、初めてデバッグが開始できます。
うーん。
これをやめて、ADODB.Connection または Command の、 Execute メソッドから Set してもダメですかね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2005-09-06 13:53
じゃんぬねっとさん、ご返答ありがとうございます。
RecordCountプロパティを使用したかったので、Recordsetオブジェクトを使用しています。 SQLでカウントを取るようにすれば、Recordsetオブジェクトは使用せずにADODB.Connectionの Execute メソッドで実行できるようになると思うんですが、DBのデータ量が結構あるし、 カウントを取りたいSQL文も×8本くらいあるので、できればSQLでカウントするのは避け たいのです。 どうすればRecordsetオブジェクトを使えるようになるんでしょう? まさか、自分の新環境下では使えない? ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓ | ||||||||||||
|
投稿日時: 2005-09-06 13:53
じゃんぬねっとさん、ご返答ありがとうございます。
RecordCountプロパティを使用したかったので、Recordsetオブジェクトを使用しています。 SQLでカウントを取るようにすれば、Recordsetオブジェクトは使用せずにADODB.Connectionの Execute メソッドで実行できるようになると思うんですが、DBのデータ量が結構あるし、 カウントを取りたいSQL文も×8本くらいあるので、できればSQLでカウントするのは避け たいのです。 どうすればRecordsetオブジェクトを使えるようになるんでしょう? まさか、自分の新環境下では使えない? ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓ | ||||||||||||
|
投稿日時: 2005-09-06 14:53
こんにちは。
ADOのRecordSetのOpenメソッドについてもっと詳しく調べてみましょう。 パラメータの設定でレコードカウントの取得ができるはずです。 >**ここらへんでエラーが出ている模様** もう少し根気強くやるべきだと思います。 ASPについてはネットで探せばいくらでも資料がありますよ。 | ||||||||||||
|
投稿日時: 2005-09-06 15:02
とりあえず。
RecordsetのRecordCountがうまく取れていない可能性があります。 「On Error Resume Next」を入れて、 徹底的にデバッグしてみては? おそらく、 >objRS.Open strSQL, objCon, 3 か >if objRS.RecordCount > 0 then あたりでエラーが起きているのではないかと思います。 「If Err.Number<>0 Then 〜」で調べてみては? おそらくこれでは答えは出ませんが、突破口にはなると思います。 | ||||||||||||
|
投稿日時: 2005-09-06 15:39
連続カキコすいません。
えと、常駐先にはOracleは入っていないので、ほかのもので実験してみたのですが、 どれでもカウントを取れるみたいですねぇ。 ただ、ちょっと下のコードを試してみてもらえます? objRS.Open strSQL, objCon, 0, 1 いわゆる、デフォというやつですが。 (最後の1は、念のためReadOnlyにしているハズです。) | ||||||||||||
|
投稿日時: 2005-09-06 16:06
Recordsetのエラーではなく、
結局ConnectionがOpen状態で確立できていないのでは ないでしょうか。 objCon.StateがadStateOpen(=1)になっていることは 確認しましたか? 確かProviderがRecordCountをサポートしない場合も 値としては-1が返ってきて、エラーになることはなかったように記憶しています。 |