Microsoft Access では、VBAを用いてデータベースとやり取りする方法として「ADO(ActiveX Data Objects)」と「DAO(Data Access Objects)」の2つのライブラリを使用するやり方があります。それぞれの違いや使用シーンを正しく理解することで、より効率的な開発が可能になります。本記事では、ADOとDAOの違い、概要、使い分けのポイントを解説します。
補足:上記のライブラリを用いなくても DoCmdオブジェクト を利用して、ある程度データベース操作を行うことができます。
しかし、複数のレコードをレコード単位で条件分岐して更新を行うなど、細かなデータベース操作を行うには上記のライブラリを使用する必要があります。
さらに、ADOには、Access以外のデータベースを共通の方法で操作できるという大きなメリットがあります。
基本的な両者の違い
| 項目 | DAO | ADO |
|---|---|---|
| 対象データベース | Access向け | 多様なDBに対応 |
| 主な用途 | Accessアプリ内部処理 | 外部DB(SQL Serverなど)との接続 |
| パフォーマンス | Accessファイル内部に対して高速 | 外部接続やSQL処理で高速 |
| 接続方式 | CurrentDbなどに直接接続 | ConnectionStringを使用しOLE DB経由で接続 |
DAO(Data Access Objects)とは
DAOは、Microsoft Accessのネイティブなデータアクセスライブラリであり、JetエンジンやACE(Access Connectivity Engine)に最適化されたオブジェクトモデルです。
特徴
-
Access(.mdb/.accdb)に最適化されている
-
速度が速い
-
データベース構造(テーブル、クエリ、インデックス)へのアクセスが容易
-
Access専用のオブジェクト(TableDef, QueryDefなど)が豊富
主なオブジェクト
-
Database / DAO.Database
-
Recordset / DAO.Recordset
-
TableDef, QueryDef
サンプルコード
Function SampleDao(val As Variant)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM 顧客", dbOpenSnapshot)
Do While Not rs.EOF
Debug.Print rs!氏名
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
End Function
ADO(ActiveX Data Object)とは
ADOは、OLE DBを利用した汎用的なデータアクセス技術です。SQL Server、Oracle、Excelファイルなど、様々なデータソースへのアクセスが可能です。
特徴
-
データソースに依存しない汎用性
-
クエリ実行や接続管理が柔軟
-
Access以外の外部DBとの接続に強い
-
コーディングスタイルが簡潔
主なオブジェクト
-
Recordset / ADODB.Recordset
-
Connection
-
Command
サンプルコード
Function SampleAdo(val As Variant)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\データ\sample.accdb;"
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM 顧客", cn, adOpenStatic
Do While Not rs.EOF
Debug.Print rs.Fields("氏名").Value
rs.MoveNext
Loop
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
End Function
DAOとADOの使い分け
DAOを使うべきケース
-
Access のローカルデータベースを操作する場合
-
フォームやレポートのデータ操作が中心
-
テーブルやクエリの構造を操作したい場合
ADOを使うべきケース
-
SQL ServerやOracleなど外部DBと接続する場合
-
ExcelやCSVなどの外部ファイルをADO経由で扱う場合
-
複数のデータソースを統合するアプリケーションを開発する場合
使い分け一覧表
| 状況 | 推奨 |
|---|---|
| Access単体で開発 | DAO |
| 外部DB(SQL Serverなど)と接続 | ADO |
| 複数のDBを切り替える | ADO(柔軟性高) |
| Access内部の高速処理 | DAO(軽量で高速) |
ADOとDAOの同時使用時の注意点
2つのライブラリを同じシステムで同時に使う場合は、Recordsetなど同じ名前のオブジェクトが数多く存在するので、その場合は完全修飾名を使い明示的に宣言する必要があります(例:DAO.Recordset, ADODB.Recordset)。
もし、Dim RS As Recordset のように完全修飾名を用いずに記述してしまうと、参照設定で優先順位が上位にあるオブジェクトライブラリの、Recordsetオブジェクトとして認識されます。優先順位は、「参照設定」ダイアログボックスのリストボックスで、上にあるライブラリファイルほど優先して参照されます。
どちらのオブジェクトであるかを明示的に宣言するには、以下のように記述します。
Dim RS As ADODB.Recordset
または
Dim RS As DAO.Recordset
オブジェクト名の前に「ADODB」と記述されたオブジェクトはADOのオブジェクト、「DAO」と記述されたオブジェクトはDAOのオブジェクトとして認識されます。
まとめ
ADOは、Accessに限らず、Microsoft SQL Serverなどの外部のデータベースに接続できる汎用性のあるオブジェクトを提供し、データベースの種類が異なっても同じ手法でレコードを操作できるという利点があります。レコード操作の他にトランザクションの管理など行うことができますが、テーブルやクエリを作成する機能はなく、その場合はADOXというADOの拡張機能を別途使用する必要があります。
DAOは、Jetデータベースエンジンに直接接続するため、単体のAccessシステムを操作するケースに適しています。また、DAOにはテーブルやクエリを作成する機能があります。その他、レコードセットの操作やトランザクションの管理など、ADOで行うことのできる処理の多くを実行することが可能です。
Accessでの開発効率を上げるためにも、両者の特性を理解し、場面ごとに最適な技術を選択することが重要です。
参考文献
- VBA エキスパート 公式テキスト 「Access VBA スタンダード」 武藤 玄