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

