【问题标题】:Accessing a SQLite Database in VBA in Excel在 Excel 中访问 VBA 中的 SQLite 数据库
【发布时间】:2017-07-19 10:44:53
【问题描述】:

我一直在向 VBA 添加一个 MS Access 数据库,以便对船舶进行一些分析。但是数据库现在已更改为 SQlite,我不知道如何从 VBA 访问。我试过使用 GitHub 的 SQLiteForExcel,但我不明白它是如何工作的,即使有例子。我用于访问 Access 数据库的代码如下:(db_path 是我的 Access 数据库的超链接)

Sub query_db()

On Error GoTo Errorhandler
Dim v_db As DAO.Database
Dim rst As DAO.Recordset
Dim vessels_db As Variant
Dim strSQL As String
Dim i As Long
Dim ws As Worksheet

Set ws = Worksheets("results")
ws.Select

vessels_db = [db_path]
Set v_db = OpenDatabase(vessels_db)


Worksheets("results").Select
[x_0].Select
Range(Selection, Selection.Offset(40000, 1)).ClearContents

strSQL = " SELECT Vessels.vsl_name, Vessels.dwt FROM Vessels " & _
          " GROUP BY Vessels.vsl_name, Vessels.dwt ORDER BY Vessels.vsl_name ; "
Set rst = v_db.OpenRecordset(strSQL)
...

有谁知道如何使用 SQLiteForExcel 更改此代码,以便我可以访问 SQLite 数据库。

在此先感谢

【问题讨论】:

  • 我会将其转换为 ADO - 有 examples here。你可以找到 SQLite 连接字符串here

标签: vba excel sqlite


【解决方案1】:

MS Access 的默认引擎 Jet/ACE 和 SQLite 具有相同的质量,因为它们是文件级数据库,其中数据库文件驻留在目录中的磁盘级而不是服务器级数据库(SQL Server、Oracle、MySQL、 Postgres)。

要在后端数据库之间流畅地交换,请考虑使用 ADO 在 Excel 中连接数据库。现在您使用 DAO,它是 MS Access 的默认连接层。

您需要的第一件事是下载SQLite ODBC Driver,它与您的版本(最有可能是SQLite 3)和您的Windows 位级别(32/64 位)相匹配。作为比较,您的机器很可能已经安装了 MS Access ODBC 驱动程序。完成后,只需设置您的连接字符串:

SQLite

Dim conn As Object, rst As Object

Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

' OPEN CONNECTION
conn.Open "DRIVER=SQLite3 ODBC Driver;Database=C:\Path\To\SQLite\Database.db;"

strSQL = "SELECT Vessels.vsl_name, Vessels.dwt FROM Vessels " & _
         " GROUP BY Vessels.vsl_name, Vessels.dwt ORDER BY Vessels.vsl_name ; "

' OPEN RECORDSET
rst.Open strSQL, conn

' OUTPUT TO WORKSHEET
Worksheets("results").Range("A1").CopyFromRecordset rst
rst.Close

' FREE RESOURCES
Set rst = Nothing: Set conn = Nothing

MS 访问

作为比较,使用 ADO,您可以简单地切换引用 ODBC 驱动程序的连接字符串以用于不同的数据库后端。注意和上面一样,数据库源是一个目录路径:

Dim conn As Object, rst As Object

Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")

' OPEN CONNECTION
conn.Open "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Path\To\Access\DB.accdb;"

strSQL = "SELECT Vessels.vsl_name, Vessels.dwt FROM Vessels " & _
         " GROUP BY Vessels.vsl_name, Vessels.dwt ORDER BY Vessels.vsl_name ; "

' OPEN RECORDSET
rst.Open strSQL, conn

' OUTPUT TO WORKSHEET
Worksheets("results").Range("A1").CopyFromRecordset rst
rst.Close

' FREE RESOURCES
Set rst = Nothing: Set conn = Nothing

【讨论】:

    【解决方案2】:

    很好的解决方案,感谢 Parfait!

    只是一个小的快速更正,你实际上需要做:

    rst.Open strSQL, conn, 1, 1
    

    这样,完整的解决方案将是:

    Dim conn As Object, rst As Object
    
    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    
    ' OPEN CONNECTION
    conn.Open "DRIVER=SQLite3 ODBC Driver;Database=C:\Path\To\SQLite\Database.db;"
    
    strSQL = "SELECT Vessels.vsl_name, Vessels.dwt FROM Vessels GROUP BY Vessels.vsl_name, Vessels.dwt ORDER BY Vessels.vsl_name ;"
    
    ' OPEN RECORDSET
    rst.Open strSQL, conn, 1, 1
    
    ' OUTPUT TO WORKSHEET
    Worksheets("results").Range("A1").CopyFromRecordset rst
    rst.Close
    
    ' FREE RESOURCES
    Set rst = Nothing: Set conn = Nothing
    

    这将使 rst 包含您从查询中获得的整个表。

    【讨论】:

      【解决方案3】:

      在无法使thisthis 适应我的需求后,我终于
      成功使用来自here 的 Marcus Mangelsdorf 的改进。
      没有显示他的代码 - 它在链接中。我只是把它放在它自己的模块中
      称为“WSHreturn”,将其(连同函数名称/参数)更改为返回 外壳对象并将其他代码移动/添加到我的。这很容易设置 快速并且将成为 LINQ 的基础?类型功能。

      Sub VBALimposterQ()
          'With >1 field, SQLite default delim is Pipe "|"
          Const sqlInit As String = "c:\users\user\sqlite3.exe :memory:"
          Const sqlCreat As String = "CREATE Table Nums (n1 INTEGER NOT NULL, n2 INTEGER NOT NULL);"
          Const sqlIns0   As String = "INSERT INTO Nums VALUES (33,99);"
          Const sqlIns1   As String = "INSERT INTO Nums VALUES (11,22);"
          Const sqlIns2   As String = "INSERT INTO Nums VALUES (44,55);"
          Const sqlQry   As String = "SELECT RowId, n1, n2 from Nums;"
          Dim Ax, Axi, i, S
          Dim sqlShell As Object  'REF: Windows Script Host Object Model
          Set sqlShell = WSHreturn.getWShell(sqlInit) 'Qualifying Mssr. Mangelsdorf's code
          With sqlShell                   'with module name I gave it. 
              .StdIn.Write sqlCreat       'Thx Mathieu Guindon!
              .StdIn.Write sqlIns0
              .StdIn.Write sqlIns1
              .StdIn.Write sqlIns2
              .StdIn.Write sqlQry
              
              .StdIn.Close
              S = .StdOut.ReadAll
              Ax = Split(S, vbCrLf, , vbTextCompare)
              .Terminate
          End With
          
          For i = 0 To UBound(Ax)
              Axi = Ax(i)
              Debug.Print Axi
          Next i
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多