Excel에서 ODBC없이 SQLite를 조작합니다 (실천 편 1)
그래서 환경 등은 이전 기사를 참조하십시오.
또한 이번에는 샘플 Excel이 아니므로 Sqlite3_64.bas를로드합니다.
등장하는 모듈은 Sqlite3_64.bas에 있습니다.
이번에는 DB 작성, 테이블 작성까지 해 나갑니다.
DLL 로딩
우선 SQLite.dll을 로드하는 것입니다.
표준 모듈에 새로운 모듈을 만들고 Execute라고 명명했습니다.
SQLite3Initialize()
Execute
Public Sub Execute()
Dim InitReturn As Long 'SQLiteDLL
#If Win64 Then
Debug.Print "Excel is 64bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize(ThisWorkbook.Path + "\x64")
'データベースハンドラ定義
Dim myDbHandle As LongPtr
#Else
Debug.Print "Excel is 32bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize
'データベースハンドラ定義
Dim myDbHandle As Long
#End If
'SQLiteDLL読み込み成否
If InitReturn <> SQLITE_INIT_OK Then
Debug.Print "Error Initializing SQLite. Error: " & Err.LastDllError
Exit Sub
End If
End Sub
SQLite3Initialize 모듈이 로드를 수행합니다.
Sqlite3.SQLite3Initialize
Public Function SQLite3Initialize(Optional ByVal libDir As String) As Long
' A nice option here is to call SetDllDirectory, but that API is only available since Windows XP SP1.
If libDir = "" Then libDir = ThisWorkbook.Path
If Right(libDir, 1) <> "\" Then libDir = libDir & "\"
If hSQLiteLibrary = 0 Then
hSQLiteLibrary = LoadLibrary(libDir + "SQLite3.dll")
If hSQLiteLibrary = 0 Then
Debug.Print "SQLite3Initialize Error Loading " + libDir + "SQLite3.dll:", Err.LastDllError
SQLite3Initialize = SQLITE_INIT_ERROR
Exit Function
End If
End If
#If Win64 Then
#Else
If hSQLiteStdCallLibrary = 0 Then
hSQLiteStdCallLibrary = LoadLibrary(libDir + "SQLite3_StdCall.dll")
If hSQLiteStdCallLibrary = 0 Then
Debug.Print "SQLite3Initialize Error Loading " + libDir + "SQLite3_StdCall.dll:", Err.LastDllError
SQLite3Initialize = SQLITE_INIT_ERROR
Exit Function
End If
End If
#End If
SQLite3Initialize = SQLITE_INIT_OK
End Function
SQLite3Initialize는 인수를 전달하지 않으면 기본적으로 시작 통합 문서와 동일한 계층 구조의 dll을 읽습니다.
동시에 같은 계층의 SQLite3_StdCall.dll도 읽고 있으므로, 그대로 사용하는 경우는
SQLite.dll과 SQLite3_StdCall.dll은 반드시 같은 계층 구조에 있어야 합니다.
DB 생성
DB 파일에 대해서는 SQLite3Open 모듈로 자동으로 만들 수 있습니다.
파일이 열린 상태가 되므로 SQLite3Close에서 마지막으로 닫습니다.
SQLite3Open()
Sqlite3.SQLite3Open
#If Win64 Then
Public Function SQLite3Open(ByVal fileName As String, ByRef dbHandle As LongPtr) As Long
#Else
Public Function SQLite3Open(ByVal fileName As String, ByRef dbHandle As Long) As Long
#End If
SQLite3Open = sqlite3_open16(StrPtr(fileName), dbHandle)
End Function
SQLite3Close()
Sqlite3.SQLite3Close
#If Win64 Then
Public Function SQLite3Close(ByVal dbHandle As LongPtr) As Long
#Else
Public Function SQLite3Close(ByVal dbHandle As Long) As Long
#End If
SQLite3Close = sqlite3_close(dbHandle)
End Function
SQLite3Open 모듈에 인수로 파일 이름을 전달하면 DB 파일이 작성됩니다.
Execute
Option Explicit
Public Const DB_FILE_DIR As String = "E:\sqlite\db"
Public Const DB_FILE_NAME As String = "sampe.db"
Public Sub Execute()
Dim InitReturn As Long 'SQLiteDLL
Dim dbFile As String 'DBファイル
Dim RetVal As Long 'DBData
#If Win64 Then
Debug.Print "Excel is 64bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize(ThisWorkbook.Path + "\x64")
'データベースハンドラ定義
Dim myDbHandle As LongPtr
#Else
Debug.Print "Excel is 32bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize
'データベースハンドラ定義
Dim myDbHandle As Long
#End If
'SQLiteDLL読み込み成否
If InitReturn <> SQLITE_INIT_OK Then
Debug.Print "Error Initializing SQLite. Error: " & Err.LastDllError
Exit Sub
End If
'ファイル名取得
dbFile = DB_FILE_DIR + "\" + DB_FILE_NAME
'DBファイルOpen
RetVal = SQLite3Open(dbFile, myDbHandle)
Debug.Print "SQLite3Open returned " & RetVal
Debug.Print myDbHandle
'DBファイルClose
RetVal = SQLite3Close(myDbHandle)
Debug.Print "SQLite3Close returned " & RetVal
End Sub
실행하면 다음과 같이 파일을 할 수 있습니다.
테이블 만들기
테이블 작성을 포함하여 SQL문을 발행하려면 SQLite3PrepareV2 모듈을 사용하십시오.
이번에는 다음 SQL을 발행합니다.
sql:SQL
CREATE TABLE MyBigTable (
TheId INTEGER,
TheDate REAL,
TheText TEXT,
TheValue REAL)
SQLite3PrepareV2()
Sqlite3.SQLite3PrepareV2
#If Win64 Then
Public Function SQLite3PrepareV2(ByVal dbHandle As LongPtr, ByVal sql As String, ByRef stmtHandle As LongPtr) As Long
#Else
Public Function SQLite3PrepareV2(ByVal dbHandle As Long, ByVal sql As String, ByRef stmtHandle As Long) As Long
#End If
' Only the first statement (up to ';') is prepared. Currently we don't retrieve the 'tail' pointer.
SQLite3PrepareV2 = sqlite3_prepare16_v2(dbHandle, StrPtr(sql), Len(sql) * 2, stmtHandle, 0)
End Function
그런 다음 실행, 명령문을 삭제하고 계속합니다.
SQLite3Step()
Sqlite3.SQLite3Step
#If Win64 Then
Public Function SQLite3Step(ByVal stmtHandle As LongPtr) As Long
#Else
Public Function SQLite3Step(ByVal stmtHandle As Long) As Long
#End If
SQLite3Step = sqlite3_step(stmtHandle)
End Function
SQLite3Finalize()
Sqlite3.SQLite3Finalize
#If Win64 Then
Public Function SQLite3Finalize(ByVal stmtHandle As LongPtr) As Long
#Else
Public Function SQLite3Finalize(ByVal stmtHandle As Long) As Long
#End If
SQLite3Finalize = sqlite3_finalize(stmtHandle)
End Function
Execute 모듈에 일련의 동작을 통합합니다.
데이터베이스 핸들러 정의 시점에서 명령문 핸들러 정의도 수행합니다.
Execute
Option Explicit
Public Const DB_FILE_DIR As String = "E:\sqlite\db"
Public Const DB_FILE_NAME As String = "sampe.db"
Public Sub Execute()
Dim InitReturn As Long 'SQLiteDLL
Dim dbFile As String 'DBファイル
Dim RetVal As Long 'DBData
#If Win64 Then
Debug.Print "Excel is 64bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize(ThisWorkbook.Path + "\x64")
'データベースハンドラ定義
Dim myDbHandle As LongPtr
'ステートメントハンドラ定義
Dim myStmtHandle As LongPtr
#Else
Debug.Print "Excel is 32bit"
'SQLiteDLL読み込み
InitReturn = SQLite3Initialize
'データベースハンドラ定義
Dim myDbHandle As Long
'ステートメントハンドラ定義
Dim myStmtHandle As Long
#End If
'SQLiteDLL読み込み成否
If InitReturn <> SQLITE_INIT_OK Then
Debug.Print "Error Initializing SQLite. Error: " & Err.LastDllError
Exit Sub
End If
'ファイル名取得
dbFile = DB_FILE_DIR + "\" + DB_FILE_NAME
'DBファイルOpen
RetVal = SQLite3Open(dbFile, myDbHandle)
Debug.Print "SQLite3Open returned " & RetVal
Debug.Print myDbHandle
'SQL statement作成
RetVal = SQLite3PrepareV2(myDbHandle, "CREATE TABLE MyBigTable (TheId INTEGER, TheDate REAL, TheText TEXT, TheValue REAL)", myStmtHandle)
Debug.Print "SQLite3PrepareV2 returned " & RetVal
'SQL実行
RetVal = SQLite3Step(myStmtHandle)
Debug.Print "SQLite3Step returned " & RetVal
'statement 削除
RetVal = SQLite3Finalize(myStmtHandle)
Debug.Print "SQLite3Finalize returned " & RetVal
'DBファイルClose
RetVal = SQLite3Close(myDbHandle)
Debug.Print "SQLite3Close returned " & RetVal
End Sub
실행 후의 DB를 SQLiteBrowser 등으로 보면 다음과 같이 되어 있습니다.
요약
설정편에 이어 실천편 1을 써 보았습니다.
이번에는 테이블 작성까지 썼기 때문에 다음 데이터의 INSERT
SELECT를 쓰고 싶습니다!
Reference
이 문제에 관하여(Excel에서 ODBC없이 SQLite를 조작합니다 (실천 편 1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hisayuki/items/cd1b6d7bd1a8293647c8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)