[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/10/27(Fri) 11:12
投稿者名:dカチの父
Eメール:
URL :
タイトル:
Nothingのタイミング
ADODB.Recordsetを使用して、レコードセットを作った後
Notingするタイミングはどのタイミングが良いのでしょうか?

クローズしたら必ずNotingという考えで良いですか?
それとも最後に1度だけ行えば良い物なのでしょうか?
レコードセットは数回作るという条件です。

投稿時間:2006/10/27(Fri) 11:28
投稿者名:dカチの父
Eメール:
URL :
タイトル:
補足
補足です。
要はADODB.Recordsetを宣言した数(つまり一度)だけ必要なのか?
レコードセット作成数だけ必要なのか?
というのが知りたいのです。

よろしくお願いします。

投稿時間:2006/10/27(Fri) 11:54
投稿者名:R・田中一郎
Eメール:
URL :
タイトル:
Re: 補足
> 要はADODB.Recordsetを宣言した数(つまり一度)だけ必要なのか?
> レコードセット作成数だけ必要なのか?

スコープによります。
Nothing というのは、リソースを解放するためのものではなく、参照を解消するためのものです。
従って、そのスコープから外れることによって、その変数が消滅するため、Nothing する必要はなくなります。

投稿時間:2006/10/27(Fri) 12:25
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: Nothingのタイミング
> クローズしたら必ずNotingという考えで良いですか?
Recordset にしても Connection にしても、多くの場合、「Close」と「参照の解放」は、
セットで使われる事が多いでしょうし、混乱が少なくて済むかと思います。
(明示的な Nothing 代入でも、別インスタンス代入やスコープによる自動解放でも OK)

ですが、常に Close と解放がセットというわけではありません。
たとえば、OLE DB のコネクションプーリング機構を使うときなどは、
「Conecction.Open 後 すぐに Close するが、アプリ終了まで Nothing しない」
という使い方もされますので、常に Close 直後に Nothing するわけではありません。


> レコードセットは数回作るという条件です。
たとえば、
 RS.Close
 Set RS = New ADODB.Recordset   'あるいは、Set RS = Cn.Execute(sql) など
のような使い方をするのであれば、Close 後の Nothing をしてもしなくても OK ですが、
 RS.Close
 RS.Open '引数無し
のような使い方をするのであれば、Nothing の代入を行ってはいけません。

あるいは、Close から、次の Open までの期間が長く、かつ、コネクションプーリングの必要が
無いのであれば、Close 直後に、直ちに Nothing 代入を行うべきでしょう。


ということで、端折って書けば「多くの場合は、Close 後の Nothing 代入で問題なし」
「ただしケースバイケースで、それを行うべきでは無いと言う状況もある」、と。

投稿時間:2006/10/27(Fri) 13:08
投稿者名:dカチの父
Eメール:
URL :
タイトル:
Re^2: Nothingのタイミング
回答有難う御座いました。

要は、New した数だけ必要という考えで良いのですよね?

投稿時間:2006/10/27(Fri) 14:53
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: Nothingのタイミング
> 要は、New した数だけ必要という考えで良いのですよね?

いえ、New した数ではなく、生成された数です。たとえば、
 Dim Rs As ADODB.Recordset
 Set Rs = Cn.Execute(sql)
のようなパターンにおいては、Recordset を「New」する事はありませんが、
Connection によって「生成」はされますよね。


ただ、重要なのは Nothing を代入する事ではなく、Close する事です。
解放処理はスコープ等によって自動化されているので、あまり神経質にならずとも、
問題にはなる事は少ないと思いますよ。