Microsoft Access 掲示板

SQLの実行方法 / 15

17 コメント
views
4 フォロー
15
hiroton 2024/05/16 (木) 11:04:36 17372@f966d

オブジェクト変数の作成

変数宣言が必要なのは同一のオブジェクトを操作する必要があるとき、ですかね

間違った実装

OpenDatabase("C:\daosample\sample.accdb").Execute strSQL 'データベースを開いて(仮想A)クエリを実行
OpenDatabase("C:\daosample\sample.accdb").Close           'データベースを開いて(仮想B)、そのデータベース(仮想B)を閉じる
'//操作不能な仮想Aデータベースが開かれたままで不具合の原因になる

hatenaさんも解説されていますが、Withステートメントを使うとこんな時でも変数宣言をしなくてもよくなります

With OpenDatabase("C:\daosample\sample.accdb")
    .Execute strSQL
    .Close
End With

複雑になってくると、どのオブジェクトをWithステートメントで省略したらいいか悩みどころで、省略しないほうが見やすいコードという場合もあります

Dim rsA As Recordset, rsB As Recordset, rsMe As Recordset

Set rsMe = Me.Recordset.Clone
Set rsA = CurrentDb.OpenRecordset("T_A")
Set rsB = CurrentDb.OpenRecordset("T_B")

Do Until rsMe.EOF
    If Me!テキストボックス = "なんかやる" Then
        Do Until rsA.EOF
            Do Until rsB.EOF
                If rsA.f1 = rsB.f1 Then
                    '//なにかする
                    Exit Do
                End If
                rsB.MoveNext
            Loop
            '//なにかする
            rsA.MoveNext
        Loop
    End If
    rsMe.MoveNext
Loop
rsA.Close
rsB.Close
rsMe.Close

コードが長くなってくると、//なにかするのところでWithで省略した記述がrsMeなのか、rsAなのか・・・と本人でも混乱するようになってくるので見やすさ重視で変数を使うなんてこともよくあります


Application.CurrentDb メソッド (Access)
Access の CurrentDB はキャッシュしよう(IT raises ITさん)

CurrentDbについても、本来は

Dim db As Database
Set db = CurrentDb

db.Execute sql1
db.Execute sql2
db.Execute sql3

としたり、またはWithステートメントで参照して使用したほうが正しい使い方ができます。上記のような、クエリを複数回実行するのような場合を考えると、実は「CurrentDb.Execute」を繰り返すとは少し違う動作をします

まぁ、よほどのことがない限り、ただクエリを実行するだけであればCurrentDb.Executeの1行だけで済ませられるメリットを優先で問題ないので、それで回答している感じですね

通報 ...