C#でSQLiteいじった時と同様、VBAであろうとインジェクションを防がねばなりません。
今回vbRichClientを利用していますが、ちゃんとプリペアドステートメント用のAPIも用意されています。
それがcCommandクラスとcSelectCommandクラスです。
使い分けも簡単、SELECT文を発行して戻り値にデータを取得したいならcSelectCommandクラス、UPDATE文など発行して成否結果だけを取得したいならcCommandクラスです。
ちなみに利用するDBはID(INTEGER)とNAME(TEXT)を持つSampleテーブルに、ID = 1から5まで5レコード入っていることと仮定しましょ。
さらに、cConnectionクラスオブジェクト変数objConnには、既にコネクションがはられているとします。
なに言ってるのかわからない人は前回の記事を参照してください。
cSelectCommandの使い方
ID = 5のレコードをとってみます。
' Select結果を返してもらいたいコマンドオブジェクト
Dim objSelect As vbRichClient5.cSelectCommand
' 代入したい部分は?をいれておく
Set objSelect = objConn.CreateSelectCommand("SELECT * FROM Sample WHERE ID = ?;")
' 1番目の?にいれるデータを格納(ここでは数値)
Call objSelect.SetInt32(1, 5)
' cConnection.Executeではなく、cCommand.Executeを利用する
' ID = 5のレコードのみ抽出される
Dim objRecSet As vbRichClient5.cRecordset
Set objRecSet = objSelect.Execute
cCommandの使い方
ID = 5のレコードのNameを適当に変えてみます。
この方法はレコード操作に対してのみ有効のようです。
CREATE TABLEやDROP TABLEにも使おうとすると、CreateCommandした時点で例外すっ飛んでくるのでご注意を。
' 成否判定が返ればいいコマンドオブジェクト
Dim objCommand As vbRichClient5.cCommand
' 代入したい部分は?をいれておく
Set objCommand = objConn.CreateCommand("UPDATE Sample SET NAME = ? WHERE ID = ?;")
' 1番目の?にいれるデータを格納(ここではテキスト)
Call objCommand.SetText(1, "★変更したい★")
' 2番目の?にいれるデータを格納(ここでは数値)
Call objCommand.SetInt32(2, 5)
' トランザクションを開始して実行!
objConn.BeginTrans
' cConnection.Executeではなく、cCommand.Executeを利用する
' 実行結果はBoolean
If Not objCommand.Execute Then
objConn.RollbackTrans
End If
objConn.CommitTrans
他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。
1件のコメント