You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ADODB.Connection操作SQLite数据库:CSV导入问题求助

嘿,我之前折腾过好多次VBA+SQLite导入CSV的活儿,太懂这种找不到现成方案的郁闷了!结合你给出的代码片段,我帮你梳理下最可能踩的坑和解决办法:

首先,补全你的SQLite连接字符串

你代码里的连接字符串没写完,这绝对是第一个要解决的问题。完整的SQLite ODBC连接字符串需要明确指定数据库文件路径,还要匹配驱动的参数:

conn.Open "DRIVER=SQLite3 ODBC Driver;Database=" & path & ";LongNames=0;Timeout=10;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"

这里要注意:Office的位数必须和SQLite ODBC驱动的位数完全一致——比如你用32位Excel,就必须装32位的SQLite ODBC驱动,64位同理,不然会直接提示找不到驱动。

然后,CSV导入的核心问题:别用SQLite命令行的.import!

很多人会踩这个坑:SQLite命令行工具里的.import命令,ADODB是没法直接执行的,因为ADODB只认标准SQL语句。所以我们得换个思路——用VBA先读取CSV,再批量插入到SQLite。

给你一个完整的可运行示例,包含CSV读取和批量插入:

Sub ImportCSVtoSQLite(sqliteDBPath As String, csvFilePath As String, targetTableName As String)
    Dim sqliteConn As Object, csvConn As Object, csvRS As Object
    Dim insertSQL As String, i As Integer
    
    ' 1. 初始化SQLite连接
    Set sqliteConn = CreateObject("ADODB.Connection")
    sqliteConn.Open "DRIVER=SQLite3 ODBC Driver;Database=" & sqliteDBPath & ";LongNames=0;Timeout=10;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"
    
    ' 2. 用ADODB连接CSV文件(依赖Microsoft Text Driver)
    Set csvConn = CreateObject("ADODB.Connection")
    ' HDR=Yes表示CSV第一行是表头,No则表示没有
    csvConn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & Left(csvFilePath, InStrRev(csvFilePath, "\")) & ";Extensions=csv;HDR=Yes;"
    
    ' 3. 打开CSV的记录集
    Set csvRS = CreateObject("ADODB.Recordset")
    csvRS.Open "SELECT * FROM [" & Mid(csvFilePath, InStrRev(csvFilePath, "\") + 1) & "]", csvConn
    
    ' 4. 批量插入到SQLite(开启事务提升性能)
    sqliteConn.BeginTrans
    csvRS.MoveFirst
    Do Until csvRS.EOF
        ' 动态生成INSERT语句(如果表结构和CSV字段顺序一致)
        insertSQL = "INSERT INTO " & targetTableName & " VALUES ("
        For i = 0 To csvRS.Fields.Count - 1
            If i > 0 Then insertSQL = insertSQL & ", "
            ' 处理字符串类型,转义单引号避免SQL语法错误
            If csvRS.Fields(i).Type = 202 Then ' adVarChar类型
                insertSQL = insertSQL & "'" & Replace(csvRS.Fields(i).Value, "'", "''") & "'"
            Else
                insertSQL = insertSQL & csvRS.Fields(i).Value
            End If
        Next i
        insertSQL = insertSQL & ")"
        
        sqliteConn.Execute insertSQL
        csvRS.MoveNext
    Loop
    sqliteConn.CommitTrans
    
    ' 5. 清理资源
    csvRS.Close: csvConn.Close: sqliteConn.Close
    Set csvRS = Nothing: Set csvConn = Nothing: Set sqliteConn = Nothing
    
    MsgBox "CSV导入完成!"
End Sub

额外优化:用参数化查询提升性能和安全性

如果你的CSV数据量很大,上面的SQL拼接方法效率不高,还容易出现SQL语法风险(虽然导入自己的CSV概率低,但好习惯要保持)。可以换成参数化查询:

' 替换上面的循环部分
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = sqliteConn

' 生成占位符(?),数量和CSV字段数一致
Dim placeholders As String
placeholders = String(csvRS.Fields.Count - 1, "?,") & "?"
cmd.CommandText = "INSERT INTO " & targetTableName & " VALUES (" & placeholders & ")"
cmd.Prepared = True ' 预编译语句,提升重复执行效率

Do Until csvRS.EOF
    Dim params() As Variant
    ReDim params(csvRS.Fields.Count - 1)
    ' 填充参数
    For i = 0 To csvRS.Fields.Count - 1
        params(i) = csvRS.Fields(i).Value
    Next i
    cmd.Execute , params ' 执行参数化查询
    csvRS.MoveNext
Loop

最后几个要注意的细节

  • 确保SQLite数据库里已经创建好目标表targetTableName,字段顺序和类型要和CSV匹配,不然会插入失败。
  • 如果CSV路径里有空格,上面的连接字符串已经处理了,但尽量还是用没有空格的路径更稳妥。
  • 如果找不到Microsoft Text Driver,可能是因为你装的是Office 2016及以后的版本,需要单独安装对应位数的Microsoft Access Database Engine 2016 Redistributable。

内容的提问来源于stack exchange,提问作者Rui Rebelo de Andrade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:57