Excel VBA + ADO での「パラメータクエリ(パラメータ付き SQL)」の解説をします。
パラメータクエリを使うと、SQLインジェクションを防止しつつ、動的に条件を指定して検索・更新が可能になります。
目次
✅ パラメータクエリとは?
WHERE ID = 1001
のようにSQL内で値を直接書くのではなく、
SELECT * FROM Users WHERE ID = ?
のように ?
でプレースホルダを使い、あとから値を「安全に」指定する方法です。
🧩 パラメータクエリの流れ(Commandオブジェクトを使う)
【使用オブジェクト】
ADODB.Connection
:Accessに接続ADODB.Command
:SQLとパラメータをセットADODB.Parameter
:各パラメータの定義ADODB.Recordset
:結果の取得
📘 サンプル:Accessの「Users」テーブルから、ID = 1001 のユーザーを検索
Sub ParameterQueryExample() Dim conn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim dbPath As String dbPath = "C:\YourPath\YourDatabase.accdb" ' 接続を作成 Set conn = New ADODB.Connection conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & dbPath & ";" & _ "Persist Security Info=False;" ' Commandオブジェクトを使ってSQL実行 Set cmd = New ADODB.Command Set cmd.ActiveConnection = conn cmd.CommandText = "SELECT * FROM Users WHERE ID = ?" cmd.CommandType = adCmdText ' パラメータを定義・追加 cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamInput, , 1001) ' 実行して結果を取得 Set rs = cmd.Execute ' 結果の確認 If Not rs.EOF Then MsgBox "名前:" & rs.Fields("Name").Value Else MsgBox "該当するユーザーは見つかりませんでした。" End If ' 後処理 rs.Close: conn.Close Set rs = Nothing: Set cmd = Nothing: Set conn = Nothing End Sub
🔍 各メソッド・定数の意味
メソッド / 定数 | 説明 |
---|---|
cmd.CreateParameter | パラメータを定義する |
"ID" | パラメータ名(SQLが ? の場合は任意名) |
adInteger | データ型(他に adVarChar , adDate など) |
adParamInput | 入力専用パラメータ |
1001 | 実際に渡す値 |
🧪 応用:文字列検索
cmd.CommandText = "SELECT * FROM Products WHERE Category = ?" cmd.Parameters.Append cmd.CreateParameter("Category", adVarChar, adParamInput, 50, "飲料")
🧱 よく使うデータ型(CreateParameter用)
型名 | 定数 | 内容例 |
---|---|---|
整数 | adInteger | 100, 2001 |
文字列 | adVarChar / adVarWChar | “田中”, “Tokyo” |
日付 | adDate | #2024/01/01# |
通貨 | adCurrency | 1234.56 |
🚨 注意点
?
の数とParameters.Append
の数は一致している必要があります。- Accessのクエリで「名前付きパラメータ(@param)」は使えず、位置が重要です(順番で渡される)。
- 必ず
.CommandType = adCmdText
を指定してください。