すみませんが、教えてください。
次のコードように、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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- Visual Basic(VBA) VBA★PDFをPDFアプリで印刷しようと思っていますが上手くゆきません 1 2022/06/06 22:04
- Visual Basic(VBA) 3個のfileのセルデータを1個のfileのセルに貼り付けるVBAコードですが。 1 2023/02/20 09:21
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
VBA public変数はどのようなことをしたら解放されますか?
Visual Basic(VBA)
-
-
4
EXCEL-VBAにてADOのレコードセットを使用している際のメモリの開放について
Visual Basic(VBA)
-
5
AccessのDAO.ExecuteとDoCmd.RunSqlの違いについて
その他(データベース)
-
6
closeとメモリの開放について
Visual Basic(VBA)
-
7
コマンドボタンがあるかどうかを取得するには?
PowerPoint(パワーポイント)
-
8
実行時エラー 3035 メモリ不足です。
Visual Basic(VBA)
-
9
AccessVBAでのExcelメモリ解放
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ヒープメモリの解放について
-
メモリ不足になってしまう。
-
win32APIのHeapAlloc()の使い方...
-
new、memset()、エラー
-
allocってなんですか?
-
C言語に関する質問
-
GDI+におけるメモリの開放について
-
64ビットと32ビットの違い
-
C++のnewで確保したメモリーの...
-
HEAP に関すること
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
指定したメモリアドレスの値の...
-
C++ Vectorのデストラクタ
-
スタック破壊の上手な見つけ方...
-
LPWSTRのコピー
-
malloc()関数内でセングメント...
-
グローバル変数のサイズ
-
newでrealloc?
-
入れ子になった構造体について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
mallocについて
-
配列の添え字の最大数とは?
-
ヒープメモリの解放について
-
ビットをローテートするプログ...
-
C++で、メンバもヒープに確保さ...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
指定したメモリアドレスの値の...
-
スタック破壊の上手な見つけ方...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
free関数で動作が止まる
-
callocの処理速度
-
MSDNがgethostbynameではなくge...
-
C++のnewで確保したメモリーの...
-
sprintf()の使い方について
-
Accessで、メモリを開放するタ...
おすすめ情報