- 締切済み
Classic ASP で切断されたレコードセットを使う
http://www.4guysfromrolla.com/webtech/080101-1.shtml 上記のサイトを参考に切断されたレコードセットを利用しようといたしましたが、 ADODB.Recordset エラー '800a0e78' オブジェクトが閉じている場合は、操作は許可されません。 とエラーが発生してしまいます。 レコードセットを取得してくるFunctionの中の、上記サイトでいうoRS.Closeの部分をコメントアウトするとコードは通ります。 いったい何が問題なのでしょうか?上記記事が古いのでもうこの方法は使えないということなのでしょうか。 ご教示のほどよろしくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
この2ちゃんねるでのやり取りは、「どちらの書き方が良いのか?」という質問であるために、回答者は一般論として、「2の方が関数の切り分けとしては良い気がするのですが、関数毎に接続・切断するのは負荷が高いような…。」と言ったと思います。 もし私が回答者なら、この方と同じように回答していると思います。 あくまでどちらのコードの書き方が良いのか?の一般的な質問しているだけですので。 しかし、今回の質問の趣旨は、「切断レコードセットを使った場合」といことになりますので、そうなると話が違います。 今度は「コードの書き方」の問題ではなく、「切断レコードセット」を使った場合になりますので、一般論だけでは片付けられなくなるといったところでしょうか。 2ちゃんねるで、「DBへアクセスする関数を切り出したいのですが、どちらが正しいのでしょうか?ただし切断レコードセットを使いたいので、レコードセットは閉じたくないです」という質問の仕方であれば、今回、私がアドバイスしたような回答を頂けたのではないかと思います。 ひとまず解決したということなので、良かったです。 切断レコードセットの概念は、あまり世の中に知れ渡っていないところがありますので、これを機に普及したらいいなと思います。 参考になれば幸いです。
>以前某所で「DBの接続・切断は関数の中で行うのか、外で行うのか」 という質問をさせていただいた際に、関数の中で行うという回答をいただいたのですが その某所(フォーラムか掲示板だと思いますが)ですが、差し支えなかったらURLを教えて頂けますか? yyyy5555さんが勘違いして捕らえてしまったのか、回答者が間違った情報を提供している可能性があります。 今後、このOKWave系列を見て、同様の問題で悩む方もいると思いますし、 そういった方のためにも正しい情報をご提供する必要があると思いますので、宜しければ、yyyy5555さんが以前情報を仕入れた某所を教えて下さい。 それから、私が示したサンプルコードは結果的に動いたのか、ダメだったのかも教えて頂けますか? 自分が解決したからそれでいいというものではなく、今後、同様の問題で悩まれる方々のためにも、回答者がアドバイスした結果がどうなったのか?だけでもいいので、ご連絡いただけると幸いです。宜しくお願いします。
切断レコードセットは、コネクションはとじるけど、レコードセットはそのまま生かすという概念のテクノロジーになりますので、レコードセット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 以上、これでやってみてください。宜しくお願いします。
お礼
前回に引き続きご回答いただきましてありがとうございます。 以前某所で「DBの接続・切断は関数の中で行うのか、外で行うのか」 という質問をさせていただいた際に、関数の中で行うという回答をいただいたのですが、 それはおそらくコネクションの接続・切断についてだったのに、自分が誤解していたようです。 周りに聞けるような人間がいないので非常に助かります。 ありがとうございました。
お礼
失礼いたしました。ご提示いただいたサンプルで解決いたしました。 改めてお礼申し上げます。ありがとうございます。 > その某所(フォーラムか掲示板だと思いますが)ですが、差し支えなかったら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がコネクションをプールしてるから、それほど負荷は高くない。