Excelシートに入力されたテキストと画像をSQLiteデータベースに登録する(2)
つづき。
Recordset でBLOBデータを登録する
Byte() をBLOBに登録したいのですが、INSERT文を作ってSQLを実行するのでは、バイナリデータの場合ってどうなるのかな?ということがわかっていなかったので、バインド変数的なアプローチが王道なんだろうと思って Recordsetを使ってみました。
SQLiteのODBCドライバをインストールし、こんな感じのコードを書いてみました。
Option Explicit Dim objFSO : Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'DBファイルのパス生成 Dim dbPath : dbPath = objFSO.buildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), "test001.db") 'DBオープン Dim objDB : Set objDB = CreateObject("ADODB.Connection") On Error Resume Next objDB.Open "DRIVER=SQLite3 ODBC Driver;Database=" & dbPath & ";" If Err.Number <> 0 Then ErrMsg "DBファイルをオープンできません。" & vbCrLf & Err.Description & vbCrLf & dbPath WScript.Quit -1 'エラー終了 End If On Error Goto 0 'テーブル作成(既に存在している場合はエラーとなるので、エラーを無視する) On Error Resume Next objDB.Execute "CREATE OR REPLACE TABLE testcontent (" &_ " id INTEGER" &_ " ,dat BLOB " &_ ");" On Error Goto 0 'Recordsetオブジェクトを作る Dim rs : Set rs = CreateObject("ADODB.Recordset") rs.Open "testcontent", objDB, 2, 2, 2 'データファイルのパス Dim tempFilePath : tempFilePath = objFSO.BuildPath(objFSO.GetParentFolderName(WScript.ScriptFullName), "temp.jpg") 'データファイルをバイナリ読みこみ Dim objStream : Set objStream = WScript.CreateObject("ADODB.Stream") objStream.Open : objStream.Type = 1 objStream.LoadFromFile tempFilePath objStream.position = 0 Dim objBin : objBin = objStream.Read objStream.Close 'バイナリデータをINSERTしてみる rs.AddNew rs.Fields("id") = 1 rs.Fields("dat").AppendChunk objBin '←「このコンテキストで操作は許可されていません。」のエラーとなる! rs.Update '4 '4:dbUpdateBatch
ところが AppendChunk のところで「このコンテキストで操作は許可されていません。」となってしまいます。
RecodesetのOpenのパラメータを色々変えたり、CREATE TABLE の BLOB の指定を消してみたり、試行錯誤しましたがどうにもうまく行きません。