- ベストアンサー
Accessで、メモリを開放するタイミング
すみませんが、教えてください。 次のコードように、SQL命令を2回以上行う場合、メモリの開放は、最後だけでよいのでしょうか? これでも、一応動くのですが、メモリを余計に消費していないのかどうか、よく分かりません。 SUB SAMPLE() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String '接続 Set CN = CurrentProject.Connection 'レコードセットを取得(1) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'TS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) 'レコードセットを取得(2) Set RS = New ADODB.Recordset SQL = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'WS'" RS.Open SQL, CN, adOpenKeyset, adLockOptimistic Msgbox(CNT) '終了 RS.Close: Set RS = Nothing CN.Close: Set CN = Nothing End Sub
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コネクションを張るのと解放するのにそれなりに時間がかかります ので、これで問題ないものと思いますが・・・。 Set RSで確保するレコードセットは、仮確保した後に元の場所に上書き される・・・という動きをしますので、メモリ確保の点からすると 確かに「RS」は解放~確保の方が有利かもしれません。 しかし、初期に「RS」に確保するメモリ量はあくまで「仮確保」で、 処理全体のメモリ量を確保する訳ではありません。余計に消費という ほどの問題じゃないですし、解放~確保の処理の時間のほうが問題に なるんじゃないかと思います。 ・・・あまり自信はありませんけど。
その他の回答 (1)
<生徒名簿> ID___クラス 1____TS 2____WS 3____TS 4____TS [イミディエイト] TS=3 WS=1 次は、Open と Close を繰り返しています。 Private Sub コマンド0_Click() Dim I As Integer Dim N(1) As Integer Dim strQuerySQL(1) As String Dim rst As ADODB.Recordset strQuerySQL(0) = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'TS'" strQuerySQL(1) = "SELECT COUNT(*) AS CNT FROM 生徒名簿 WHERE クラス = 'WS'" Set rst = New ADODB.Recordset With rst For I = 0 To 1 .Open strQuerySQL(I), _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not .BOF Then .MoveFirst N(I) = Nz(.Fields(0), 0) End If .Close Next I End With Set rst = Nothing Debug.Print "TS=" & N(0) Debug.Print "WS=" & N(1) End Sub 私ならば、同じコードを繰り返さないで読みやすさを優先します。
お礼
ご回答ありがとうございます。 >私ならば、同じコードを繰り返さないで読みやすさを優先します。 私も、きれいなコードを書きたいのですが、なかなかできません。 是非、参考にさせていただきます。
お礼
ご回答ありがとうございます。 >Set RSで確保するレコードセットは、仮確保した後に元の場所に上書きされる 上書きされるなら、いちいち開放する必要はないですね。