こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Classic ASP で切断されたレコードセットを使う

http://www.4guysfromrolla.com/webtech/080101-1.shtml
上記のサイトを参考に切断されたレコードセットを利用しようといたしましたが、

ADODB.Recordset エラー '800a0e78'
オブジェクトが閉じている場合は、操作は許可されません。

とエラーが発生してしまいます。

レコードセットを取得してくるFunctionの中の、上記サイトでいうoRS.Closeの部分をコメントアウトするとコードは通ります。

いったい何が問題なのでしょうか?上記記事が古いのでもうこの方法は使えないということなのでしょうか。


ご教示のほどよろしくお願い申し上げます。

投稿日時 - 2008-08-19 20:15:53

QNo.4263078

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(3)

この2ちゃんねるでのやり取りは、「どちらの書き方が良いのか?」という質問であるために、回答者は一般論として、「2の方が関数の切り分けとしては良い気がするのですが、関数毎に接続・切断するのは負荷が高いような…。」と言ったと思います。
もし私が回答者なら、この方と同じように回答していると思います。
あくまでどちらのコードの書き方が良いのか?の一般的な質問しているだけですので。

しかし、今回の質問の趣旨は、「切断レコードセットを使った場合」といことになりますので、そうなると話が違います。
今度は「コードの書き方」の問題ではなく、「切断レコードセット」を使った場合になりますので、一般論だけでは片付けられなくなるといったところでしょうか。

2ちゃんねるで、「DBへアクセスする関数を切り出したいのですが、どちらが正しいのでしょうか?ただし切断レコードセットを使いたいので、レコードセットは閉じたくないです」という質問の仕方であれば、今回、私がアドバイスしたような回答を頂けたのではないかと思います。

ひとまず解決したということなので、良かったです。
切断レコードセットの概念は、あまり世の中に知れ渡っていないところがありますので、これを機に普及したらいいなと思います。

参考になれば幸いです。

投稿日時 - 2008-08-22 15:18:11

>以前某所で「DBの接続・切断は関数の中で行うのか、外で行うのか」
という質問をさせていただいた際に、関数の中で行うという回答をいただいたのですが

その某所(フォーラムか掲示板だと思いますが)ですが、差し支えなかったらURLを教えて頂けますか?
yyyy5555さんが勘違いして捕らえてしまったのか、回答者が間違った情報を提供している可能性があります。

今後、このOKWave系列を見て、同様の問題で悩む方もいると思いますし、
そういった方のためにも正しい情報をご提供する必要があると思いますので、宜しければ、yyyy5555さんが以前情報を仕入れた某所を教えて下さい。

それから、私が示したサンプルコードは結果的に動いたのか、ダメだったのかも教えて頂けますか?
自分が解決したからそれでいいというものではなく、今後、同様の問題で悩まれる方々のためにも、回答者がアドバイスした結果がどうなったのか?だけでもいいので、ご連絡いただけると幸いです。宜しくお願いします。

投稿日時 - 2008-08-22 09:36:25

お礼

失礼いたしました。ご提示いただいたサンプルで解決いたしました。
改めてお礼申し上げます。ありがとうございます。

> その某所(フォーラムか掲示板だと思いますが)ですが、差し支えなかったらURLを教えて頂けますか?
> yyyy5555さんが勘違いして捕らえてしまったのか、回答者が間違った情報を提供している可能性があります。

前述の某所というのは2chの<%= ASP総合 %> Part.4というスレッドで、
今は落ちてしまっていると思いますので、そのやりとりを下記に掲載いたします。


971 名前:nobodyさん[sage] 投稿日:2008/06/23(月) 18:20:11 ID:???
質問させてください。
DBへアクセスする関数を切り出したいのですが、
1.DBへの接続・切断は1回だけ

Set ObjConn = Server.CreateObject("ADODB.Connection")
ObjConn.open XXX
GetData()
InsertData()
・・・
ObjConn.Close
Set ObjConn = Nothing

2.DBへの接続・切断は関数毎
GetData()
InsertData()
・・・

Function GetData()
 Set ObjConn = Server.CreateObject("ADODB.Connection")
 ObjConn.open XXX
 Set ObjRS = Server.CreateObject("ADODB.Recordset")
 ObjRS.Open StrSQL, ObjConn,3,3
 GetData = ObjRS.GetRows
 ObjRS.Close
 Set ObjRS = Nothing
 ObjConn.Close
 Set ObjConn = Nothing
End Function

どちらが正しいのでしょうか。
2の方が関数の切り分けとしては良い気がするのですが、
関数毎に接続・切断するのは負荷が高いような…。

972 名前:nobodyさん[sage] 投稿日:2008/06/24(火) 02:52:35 ID:???
>>971
処理ごとに関数を分ける → 将来どういう呼ばれ方をするかわからない
ってことで関数の中で接続から切断までやったほうが良いと思うよ。

どうせIISがコネクションをプールしてるから、それほど負荷は高くない。

投稿日時 - 2008-08-22 11:29:59

切断レコードセットは、コネクションはとじるけど、レコードセットはそのまま生かすという概念のテクノロジーになりますので、レコードセットoRSに対し、Closeを実行してしまうとレコードセットは消滅します。

このサンプルコードの場合、レコードセットの取得要求した側が、既定の処理を終えた後、レコードセットをCloseしてあげる必要があります。
下記のようにしてみてください。(上記サンプルサイトからのカスタマイズ版です)

Function GetRS(strSQL)
'this function returns a disconnected RS

'Set some constants
Const adOpenStatic = 3
Const adUseClient = 3
Const adLockBatchOptimistic = 4

'Declare our variables
Dim oConn
Dim strSQL
Dim oRS

'Open a connection
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open mydsn,Sean,Grimaldi

'Create the Recordset object
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.CursorLocation = adUseClient

'Populate the Recordset object with a SQL query
oRS.Open strSQL, oConn, adOpenStatic, adLockBatchOptimistic

'Disconnect the Recordset
Set oRS.ActiveConnection = Nothing

'Return the Recordset
Set GetRS = oRS

'Clean up...
oConn.Close
'''''削除する
'''''oRS.Close
Set oConn = Nothing
'''''削除する
'''''Set oRS = Nothing
End Function


'call the function
strSQL = "SELECT * FROM Authors"
set RS = GetRS(strSQL)

なんかの処理.....
なんかの処理......
なんかの処理.....

' レコードセットが不要になった段階でレコードセットを破棄する
RS.Close()
Set RS = Nothing

以上、これでやってみてください。宜しくお願いします。

投稿日時 - 2008-08-20 13:30:12

お礼

前回に引き続きご回答いただきましてありがとうございます。

以前某所で「DBの接続・切断は関数の中で行うのか、外で行うのか」
という質問をさせていただいた際に、関数の中で行うという回答をいただいたのですが、
それはおそらくコネクションの接続・切断についてだったのに、自分が誤解していたようです。

周りに聞けるような人間がいないので非常に助かります。
ありがとうございました。

投稿日時 - 2008-08-21 19:20:05

あなたにオススメの質問