【入門編】DAO.QueryDefとADO.Commandの比較:Access内処理と外部DB連携の使い分け基準 – Access VBA解析バイブル

スポンサーリンク

Access VBAを極める:DAO.QueryDefとADO.Commandの「賢い使い分け」でシステムを堅牢にする

こんにちは。業務自動化の世界へようこそ。
Accessで「もっと速く、もっと安全に」データを扱いたいと願うあなたへ、今回はDAO.QueryDefとADO.Commandという、二つの強力な武器の使い分けについてお話しします。

多くの初学者が「とりあえず動けばいい」とSQLを文字列結合で直書きしてしまい、後からバグや速度低下に苦しみます。この記事を読み終える頃には、あなたは「なぜそれを使うのか」を自信を持って語れるエンジニアの視点を得ているはずです。

—

1. DAO.QueryDef:Accessの「専用設計図」

DAO(Data Access Objects)は、Accessと一心同体です。`QueryDef`は、Accessの「クエリデザイン」画面で作ったクエリをVBAから操るためのオブジェクトです。

なぜDAO.QueryDefを使うのか?

  • 高速性: Accessエンジンに最適化されているため、ローカルテーブルの操作において右に出るものはいません。
  • 実行計画のキャッシュ: 一度コンパイルされたクエリはエンジン内で最適化され、実行速度が安定します。

実装のポイント:パラメータークエリ

SQLを文字列結合してはいけません(セキュリティリスクと構文エラーの元です)。`Parameters`コレクションを使いましょう。

‘ DAOによるクエリ実行の例
Sub RunQueryDef()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef

Set db = CurrentDb
‘ クエリ定義を取得
Set qdf = db.QueryDefs(“qry_売上集計”)

‘ パラメーターを安全にセット
qdf.Parameters(“[Forms]![frm_Main]![txtStartDate]”) = #2023/04/01#

‘ 結果をレコードセットとして開く
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset(dbOpenSnapshot)

‘ … ここで処理 …

rs.Close: Set rs = Nothing: Set qdf = Nothing
End Sub

—

2. ADO.Command:外部世界への「汎用パスポート」

ADO(ActiveX Data Objects)は、Access以外のデータベース(SQL Server, Oracle, Azure等)と会話するための共通言語です。

なぜADO.Commandを使うのか?

  • 汎用性: 接続先が変わってもコードの根本は変わりません。
  • 高度な制御: トランザクション制御や非同期通信など、大規模システムに必要な機能を備えています。

実装のポイント:SQLインジェクション対策

外部DBと繋ぐ際、パラメータを`Command`オブジェクトに渡すことで、悪意のあるSQL注入を物理的にシャットアウトします。

‘ ADOによる外部DB接続とパラメーター利用
Sub RunADOCommand()
Dim conn As ADODB.Connection
Dim cmd As ADODB.Command

Set conn = New ADODB.Connection
conn.Open “Provider=SQLOLEDB;Data Source=ServerName;Initial Catalog=DBName;Integrated Security=SSPI;”

Set cmd = New ADODB.Command
With cmd
.ActiveConnection = conn
.CommandText = “SELECT FROM Sales WHERE SalesDate >= ?”
.CommandType = adCmdText

‘ パラメーターを安全に追加(型を明示)
.Parameters.Append .CreateParameter(“Date”, adDate, adParamInput, , #2023/04/01#)

Dim rs As ADODB.Recordset
Set rs = .Execute
End With

‘ … 処理終了後クリーンアップ …
End Sub

—

3. どちらを使うべきか?判断基準の決定版

現場で迷わないための「判断チャート」を頭に入れておきましょう。

| 比較項目 | DAO.QueryDef | ADO.Command |
| :— | :— | :— |
| 主な用途 | Access内テーブル/クエリ操作 | 外部DB、SQL Server連携 |
| パフォーマンス | Access内なら最高速 | ネットワーク越しならこちら |
| 安全性 | パラメータ化で安全 | パラメータ化で安全 |
| 学習コスト | 低い(Access機能と直結) | やや高い(接続設定等が必要) |

結論:使い分けの極意

1. Access内のデータを触るなら、迷わずDAO.QueryDefです。標準機能の恩恵を最大限に受けられます。
2. 将来的にSQL Server等へ移行する予定がある、または外部システムと連携するなら、最初からADO.Commandを使いましょう。

—

最後に:エンジニアとしての心得

初学者が陥りやすい最大の罠は、「SQL文字列を`&`で繋ぎ合わせて生成すること」です。これはコードの可読性を下げ、セキュリティホールを量産します。

今回紹介した「パラメーター」を使う手法は、最初は少し手間だと感じるかもしれません。しかし、「入力値は信用しない」というプロの鉄則をコードに落とし込むことが、あなたの書くシステムを「ただのプログラム」から「堅牢な資産」へと変貌させます。

ここをクリアしたあなたは、もう初心者ではありません。次は、この知識を武器に、誰からも文句を言わせない美しいシステムを構築してください。応援しています!

タイトルとURLをコピーしました