VBAでSqlite3を利用する方法としては、何個かネットに上がっているがODBCのインストールができず、dllの利用は汎用性が高いが難易度が高いと思われたので、sqlite3.exeを利用するケースを検討してみた。
下記の流れで何とかなるのではないかと思い、いろいろと検証しているが、現時点で処理ができた分をメモのために記載する。
・実行するSqlを作成(UTF-8 BOM無しである必要がある)
例)SQL文の内容(最初の3行はsqlite3.exeのオプション)
.headers on
.mode html
.output ./result.xml
SELECT * FROM T_Card;
・Sqlを呼び出すためのバッチを作成(Shift-JISである必要がある)
C:\Users\UserName\Desktop\PgUsrName\sqlite3.exe C:\Users\UserName\Desktop\PgUsrName\DataBase\開発PJ.prj < C:\Users\UserName\Desktop\PgUsrName\ExecSQL.sql
・出力形式はhtml形式を指定し、出力された結果をVBAでデシリアライズする
・処理完了後には一時ファイルを削除する(予定)
・出力されたファイルをRecodesetに読み込む(予定)
--------------------------------- ソース ----------------------
Private Const SQLITE_EXE As String = "C:\Users\UserName\Desktop\PgUsrName\sqlite3.exe"
Private Const RESULT_FILEPATH As String = "Result.xml"
Private Const EXEC_SQL As String = "ExecSQL.sql"
Private Const EXEC_BATCH As String = "ExecBatch.bat"
Private Const DB_PATH As String = "C:\Users\UserName\Desktop\PgUsrName\DataBase\開発PJ.sqlite3"
Private Const FOLDER_PATH As String = "C:\Users\UserName\Desktop\PgUsrName\"
Private Const CHARSET_UTF8 As String = "UTF-8"
Private Const CHARSET_SJIS As String = "Shift-JIS"
Private Sub Sqlite()
Dim strCommand As String
Dim strSqlCommand As String
Dim strSql As String
'実行するsql
strSql = strSql & " SELECT * FROM T_Card;"
'sqlite3を実行するときのオプションコマンド
strSqlCommand = ".headers on " & vbCrLf
strSqlCommand = strSqlCommand & ".mode html " & vbCrLf
strSqlCommand = strSqlCommand & ".output ./result.xml " & vbCrLf
strSqlCommand = strSqlCommand & strSql & vbCrLf
'sqlite3に渡すコマンドを出力する
Call TextOutput(strSqlCommand, FOLDER_PATH & EXEC_SQL, CHARSET_UTF8, True)
'バッチ用コマンド
strCommand = SQLITE_EXE & " " & DB_PATH & " < " & FOLDER_PATH & EXEC_SQL
'sqlite3に渡すコマンドを出力する
Call TextOutput(strCommand, FOLDER_PATH & EXEC_BATCH, CHARSET_SJIS)
Dim wsh As Object
Dim result As Integer
Set wsh = CreateObject("WScript.Shell")
'バッチファイルを同期実行
result = wsh.Run(Command:=FOLDER_PATH & EXEC_BATCH, WaitOnReturn:=True)
If (result = 0) Then
MsgBox ("バッチファイルは正常終了しました。")
Else
MsgBox ("バッチファイルは異常終了しました。")
End If
'後片付け
Set wsh = Nothing
End Sub
Public Sub TextOutput(ByVal strText As String, ByVal strFilePath As String, ByVal strCharSet As String, Optional ByVal blnNoBOM As Boolean = False)
Dim i As Integer
'ADODB.Streamオブジェクトを生成
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")
'ADODB.Streamで扱う文字コードを設定する
ado.Charset = strCharSet
'ADODB.Streamを開く
ado.Open
'開いたADODB.Streamに内容を保管する
'adWriteLineは改行する時に入れる
ado.WriteText strText
' For i = 1 To 5
' ado.WriteText Cells(i, 1).Value, adWriteLine
' Next
' ---------- ここから ----------
If blnNoBOM = True And strCharSet = CHARSET_UTF8 Then
With ado
' タイプをバイナリにして、先頭の3バイトをスキップ
.Position = 0
.Type = 1 ' ADODB.StreamTypeEnum.adTypeBinary ' タイプ変更するにはPosition = 0である必要がある
.Position = 3
' 一時格納用
Dim p_byteData() As Byte
p_byteData = .Read
.Close ' 一旦閉じて
.Open ' 再度開いて
.Write p_byteData ' ストリームに書き込む
End With
End If
'ADODB.Streamに保管されている内容をファイルに保存する
ado.SaveToFile strFilePath, 2
'ADODB.Streamを閉じる
ado.Close
End Sub
Private Const RESULT_FILEPATH As String = "Result.xml"
Private Const EXEC_SQL As String = "ExecSQL.sql"
Private Const EXEC_BATCH As String = "ExecBatch.bat"
Private Const DB_PATH As String = "C:\Users\UserName\Desktop\PgUsrName\DataBase\開発PJ.sqlite3"
Private Const FOLDER_PATH As String = "C:\Users\UserName\Desktop\PgUsrName\"
Private Const CHARSET_UTF8 As String = "UTF-8"
Private Const CHARSET_SJIS As String = "Shift-JIS"
Private Sub Sqlite()
Dim strCommand As String
Dim strSqlCommand As String
Dim strSql As String
'実行するsql
strSql = strSql & " SELECT * FROM T_Card;"
'sqlite3を実行するときのオプションコマンド
strSqlCommand = ".headers on " & vbCrLf
strSqlCommand = strSqlCommand & ".mode html " & vbCrLf
strSqlCommand = strSqlCommand & ".output ./result.xml " & vbCrLf
strSqlCommand = strSqlCommand & strSql & vbCrLf
'sqlite3に渡すコマンドを出力する
Call TextOutput(strSqlCommand, FOLDER_PATH & EXEC_SQL, CHARSET_UTF8, True)
'バッチ用コマンド
strCommand = SQLITE_EXE & " " & DB_PATH & " < " & FOLDER_PATH & EXEC_SQL
'sqlite3に渡すコマンドを出力する
Call TextOutput(strCommand, FOLDER_PATH & EXEC_BATCH, CHARSET_SJIS)
Dim wsh As Object
Dim result As Integer
Set wsh = CreateObject("WScript.Shell")
'バッチファイルを同期実行
result = wsh.Run(Command:=FOLDER_PATH & EXEC_BATCH, WaitOnReturn:=True)
If (result = 0) Then
MsgBox ("バッチファイルは正常終了しました。")
Else
MsgBox ("バッチファイルは異常終了しました。")
End If
'後片付け
Set wsh = Nothing
End Sub
Public Sub TextOutput(ByVal strText As String, ByVal strFilePath As String, ByVal strCharSet As String, Optional ByVal blnNoBOM As Boolean = False)
Dim i As Integer
'ADODB.Streamオブジェクトを生成
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")
'ADODB.Streamで扱う文字コードを設定する
ado.Charset = strCharSet
'ADODB.Streamを開く
ado.Open
'開いたADODB.Streamに内容を保管する
'adWriteLineは改行する時に入れる
ado.WriteText strText
' For i = 1 To 5
' ado.WriteText Cells(i, 1).Value, adWriteLine
' Next
' ---------- ここから ----------
If blnNoBOM = True And strCharSet = CHARSET_UTF8 Then
With ado
' タイプをバイナリにして、先頭の3バイトをスキップ
.Position = 0
.Type = 1 ' ADODB.StreamTypeEnum.adTypeBinary ' タイプ変更するにはPosition = 0である必要がある
.Position = 3
' 一時格納用
Dim p_byteData() As Byte
p_byteData = .Read
.Close ' 一旦閉じて
.Open ' 再度開いて
.Write p_byteData ' ストリームに書き込む
End With
End If
'ADODB.Streamに保管されている内容をファイルに保存する
ado.SaveToFile strFilePath, 2
'ADODB.Streamを閉じる
ado.Close
End Sub
0 件のコメント:
コメントを投稿