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を指定してください。
