はじめに
C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAの要ともなるDB操作についてまとめます。
1.基本テンプレート
Dim CN As ADODB.Connection Set CN = CurrentProject.Connection Dim RS As New ADODB.recordset Set RS = New ADODB.recordset RS.Open "テーブル名", CN, adOpenKeyset
まず
Dim CN As ADODB.Connection
で接続用変数を定義し、Set CN = CurrentProject.Connection
でカレントデータベースへの接続を保持します。
次にDim RS As New ADODB.recordset
でレコードセット用変数を定義し、Set RS = New ADODB.recordset
でレコードセットオブジェクトを保持します。
最後にRS.Open "テーブル名", CN, adOpenKeyset
で、テーブルに接続(CN)し、結果をレコードセット(RS)に格納しています。
テーブル名にはクエリ名やSQL文も指定可能
これによりレコードセットを使った処理ができますが、レコードセットの必要ない接続(UPDATEやINSERT等)は、レコードセットの定義やオブジェクトが必要ないので以下のように省略することが可能です。
Dim CN As ADODB.Connection Set CN = CurrentProject.Connection CN.Execute "クエリ名", cnt
cntにはUPDATEやINSERTを行った際のレコード数が返ります。使用しない場合は省略可能です。
2.レコードセット
⋙EOFとは
EOF
はカレントレコードを示すポインターのようなものです。
レコードがある場合はTrue
レコードが無い場合はFalse
を返しますIf Not RS.EOF Then Exit Function
このようにすると、テーブルやクエリ結果のレコードが存在しない場合はFunctionを抜ける、という使い方をすることができます。
また、最終レコード以降にポインターが移動した際もFalse
が返るため以下のようにして全レコードのループ処理を作ることができます。Do Until RS.EOF //ループ処理 RS.MoveNext Loop
ループのたびにRS.MoveNext
で次レコードに移動する必要があります。これをしないと同じレコードでループし続けて無限ループになってしまうので注意しましょう
⋙レコード数の取得
Open直後にはうまく取得できない場合があります
RS.MoveLast RS.MoveFirst
このようにすることで正常にRecordCountが取得できるようになる
現在のレコード番号の取得
RS.AbsolutePosition
このようにすると現在のレコード番号を取得できる
最初から〇番目のレコードまで、などの条件を付与したいときに使えます。
レコードの削除
Do Until RS.EOF If 〇〇〇 Then RS.Delete End If RS.MoveNext Loop
このようにすることで、〇〇〇の条件に一致するレコードを削除することができる
さいごに
いかがでしたか?
始めはweb系の言語とは違い必要なコードが増えますが、慣れるとテンプレートに沿った書き方をすればいいので扱いやすいなと思いました。
他に気づくことがあれば追記していきます。