使用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
相关产品推荐
相关产品推荐

