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

解決済みの質問

Access ADOについて質問です。

Access ADOについて質問です。
以下コードでレコードセットを返す関数を使用しています。
動作的には問題ないのですが、標準モジュール内のレコードセットをClose及びNothingしていないのが気になります。

Private Sub Form_Open(Cancel As Integer)
Dim rs2 As ADODB.Recordset
Set rs2 = New ADODB.Recordset
Set rs2 = CreateRecordSet("SELECT * FROM T_Standard;")

Set Me.Recordset = rs2
rs2.Close: Set rs2 = Nothing
end sub

'標準モジュール
Public Function CreateRecordSet(strSQL As String) As ADODB.Recordset
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection

cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=O:\標準DB\StandardBackEnd.mdb"
cn.Open
Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenStatic, adLockReadOnly

Set CreateRecordSet = rs
' rs.Close: Set rs = Nothing   ←この部分
' cn.Close: Set cn = Nothing   ←この部分
End Function

標準モジュール内ではCloseやNothingしなくてもメモリの開放は行われているのでしょうか?
アドバイスよろしくお願いいたします。

投稿日時 - 2010-04-15 09:36:48

QNo.5827250

すぐに回答ほしいです

質問者が選んだベストアンサー

> rs.Close: Set rs = Nothing   ←この部分
> cn.Close: Set cn = Nothing   ←この部分

の部分をコメントアウトすれば当然ながら
オブジェクトを開放していないので残ります。
場合によればオブジェクトを開放すると、
Accessが「オブジェクトがありません」という
エラーを返すことがありますが、それは
プログラムを工夫することで大抵の場合は
回避できます。

たとえば、関数の引数でレコードセットや
データーベースオブジェクトを宣言しなければ
ならないようなコードを作った場合は
開放ができなくなり、さらにその関数を
ループの中で使うようなことになると
オブジェクトはたまりにたまり、メモリを
圧迫するようになります。
以前のようにマシンのメモリが小さいときは
それだけでメモリリークが起きたりしたものです。

投稿日時 - 2010-04-15 22:23:46

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

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

回答(1)

あなたにオススメの質問