初心者向け解説シリーズ

VBAでDAO vs ADO:両者の違いと使い分けのガイド

nanikatoaccess

以下では、「VBAでDAO vs ADO:両者の違いと使い分けのガイド」をテーマに、Microsoft Accessで利用される2つのデータアクセスオブジェクト(DAOとADO)の特徴や長所・短所を整理します。Access初心者は「どっちを使えばいいの?」と迷う場面が多いため、業務シナリオや接続先DBに応じて適切な手法を選ぶためのポイントを紹介します。


1. DAOとADOの概要

ないものはない!お買い物なら楽天市場

1.1 DAO (Data Access Objects)

  • Accessに深く組み込まれた伝統的なオブジェクトモデル
  • Accessのネイティブエンジン(Jet/ACE)と相性が良く、ローカルテーブル(.accdb/.mdb)を操作する際に最適
  • CurrentDbDBEngine といったキーワードで始まるオブジェクト操作が代表的
  • SQL Serverや他DBへのリンクテーブル操作も一応できるが、本来はAccessのデータベースを扱うために設計された

メリット

  1. Accessとの親和性が高く、ローカルテーブルクエリ処理が簡潔
  2. 軽量で、VBAとの組み合わせにおいてサンプルが豊富
  3. オブジェクト階層(Database → Recordset → Field)が分かりやすい

デメリット

  1. DAO単体で外部DB(特に非Jet)に直接接続するのは得意でない (リンクテーブルを介する形が多い)
  2. ODBC直結できるが、ADOに比べ拡張性やパラメータ処理機能が限られる
  3. Microsoftの公式推奨は、Access(ACE)にはDAO、他DBにはADOが基本

1.2 ADO (ActiveX Data Objects)

  • 汎用的なデータアクセス技術で、OLE DBプロバイダを通じてSQL Server, Oracle, MySQLなどに直接接続可能
  • ADODB.Connection, ADODB.Recordset などオブジェクトを生成して操作
  • Access以外のVBA(Excel, Word)やVB6/VBScriptでも共通的に使われるため、広い互換性が特徴

メリット

  1. 主要DBMS(SQL Server, Oracle, MySQL, PostgreSQL等)に直接接続しやすい
  2. パラメータクエリ(cmd.Parameters.Append)など安全なSQL実行をしやすい
  3. ステートメントレベルのトランザクションや高度な機能(プロパティ設定)を活用可能

デメリット

  1. Access固有の機能(ローカルテーブルの情報やクエリ定義)との親和性が低い
  2. DAOほどAccess内のオブジェクト(CurrentDb, Linked Tableなど)と簡単に連携できない
  3. 学習コスト:ADOは汎用性が高い分、設定プロパティが豊富で初心者はとっつきにくい

2. 主な違いのまとめ表

項目DAOADO
本来の用途AccessのJet/ACEエンジン操作汎用DB接続(ODBC/ OLE DB)
Accessとの親和性高 (CurrentDb 等でローカルDB操作)低 (ローカルテーブル直接操作は苦手)
リンクテーブル(ODBC先)可能だが設定が少ないADO.Connection で直接接続
パラメータ化クエリDAO.QueryDef.ParametersADODB.Command.Parameters
初心者向けローカルDB操作なら簡単外部DB操作ならこちら推奨
大規模DB操作SQL Server等へのリンクで可能直接サーバーと通信、設定柔軟
VB, Excelなど他環境Access専用傾向が強いOffice全般・VBScriptなどでも共通利用
バージョン/レガシー状況Accessで引き続き推奨(ACE)MDAC/ADOは継続だが.NetADOへ移行の波

3. 使い分けガイド

3.1 DAOを使うシナリオ

  1. Accessファイル内のテーブル、クエリを操作する主な業務
    • 例:Set db = CurrentDb : Set rs = db.OpenRecordset("tbl顧客")
  2. ローカルフォームで入力されたデータをすぐINSERT/UPDATE
    • DAOのRecordsetレコード移動→編集→Updateする操作がシンプル
  3. リンクテーブルを通してSQL Serverなどを扱う場合も、基本はDAOで事足りる(ただしパフォーマンスやパラメータクエリに限界がある)

3.2 ADOを使うシナリオ

  1. SQL ServerやOracle, MySQL等に直接接続
    • DSNレス接続文字列でcn.Open "Provider=SQLOLEDB;..."など
  2. ストアドプロシージャ呼び出しやパラメータ化されたクエリを柔軟に実行
    • cmd.Parameters.Append cmd.CreateParameter(...)
  3. Excel/Wordなど他のOfficeアプリVBScriptでも同じような形で使えるため、汎用性が高い
  4. 詳細な接続プロパティ(Timeout, CursorLocation, LockTypeなど)を制御する必要がある場合

4. 実装コード例:DAOとADOの比較

4.1 DAOでローカルテーブル読み書き

Public Sub DAO_Example()
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset("tbl顧客", dbOpenDynaset)

' レコード移動 + 読み取り
rs.MoveFirst
Debug.Print rs!顧客名

' 新規レコード追加
rs.AddNew
rs!顧客名 = "新顧客"
rs!住所 = "東京都..."
rs.Update

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub
  • シンプルにOpenRecordsetでAccessテーブルを操作。Accessの内部DBに最適

4.2 ADOでSQL Serverに直接接続

Public Sub ADO_Example()
Dim cn As Object ' ADODB.Connection
Dim rs As Object ' ADODB.Recordset
Dim strConn As String

' DSNレス接続例 (SQL Server)
strConn = "Provider=SQLOLEDB;Data Source=MyServer;Initial Catalog=MyDB;" & _
"User ID=sa;Password=xxx;"

Set cn = CreateObject("ADODB.Connection")
cn.Open strConn

Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT 顧客ID, 顧客名 FROM dbo.顧客", cn, 1, 3 ' adOpenKeyset, adLockOptimistic

Do Until rs.EOF
Debug.Print rs("顧客ID"), rs("顧客名")
rs.MoveNext
Loop

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
  • SQL Serverへ直に接続し、Recordsetを取得
  • ローカルAccessテーブルではなく、サーバーDBを対象に自由にSQLを発行可能

5. 注意点:ADOとDAOの混在使用

  • Accessアプリ内でDAOはローカルテーブル用、ADOはSQL Server用というふうに併用することはあり得る
  • ただしDAO.RecordsetADODB.Recordset異なる型なので代入互換性がない
  • 「OpenRecordset」のシンタックスも微妙に違うため、同じコードで両方やろうとすると混乱しがち
  • 一般に1つのプロジェクトでは、ローカルエンジン操作はDAO、外部DBはADOと割り切る方が保守しやすい

6. エラー処理とパフォーマンス面】

  1. DAO
    • Accessフォームでのバインドがスムーズ。CurrentDbなどが簡単
    • ただし大規模アクセスや複雑JOINは苦手 → リンクテーブルに頼る、あるいはSQL Server移行
  2. ADO
    • レコードセットをサーバー側で処理させ、CursorTypeやLockTypeを細かく設定可能
    • パラメータクエリでSQLインジェクションを防ぎ、パフォーマンスを上げられる
    • イベントやプロパティが豊富で大量データにも対応しやすい

7. まとめ:VBAでDAO vs ADOの使い分け

  1. DAO:
    • Access(ACE/Jet)ローカルテーブルやクエリを操作する場合にシンプル・高速
    • フォーム/レポートのバインドやリンクテーブルを扱う場合にも基本はDAO
  2. ADO:
    • 外部DB接続(SQL Server, Oracle, MySQL等)に強い
    • パラメータ化クエリストアドプロシージャを呼び出す場面で真価を発揮
  3. 混在
    • 小規模だが一部データはSQL Serverから取得 → DAOでローカル操作、ADOでサーバー操作を切り替えることも
    • 設計を明確にし、違いを理解したうえで使い分ける

AccessのVBAでは、DAOネイティブAccess固有の操作に向き、ADO汎用DB接続に向くのが大きな特徴です。業務要件に合わせて適切な手法を選択・組み合わせし、スムーズで安定したデータアクセスを実現していきましょう。


関連記事

本記事を参考に、「ローカルならDAO」外部DBならADO」という基本方針を把握しつつ、自分のアプリに合ったベストプラクティスを探ってみてください。

DMM
ABOUT ME
まー
まー
駆け出しブロガー
入社した会社では、Accessを活用した基幹システムが長年運用されていました。しかし、開発者の高齢化により保守が困難となり、システムの維持・更新が急務に。 ほぼAccessに触れたことのなかった私は、ゼロから学びながら基幹システムを再構築してみることに。ついにはAccessによるシステム開発エンジニアとしてのスキルを身につけるまでに成長。 元々の業務のノウハウとそれを効率化するためのツール(Access)によって業務効率化システムをいくつも開発してきました。 みなさんの”なにか(業務のノウハウ)”とAccessで業務効率化を実現するお役に立てれば幸いです。 月30万の高配当投資も行っています。最新の銘柄情報もお届けしていきます。
googleアドセンス
記事URLをコピーしました