- PR -

ASPでADODB.Recordset エラー発生

投稿者投稿内容
まちゃみん
会議室デビュー日: 2005/09/06
投稿数: 5
投稿日時: 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
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-06 11:59
引用:

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

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


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

引用:

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


うーん。

引用:

objRS.Open strSQL, objCon, 3


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



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まちゃみん
会議室デビュー日: 2005/09/06
投稿数: 5
投稿日時: 2005-09-06 13:53
じゃんぬねっとさん、ご返答ありがとうございます。

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

どうすればRecordsetオブジェクトを使えるようになるんでしょう?
まさか、自分の新環境下では使えない?
ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓
まちゃみん
会議室デビュー日: 2005/09/06
投稿数: 5
投稿日時: 2005-09-06 13:53
じゃんぬねっとさん、ご返答ありがとうございます。

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

どうすればRecordsetオブジェクトを使えるようになるんでしょう?
まさか、自分の新環境下では使えない?
ネットや本で記載されている一般的な記述をしても同様のエラーが出てしまうんですよねぇ↓
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2005-09-06 14:53
こんにちは。

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

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

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

らい
大ベテラン
会議室デビュー日: 2005/08/02
投稿数: 159
お住まい・勤務地: 東京都と千葉県のさかいめ
投稿日時: 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/08/02
投稿数: 159
お住まい・勤務地: 東京都と千葉県のさかいめ
投稿日時: 2005-09-06 15:39
連続カキコすいません。
引用:

まちゃみんさんの書き込み (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にしているハズです。)
platini
大ベテラン
会議室デビュー日: 2002/12/03
投稿数: 193
投稿日時: 2005-09-06 16:06
Recordsetのエラーではなく、
結局ConnectionがOpen状態で確立できていないのでは
ないでしょうか。

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

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

スキルアップ/キャリアアップ(JOB@IT)