Excel에서 ODBC없이 SQLite 작업 (설정)

10378 단어 VBAExcelsqlite
ExcelVBA를 사용하여 SQLite를 조작하는 방법입니다.
이번에는 ODBC 없이 조작하는 방법을 써 갑니다.

어떤 시간에 사용합니까?


  • Excel에 인터페이스도 데이터도 모두 정리해 Excel 북 그 자체가 무거울 때
  • Excel에 데이터를 정리하고 있지만 복잡한 검색을 원할 때
  • 위의 두 가지 경우 데이터와 응용 프로그램을 분리하고 싶지만 인터페이스를 Excel로 두고 싶을 때

  • 등등 ...

    준비하는 것


  • SQLite for Excel: SQLiteForExcel-0.9.zip
    이 사이트 에서 다운로드할 수 있습니다.
  • SQLite의 본체(DLL판):sqlite-dll-win32-x86-3100200.zip
    이 사이트 에서 다운로드할 수 있습니다.
    이번은 32bit판으로 소개합니다.

  • 환경





    사용환경
    비트


    OS
    Windows 10
    64bit

    오피스
    Excel 2013
    32bit

    DB
    SQLite
    32bit

    도구
    SQLiteForExcel
    32bit


    절차



    SQLiteForExcel-0.9.zip 압축 해제



    내용은 다음과 같은 느낌.
    경로: SQLiteForExcel\Distribution

    경로: SQLiteForExcel\Source\SQLite3VBAModules\

    그 외에도 SQLite3_StdCall.dll의 소스라든지 들어 있지만, 할애합니다.
    sqlite3.dll도 들어 있지만, 이번에는 DL 해온 최신 버전을 사용합니다.
    그래서 사용하는 것은 이하의 4개.
  • SQLite3_StdCall.dll
  • Sqlite3_64.bas
  • Sqlite3Demo_64.bas
  • SQLiteForExcel_64.xlsm(샘플 엑셀)

  • 파일 집계



    위의 파일을 한 곳에 정리합니다. 거기에 DL 해온 32bit SQLite를 추가합니다.

    왜, Excel이라든지는 64bit라고 써 있는 것 사용하는 건지 곳입니다만,
    32bit판의 샘플이 xls이었으므로, xlsm로 실험해 보았습니다.

    덧붙여서 .xlsm과 .bas의 64의 표기는 32bit와 64bit 양쪽에 대응하기 위해서, 분기 프로그램이 쓰여져 있습니다.

    VBA
        #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
    

    분기는 쓰고 있지만, Excel 본체가 64bit이었을 경우 SQLite3_StdCall.dll를 읽지 않은 용으로 보입니다만・・・

    모듈 로드



    본래라면 Excel을 기동해, VBA의 에디터 화면에서 Sqlite3_64.bas와 Sqlite3Demo_64.bas를 로드합니다.
    이번에는 샘플 Excel의 SQLiteForExcel_64.xlsm을 사용하기 때문에 처음부터 읽습니다.


    실제로 사용할 때는 필요한 것은 Sqlite3이므로 Demo는 어느 쪽이든 OK입니다.

    테스트 실행



    Sqlite3Demo의 AllTests는 테스트 모듈이므로 당연히 이대로 움직입니다.
    기본적으로 DB 파일의 작성 대상은 C:\TestSqlite3ForExcel.db3입니다.
    미리 C: 경로를 변경합니다.


    경로를 변경한 후 AllTests를 실행해 봅니다.

    testlog
    SQLite3Close returned 0
    ----- TestError Start -----
    SQLite3Open returned 14
    SQLite3Open error messagE:\sqlite\db unable to open database file
    SQLite3Close returned 0
    ----- TestError End -----
    ----- TestInsert Start -----
    SQLite3Open returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3Execute - Insert affected 1 record(s).
    ----- TestInsert End -----
    ----- TestSelect Start -----
    SQLite3Open returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Row Ready
    Column count: 3
    Column 0:     TheId         INTEGER        123 
    Column 1:     TheText       TEXT          ABC
    Column 2:     TheValue      FLOAT          42.1 
    SQLite3Step Row Ready
    Column count: 3
    Column 0:     TheId         INTEGER        987654 
    Column 1:     TheText       TEXT          ZXCVBNM
    Column 2:     TheValue      NULL          Null
    SQLite3Step Done
    SQLite3Finalize returned 0
    ----- TestSelect End -----
    ----- TestBinding Start -----
    SQLite3Open returned 0
    SQLite3Finalize returned 0
    Insert Elapsed: 00:00:02
    SQLite3PrepareV2 returned 0
    At row 1
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 10001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 20001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 30001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 40001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 50001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 60001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 70001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 80001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    At row 90001
    ------------
    Column count: 4
    Column 0:     TheId         INTEGER        42501 
    Column 1:     datetime(TheDate)           TEXT          2001-05-16 00:00:00
    Column 2:     TheText       TEXT          The quick brown fox jumped over the lazy dog.
    Column 3:     TheValue      FLOAT          333.240926265717 
    ============
    SQLite3Finalize returned 0
    Select Elapsed: 00:00:04
    ----- TestBinding End -----
    ----- TestDates Start -----
    SQLite3Open returned 0
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    Event: Nice trip somewhere  DatE:\sqlite\db 2010/06/19
    SQLite3Finalize returned 0
    ----- TestDates End -----
    ----- TestStrings Start -----
    SQLite3Open returned 0
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    Result1: 
    Result2: 
    Long String is the samE:\sqlite\db True
    SQLite3Finalize returned 0
    ----- TestStrings End -----
    ----- TestBackup Start -----
    SQLite3Open returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step Row Ready
    Column count: 2
    Column 0:     Key           INTEGER        1 
    Column 1:     Value         TEXT          First
    SQLite3Step Row Ready
    Column count: 2
    Column 0:     Key           INTEGER        2 
    Column 1:     Value         TEXT          Second
    SQLite3Step Done
    SQLite3Finalize returned 0
    SQLite3Open returned 0
    SQLite3BackupStep returned 101
    SQLite3BackupFinish returned 0
    Backup result 0
    Selecting from backup:
    SQLite3PrepareV2 returned 0
    SQLite3Step Row Ready
    Column count: 2
    Column 0:     Key           INTEGER        1 
    Column 1:     Value         TEXT          First
    SQLite3Step Row Ready
    Column count: 2
    Column 0:     Key           INTEGER        2 
    Column 1:     Value         TEXT          Second
    SQLite3Step Done
    SQLite3Finalize returned 0
    ----- TestBackup End -----
    ----- TestBlob Start -----
    SQLite3Open returned 0
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    Blob byte 0: 90
    Blob byte 1: 91
    Blob byte 2: 92
    SQLite3Finalize returned 0
    ----- TestBlob End -----
    SQLite3Open returned 0
    SQLite3OpenV2 returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step returned 101
    SQLite3Finalize returned 0
    SQLite3PrepareV2 returned 0
    SQLite3Step returned 8
    Cannot Write in Read Only database
    SQLite3Finalize returned 8
    SQLite3PrepareV2 returned 0
    SQLite3Step returned 101
    But Reading is granted on Read Only database
    SQLite3Finalize returned 0
    SQLite3Close V2 returned 0
    SQLite3Close returned 0
    

    성공적으로 테스트 할 수 있다면 소통은 괜찮습니다.
    그리고 테스트 모듈에서 어떤 함수가 무엇을하고 있는지
    끈 풀어 가면 좋아하게 사용할 수 있다고 생각합니다!

    요약



    이번은 환경을 정돈하기까지의 내용입니다.
    실제로 테이블을 만들거나 SELECT나 INSERT 등의 설명은
    다시 다음에 시도하려고합니다!
    테스트 모듈 내에서 CREATE나 INSERT, SELECT는 하고 있기 때문에
    지금은 그것을 풀어내면서 수중의 데이터를 DB화하고 있습니다.

    좋은 웹페이지 즐겨찾기