web-dev-qa-db-ja.com

rs.closeとrsの違いは何ですか= RecordSetには何もありません

いつ使用するのが適切かについて、私はしばしば混乱します。

rs.Close 

とは対照的に

Set rs = Nothing

ソースへの接続を閉じる必要があることは理解できますが、変数がスコープから外れる場合は両方を使用する必要がありますか?

接続を閉じる手順をスキップするために、変数をNothingに設定することはできますか?これは悪い習慣と見なされますか?

20

「Close」メソッドを使用すると、データベースへの接続が閉じられますが、「Open」メソッドを使用して再度開くことができるメモリ内にあります。

一方、レコードセットを「Nothing」に設定すると、オブジェクトはメモリから完全に解放されます。

16
Jojo Sardez

Closeメソッドは、メモリ構造を破棄します。

変数をNothingに設定すると、そのメモリ構造へのポインタがクリアされます。

理論的には、ポインタをクリアすると、ポインタが参照していたメモリが解放されます。これは、VBAが参照カウントを使用して、いつメモリを解放できるかを判断するためです。残念ながら、さまざまな問題が発生したり、参照カウントが失敗したりする可能性があり、メモリが解放されるべき場合でも解放されません。

したがって、メモリリークや、暗黙的および未リリースの参照によって引き起こされる奇妙な種類のバグが発生しないようにするには、CloseNothingの両方を設定します。

11
David-W-Fenton

公式ドキュメントによると、Closeを呼び出さなくてもRecordsetをNothingに設定できます。

Closeメソッドの代わりに、オブジェクト変数の値をNothingに設定することもできます(dbsTemp = Nothingを設定します)。

詳細: Recordset.Closeメソッド(DAO)

5
jurev

さて、私自身の経験では、recorsetオブジェクト(以下「RS」と呼びます)がローカルで(関数/プロシージャ内で、以下「B」と呼びます)宣言され、Bが呼び出される場所に配信されない場合(以下「A」と呼びます)、安全であり、RSを閉じてB内で何も設定しないことをお勧めします。ただし、次の状況では:

  1. RSは、AからB(byvalまたはbyref)のパラメーター引数の1つとして配信されます。
  2. RSはBで宣言されており、Aが使用するBの戻り値の1つになります。

BのRSは、閉じずに何も設定しないでください。そうでない場合、Aに返された(またはAからのパラメータの1つとしてBに送信された)レコードセットオブジェクトも閉じられて何も設定されないため、Aではアクセスできなくなります。事前にRSをAに戻し、Bで閉じた場合!

0
Edward