
すみませんが、教えてください。
次のコードように、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
No.1ベストアンサー
- 回答日時:
コネクションを張るのと解放するのにそれなりに時間がかかります
ので、これで問題ないものと思いますが・・・。
Set RSで確保するレコードセットは、仮確保した後に元の場所に上書き
される・・・という動きをしますので、メモリ確保の点からすると
確かに「RS」は解放~確保の方が有利かもしれません。
しかし、初期に「RS」に確保するメモリ量はあくまで「仮確保」で、
処理全体のメモリ量を確保する訳ではありません。余計に消費という
ほどの問題じゃないですし、解放~確保の処理の時間のほうが問題に
なるんじゃないかと思います。
・・・あまり自信はありませんけど。
ご回答ありがとうございます。
>Set RSで確保するレコードセットは、仮確保した後に元の場所に上書きされる
上書きされるなら、いちいち開放する必要はないですね。
No.2
- 回答日時:
<生徒名簿>
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
私ならば、同じコードを繰り返さないで読みやすさを優先します。
ご回答ありがとうございます。
>私ならば、同じコードを繰り返さないで読みやすさを優先します。
私も、きれいなコードを書きたいのですが、なかなかできません。
是非、参考にさせていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DLLのマルチスレッドの動作につ...
-
C++で、メンバもヒープに確保さ...
-
仮想メモリでない環境でのmallo...
-
メモリ解放について
-
mallocで確保するメモリの領域...
-
allocってなんですか?
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
LoadLibraryでAccess Violation...
-
メモリをたくさん使うテストプ...
-
デストラクタを呼びたい
-
C言語 mallocとfreeについて
-
配列の添え字の最大数とは?
-
C++ Vectorのデストラクタ
-
ヒープメモリの解放について
-
VB.netでのwin32api呼び出し
-
自作のstrcatが動かない件
-
gcnew arrayによるメモリ確保に...
-
ビットをローテートするプログ...
-
mallocでメモリーを確保しよう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
newしないオブジェクトについて
-
構造体でchar name[]と*nameの...
-
ポインタのポインタの初期化法
-
行列内の行の交換,列の交換を...
-
C++で、メンバもヒープに確保さ...
-
DLLのマルチスレッドの動作につ...
-
配列の添え字の最大数とは?
-
mallocで確保するメモリの領域...
-
C++のnewで確保したメモリーの...
-
C言語に関する質問
-
Win32APIでのメモリ管理について
-
変数に文字列を代入する方法を...
-
領域の確保について
-
free関数で動作が止まる
-
CreateFileMapping について
-
指定したメモリアドレスの値の...
おすすめ情報