Access 2016 VBA导入CSV时报错“无法更新,数据库或对象只读”
解决Access导入CSV文件时报「数据库或对象只读」的问题
触发该报错的核心原因及解决方法如下:
- 数据源驱动不匹配
你当前使用的Excel 12.0 Xml是Excel专属驱动,仅支持读取xls/xlsx格式文件,用来读取CSV格式会出现解析异常,误判目标对象为只读。读取CSV需要使用专用的文本驱动,不需要拼接工作表标识$后缀。 - 路径拼接逻辑错误
你当前的vStr参数把CSV文件路径和Excel工作表标识拼接在一起,完全不符合CSV读取的语法规则。CSV读取时,连接参数里的Database字段需传入CSV文件所在的文件夹路径,表名直接使用CSV文件名即可。 - 文件权限与占用问题
- 确认你对CSV所在的文件夹以及Access数据库所在文件夹有读写权限,不要将文件放在系统级只读目录下
- 确认导入的CSV文件没有被Excel、WPS等其他程序打开,被占用的文件会被Access判定为只读
- 文件名尽量避免空格,如果保留空格需要用方括号完整包裹,避免解析异常
- 目标表权限问题
确认Access库中的tbl_Stage表没有被设置为只读,当前打开的Access数据库文件本身没有勾选「只读」属性。
修正后的VBA代码示例
' 拆分CSV所在文件夹路径和文件名,不要使用Excel驱动 Dim csvFolder As String, csvName As String csvFolder = "C:\APS\Projects\In Work\Citations Management Database\" csvName = "Sample 3.csv" vSQL = "INSERT INTO [tbl_Stage] ([BATID], [AGNCY_NAM], [CNTRCTNBR], [CTTNNBR], [ISSDTE], [ISSUETIME], [VIOLT_CDE], [VIOLT_TYPE], [CTTNAMT], [ADMFEE], [RENTGP]) " & _ "SELECT [BATID], [AGNCY_NAM], [CNTRCTNBR], [CTTNNBR], [ISSDTE], [ISSUETIME], [VIOLT_CDE], [VIOLT_TYPE], [CTTNAMT], [ADMFEE], [RENTGP] " & _ "FROM [Text;FMT=Delimited;HDR=Yes;IMEX=2;Database=" & csvFolder & "].[" & csvName & "]" db.Execute vSQL, dbFailOnError
参数说明:FMT=Delimited指定为分隔符格式文本,IMEX=2开启读写权限,HDR=Yes指定CSV第一行为表头。
内容的提问来源于stack exchange,提问作者Shaves
相关产品推荐
相关产品推荐

