先日、ふとした理由と好奇心から Excel2010 の VBA で SQL 操作を行ってみることに。
対象となる DB は sqlite3 で、ODBC 経由で操作するので読み出しそのものは簡単だったのですが、問題は更新(UPDATE)処理。
今時の SQL 操作っぽくプリペアドステートメント(VBA だとパラメータクエリと言う?)を使おうと思ったけど…
これが困った。ヘルプもよくわからないし、検索してみてもほとんどがクエリの発行だけだし、ほとんどわからん(´・ω・`)
で、いろいろとヘルプや検索を駆使して書いてみたのが以下のような感じ。
Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Set con = New ADODB.Connection
con.ConnectionString = "DRIVER=SQLite3 ODBC Driver;Database=db.sqlite"
con.Open
Dim sql As String
sql = "UPDATE テーブル SET" & _
" カラム=?" & _
",更新日=?" & _
" WHERE インデックス=?" & _
Dim now As String
now = Format(DateTime.now, "yyyy-mm-dd hh:nn:ss")
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = con
.CommandText = sql
.Parameters.Append cmd.CreateParameter(, adInteger, _
adParamInput, , カラム)
.Parameters.Append cmd.CreateParameter(, adVarChar, _
adParamInput, Len(now), now)
.Parameters.Append cmd.CreateParameter(, adInteger, _
adParamInput, , インデックス)
.Prepared = True
.Execute
End With
とりあえずこんな感じで動いた。
ただ、この方法もちゃんとした方法ではないみたいで、cmd の内容を次々と更新して DB を更新していくと、何回目かで 0x80040e21 のエラーを吐いて止まってしまう。
Set cmd をブロックで囲むことで(おそらく)デストラクタ(VBA じゃ違う用語なのかな?)が働いて複数処理も動いたけど、はて、何が足りないんだろう?
もう少しわかりやすい VBA ヘルプはないのかなぁ。