アーキテクチャをスマートに。

株式会社ネオジニア代表。ITアーキテクトとしてのお仕事や考えていることなどをたまに綴っています。(記事の内容は個人の見解に基づくものであり、所属組織を代表するものではありません)

Excelシートに入力されたテキストと画像をSQLiteデータベースに登録する(2)

つづき。

Recordset でBLOBデータを登録する

Byte() をBLOBに登録したいのですが、INSERT文を作ってSQLを実行するのでは、バイナリデータの場合ってどうなるのかな?ということがわかっていなかったので、バインド変数的なアプローチが王道なんだろうと思って Recordsetを使ってみました。

SQLiteODBCドライバをインストールし、こんな感じのコードを書いてみました。

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 の指定を消してみたり、試行錯誤しましたがどうにもうまく行きません。

Recordset では BLOBにデータ登録できない!?

二時間ほど格闘したあげく、「こらアカン、もう無理や」という結論に。
次にアプローチを変えて、sqlite3 のコマンドラインから登録できないかということを考えてみました。

つまりADODBを使うのをやめ、SQL(INSERT文)を書きだして sqlite3.exe をコマンドに食わせる、という方法です。