ACCESSのVBAでADOを利用したバインド変数を利用したデータベース連携方法
ACCESSのVBAでバインド変数の利用方法 | 備忘録
今のACCESSのADOは、.NETとほぼほぼ手順が同じ。
参照設定は、[ Microsoft ActiveX Data Objects 6.1 Library ]
色々な言語をやると、久しぶりにACCESSで、しかもレガシーなVB6系であるVBAをやると、色々忘却している。
今回は、バリバリVBAをメインに使ったシステムを作るので、ADOでバインド変数を利用したデータベース連携のサンプルを載せてみる。
データ取得の例
Dim sql_con As New ADODB.Connection
Dim sql_rs As New ADODB.Recordset
Dim sql_cmd As New ADODB.Command
Dim sql_prm As New ADODB.Parameter
Set sql_con = CurrentProject.Connection
'sql_con.Open
Dim rs As Object
sql_cmd.ActiveConnection = sql_con
sql_cmd.CommandText = "select * from test where test = ?"
Set sql_prm = sql_cmd.CreateParameter("test", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test").Value = "aa"
Set sql_rs = sql_cmd.Execute
MsgBox sql_rs.Fields(1)
Dim sql_rs As New ADODB.Recordset
Dim sql_cmd As New ADODB.Command
Dim sql_prm As New ADODB.Parameter
Set sql_con = CurrentProject.Connection
'sql_con.Open
Dim rs As Object
sql_cmd.ActiveConnection = sql_con
sql_cmd.CommandText = "select * from test where test = ?"
Set sql_prm = sql_cmd.CreateParameter("test", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test").Value = "aa"
Set sql_rs = sql_cmd.Execute
MsgBox sql_rs.Fields(1)
データ取得もデータ挿入も全く同じ。
’Insert(データ挿入)の例
Dim sql_con As New ADODB.Connection
Dim sql_rs As New ADODB.Recordset
Dim sql_cmd As New ADODB.Command
Dim sql_prm As New ADODB.Parameter
Set sql_con = CurrentProject.Connection
'sql_con.Open
Dim rs As Object
sql_cmd.ActiveConnection = sql_con
sql_cmd.CommandText = "insert into test (test, test2) values(?, ?)"
Set sql_prm = sql_cmd.CreateParameter("test", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test").Value = "cc"
Set sql_prm = sql_cmd.CreateParameter("test2", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test2").Value = "ccc"
sql_cmd.Execute
Dim sql_rs As New ADODB.Recordset
Dim sql_cmd As New ADODB.Command
Dim sql_prm As New ADODB.Parameter
Set sql_con = CurrentProject.Connection
'sql_con.Open
Dim rs As Object
sql_cmd.ActiveConnection = sql_con
sql_cmd.CommandText = "insert into test (test, test2) values(?, ?)"
Set sql_prm = sql_cmd.CreateParameter("test", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test").Value = "cc"
Set sql_prm = sql_cmd.CreateParameter("test2", adBSTR, adParamInput)
sql_cmd.Parameters.Append sql_prm
sql_cmd.Parameters("test2").Value = "ccc"
sql_cmd.Execute
バインド変数を利用するとSQLインジェクション対策になるけれど、VBAの場合は、コードが簡単に見られてしまうからあまり意味は無いかもしれないが、SQLの文字列つなぎで条件文組むと、SQLの構文に影響のある入力値を誤入力されると、SQL分が不成立でエラーとなり、入力チェックを強化する処理を入れる羽目になるから、バインド変数でやるのが一番楽。