ADOは「ActiveX Data Object」の略で、データベースを操作するためのさまざまなオブジェクトを持つオブジェクトライブラリです。ADOの持つさまざまなオブジェクトを組み合わせることで、データベースを自由に操作することができます。
SQL Server、Oracle、Excelファイルなど、Access以外の外部データベースも同様に操作が可能となります。
本記事では主に、レコードの取得に絞って解説していきます。
データベース操作の主な流れ
- データベースに接続する
- レコードの取得を行う
- 取得したレコードへの検索や追加・更新・削除など、データベースの操作を行う
- データベースへの接続を解除する
※AccessでADOを利用するには、「参照設定」ダイアログボックスで「Microsoft ActiveX Data Objects X.X Library」(X.Xはバージョン番号)への参照設定が必要です。
ADOで使用するオブジェクト
ADOでは主に次のオブジェクトによって構成されています。
| オブジェクト名 | 説明 |
|---|---|
| Connection | データベースへの接続を保持するオブジェクト |
| Command | データベースへのコマンドを保持するオブジェクト |
| Recordset | レコードの集まりを保持するオブジェクト |
| Field | フィールドを保持するオブジェクト |
| Parameter | パラメータを保持するオブジェクト |
| Property | プロパティを保持するオブジェクト |
| Error | エラーを保持するオブジェクト |
データベース操作で使用するオブジェクト
Recordsetオブジェクト
Recordsetオブジェクトとは、レコードセットを操作するためのオブジェクトです。Recordsetオブジェクトの主なプロパティとメソッドは、以下となります。
| プロパティ | 定数 | 説明 |
|---|---|---|
| BOF | カレントレコードが先頭レコードの前にある時はTrueを、それ以外はFalseを返す | |
| EOF | カレントレコードが最終レコードの後にある時はTrueを、それ以外はFalseを返す | |
| RecordCount | レコード件数を返す | |
| CursorType | カーソルタイプを返す | |
| adOpenForwardOnly(既定) | 前方スクロールカーソル レコードを前方向にのみ移動することができ処理が高速。その他は静的カーソルと同じ働きをする |
|
| adOpenKeyset | キーセットカーソル 他のユーザーによる追加・削除は確認できない。その他は動的カーソルと同じ働きをする |
|
| adOpenDynamic | 動的カーソル レコードを全ての方向に移動することができる。他のユーザーによる追加・更新・削除を確認できる |
|
| adOpenStatic | 静的カーソル レコードを全ての方向に移動することができる。他のユーザーによる追加・更新・削除を確認できない |
|
| CursorLocation | カーソルの場所を指定する | |
| adUseServer(既定) | サーバー側のカーソルを使う | |
| adUseClient | クライアント側のカーソルを使う | |
| LockType | ロックタイプを返す | |
| adLockReadOnly(既定) | 読み取り専用 | |
| adLockPessimistic | レコード単位の排他的ロックを表す | |
| adLockOptimistic | レコード単位の共有的ロックを表す | |
| adLockBatchOptimistic | 共有的バッチ更新を表す | |
| adLockUnspecified | ロックタイプを指定しない | |
| Bookmark | レコードを識別するためのブックマークを表す |
| メソッド | 説明 |
|---|---|
| Open | レコードセットを開く |
| Close | レコードセットを閉じる |
| Move/MoveFirst/ MoveLast/ MoveNext/ MovePrevious |
カレントレコードを移動する |
| Find | レコードを検索する |
| Clone | レコードセットのコピーを作る |
| AddNew | レコードを追加する |
| Update | レコードを更新する |
| Delete | レコードを削除する |
カレントレコードとはレコードセットの中で、現在操作の対象となっているレコードを指します。レコードセットは同時に複数のレコードを参照できないため、このカレントレコードを移動させながら複数のレコードを操作します。
レコードセットを取得するには、主に以下の方法があります。
①RecordsetオブジェクトのOpenメソッドを使う
Dim rs As ADODB.Recordset
Set rs = NEW ADODB.Recordset
rs.Open "ソース", cn, "カーソルタイプ", "ロックタイプ"
Openメソッドの引数については、以下の通りです。
- ソース: テーブル名、クエリ名、SQLステートメントなどを指定
- cn: Connectionオブジェクトを指定
- カーソルタイプ: カーソルタイプを指定。CursorTypeプロパティの定数を指定する
- ロックタイプ: ロックタイプを指定。LockTypeプロパティの定数を指定する
以下のように、オブジェクト変数の宣言とインスタンスの生成を一度に行うことも可能です。
Dim rs As NEW ADODB.Recordset
rs.Open "ソース", cn, "カーソルタイプ", "ロックタイプ"
引数に関しては、あらかじめRecordsetオブジェクトのプロパティに設定してから、Openメソッドを実行することも可能です。
Dim rs As NEW ADODB.Recordset
rs.ActiveConnection = cn
rs.Source = "ソース"
rs.CursorType = "カーソルタイプ"
rs.LockType = "ロックタイプ"
rs.Open
②ConnectionオブジェクトのExecuteメソッドを使う
Dim rs As ADODB.Recordset
Set rs = cn.Execute("コマンド")
Executeメソッドのオブジェクトと引数については、以下の通りです。
- cn: Connectionオブジェクトを指定
- コマンド: テーブル名、クエリ名、SQLステートメントなどを指定
今回はRecordsetオブジェクトでなくConnectionオブジェクトのメソッドを使用するため、特に「NEW ADODB.Recordset」と記述する必要はありません。
ConnectionオブジェクトのExecuteメソッドの結果をRecordsetオブジェクトで取得した場合、レコードセットは常に前方スクロールカーソルの読み取り専用となります。また、Executeメソッドでアクションクエリを指定した場合、特に結果は返らず、指定したアクションが実行されるのみとなります。その場合は、レコードセットのオブジェクト変数は使用せずに、以下のように記述します。
cn.Execute コマンド
まとめ
本記事では、Access VBAにおけるADOについて、レコードの取得をメインに説明してきました。
レコードセットを取得する方法は2種類あり、Openメソッドを使う方法と、ConnectionオブジェクトのExecuteメソッドを使う方法があります。
ConnectionオブジェクトのExecuteメソッドを使って取得した場合、レコードセットは常に前方スクロールカーソルの読み取り専用となります。そのため、レコードを全方向に動かしたいなど柔軟に操作したい場合はOpenメソッドを使う方法が良いかと思います。
以上がレコードの取得についての解説でしたが、次回からは取得したレコードセットを実際に操作していく方法について書いていこうと思います!
参考文献
- VBA エキスパート 公式テキスト 「Access VBA スタンダード」 武藤 玄