2011-12-05 13 views
9
Dim rs as ADODB.Recordset 
set rs = ReturnARecordset 'assume ReturnARecordset does just that... 

'do something with rs 

rs.Close 
set rs = Nothing 

何も設定しないでrs.Closeを呼び出す必要がありますか?Adodb.recordsetオブジェクトを閉じてから、何も設定しないでください。

編集:アプリケーションの実行中は開いたままにし、すべてのレコードセットオブジェクトはこの同じ接続を使用します。私は、接続が開いたままにされていないことを確認するために、レコードセットを閉じる必要性について以下の2つの回答を参照してください。接続は接続オブジェクトで制御されているため、レコードセットオブジェクトではないので、私には馬鹿げた話のように聞こえますか?しかし、ここに何かが見つからない場合は教えてください...

答えて

4

Closeを明示的に呼び出す唯一の理由は、レコードセットがプロジェクト内の他の場所から参照されているかどうかわからない場合です。通常は、コードが不適切なためです。

Dim rs as ADODB.Recordset 
Set rs = ReturnARecordset 
... 
MyControl.ObscureMethod rs 
... 
Set rs = Nothing 

最終ラインはMyControlは、余分な参照を保持しているため、通常のティアダウンを防止している場合を除き、明示的にCloseを呼び出すことなく、レコードセットのインスタンスを終了することになっています。 をrsに呼び出すと、MyControlはその間に炎が壊れて便利なものは参照できません。

+0

私の考えは正確です。私は主に、それらが作成された関数にプライベートなレコードセット変数のCloseメソッドを呼び出す正当な理由があるかどうかを判断しようとしています。 –

+2

'Close'を呼び出すと、* local *の参照をNothingに明示的に設定することは、コードのインターネットバスルームがいっぱいである同じCargo Cultプログラムの一部です。常識を使い、あなたの特定の環境におけるリークをテストするのが最も良いでしょう。 – wqw

+0

とにかく範囲外に出ることが分かっているときは、私は何も設定しません。しかし、私はそれが私の質問についてではなかったときに私はそれらのコメントを防ぐためにそこに行を入れて何かに設定することの重要性を複数の答えを聞きたくありませんでした:) –

4

はい、ガーベジコレクションを強制するだけではなく、サーバーに接続が終了していることを伝えるだけでなく、複数の孤立した孤立した接続を避けることができます最終的には自分自身で時間切れになるだろうが)それらを閉じるための常にベストプラクティスである。

これは、ADODBがローカル接続ではなくリモート接続を使用している場合に特に顕著です。

+1

これは意味をなさない。 Recordset.Openは接続オブジェクトをパラメータとして受け取り、レコードセットを閉じると接続を閉じません。私たちのアプリケーションには、アプリケーションの継続中に開いたままの単一の接続オブジェクトがあり、すべてのクエリでこのオブジェクトが使用されます。そのことを念頭において、レコードセットを閉じるその他の理由はありますか?私は、レコードセットの参照カウントが0になると、Closeを呼び出してそのデストラクタで何かを処理すると思いますが、それが私が尋ねていた理由ではないかと思います。 –

+0

つまり、レコードセットをすぐに何も設定しなくても(明示的にまたは範囲外に)レコードセットを閉じるその他の理由はありますか –

1

あなたはODBCまたはOLEDBに接続を開いたままプールの問題を、実行して、プールのスロットタイアップすることができます:接続クリープの

一般的な原因は次のとおりです。

ADO接続とレコードセットオブジェクトであります実際には閉じられません。明示的に閉じないと、プールに解放されません。これはおそらく接続クリープの原因の1つです。

作成したADOオブジェクト(特にConnectionオブジェクト)は明示的に解放されませんでした。あなたが作成したオブジェクトを明示的にリリースすることは、プログラミングの良い習慣にすぎません。メモリを割り当てる場合は、リリースしてください。使用している言語に応じて、変数をスコープから外すと、その変数が解放されてもしなくてもかまいません。

Pooling in the Microsoft Data Access Components

を参照してくださいと.NETの相互運用のいずれかの可能性がある場合には警戒する関係:原因怠惰な方法のCOMオブジェクト(または含まれているオブジェクト)に起因する問題に関する警告がたくさんあるのリリースは下に発生します。ネットのガベージコレクション。

+0

私の編集を参照してくださいここに何かが見つからない場合は... –

+1

レコードセットが独自のConnectionで開かれていない場合は、プーリングは問題ではありません。 – Bob77

+0

それは意味があります。私は、接続オブジェクトを渡されたレコードセットを使って作業していましたが、そうしないと正直にあなたがそれらを開くことができないことを覚えていませんでした。ありがとう。 –

関連する問題