
すみませんが、教えてください。
次のコードように、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ランキング
-
ビットをローテートするプログ...
-
c言語のmalloc関数と2次元配列...
-
newしないオブジェクトについて
-
DLLのマルチスレッドの動作につ...
-
HEAP に関すること
-
c言語のポインタへの文字列入力...
-
reallocについて
-
allocってなんですか?
-
64ビットと32ビットの違い
-
reallocの断片化対策について
-
配列の添え字の最大数とは?
-
free関数で動作が止まる
-
グローバル変数のサイズ
-
void*型のデータサイズ
-
C++で、メンバもヒープに確保さ...
-
C++のnewで確保したメモリーの...
-
VB6からVCで作成したDLLへのvoi...
-
BITMAPFILEHEADER bfSize
-
ヒープ領域の限界値設定
-
構造体の配列について(2)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
DLLのマルチスレッドの動作につ...
-
C++で、メンバもヒープに確保さ...
-
C++のnewで確保したメモリーの...
-
ヒープメモリの解放について
-
malloc呼び出し時のセグメンテ...
-
配列の添え字の最大数とは?
-
LoadLibraryでAccess Violation...
-
入れ子になった構造体について
-
Accessで、メモリを開放するタ...
-
VB.netでのwin32api呼び出し
-
DLLで同じメモリ領域を参照する...
-
デストラクタを呼びたい
-
win32APIのHeapAlloc()の使い方...
-
メモリ不足になってしまう。
-
C言語 mallocとfreeについて
-
ビットをローテートするプログ...
-
座標値を読み込んである領域に...
おすすめ情報