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

VB2019导入CSV至Access时INSERT语句FROM子句抛出未处理异常

异常产生原因

核心错误出在INSERT语句的Text ISAM连接参数配置错误,具体触发点:

  • Access的ACE.OLEDB驱动访问外部文本/CSV文件时,[text;FMT=Delimited;HDR=yes;DATABASE=xxx]扩展语法里的DATABASE参数必须传入CSV文件所在的文件夹绝对路径,不能传文件路径。你当前代码里给DATABASE赋值的是Access数据库文件PassMan.accdb的完整路径,不是文件夹路径,驱动寻址时无法定位CSV所在目录,内部解析逻辑触发空引用,且没有生成有效的内部异常对象,和你捕获到的NullReferenceException、InnerException为Nothing的现象完全吻合。
  • 其余你提到的数据库连接有效性、文件存在性都不是触发本次异常的原因,代码里定义后未使用的command变量属于冗余代码,不会触发该报错。
修复方法

按照ISAM驱动的参数规则修正SQL语句,同时补全资源释放、路径兼容处理,修复后代码如下:

Imports System.IO

' 原有验证过的数据库连接逻辑保留,路径拼接改用Path.Combine避免格式错误
Dim conn As New OleDb.OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + 
    Path.Combine(My.Settings.DataLoc, "PassMan.accdb") + 
    ";Jet OLEDB:Database Password=" + My.Settings.Authentication + ";"
)
conn.Open()

' 分离CSV的文件夹路径和文件名,分别填入对应位置
Dim csvDir As String = Path.GetDirectoryName(ReadFile)
Dim csvName As String = Path.GetFileName(ReadFile)
' 文件名用方括号包裹,兼容带空格、特殊字符的文件名
Dim sql As String = $"INSERT INTO Passwords SELECT * FROM [text;FMT=Delimited;HDR=yes;DATABASE={csvDir}].[{csvName}]"

' 用Using块自动释放命令对象资源
Using cmd As New OleDbCommand(sql, conn)
    cmd.ExecuteNonQuery()
End Using

' 操作完成后关闭连接
conn.Close()

修复时需要注意的细节:

  • 不要使用SELECT *做无脑插入,提前确认CSV的列数量、顺序、数据类型和Access中Passwords表的字段完全匹配;如果列顺序不一致,明确写出两边对应的字段名,避免字段映射错误。
  • 如果CSV是ANSI/UTF-8以外的编码,需要在Text连接参数里追加CharacterSet=对应编码名,避免中文乱码。

提示:如果导入时遇到字段类型识别错误,可以在CSV所在文件夹下新建和CSV同名的schema.ini文件,手动指定每个字段的类型、宽度,ACE驱动会优先读取该配置解析CSV。

内容的提问来源于stack exchange,提问作者user3516774

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:12:25