Access中ImportExportSpecifications二次导入无效果问题求助
Access CSV导入异常的稳定解决方案
问题描述
每日需将1个或多个CSV文件导入Access数据库,流程为:先将目标文件复制为CP_Commandes.csv,通过VBA调用CurrentProject.ImportExportSpecifications("import-CP_Commandes").Execute执行导入(导入规范的XML存储在TXT文件中)。
- 第一次导入正常,文件可成功导入至
x_temp_commandes表; - 替换新的
CP_Commandes.csv后,执行导入无任何反应、无报错,即使重启程序也无效,x_temp_commandes表为空; - 等待1小时以上后,第二个文件才能正常处理;
- 尝试过两种方案均无效:
- 方案1:删除原有导入规范,重新从XML加载添加后执行,无报错但表依旧为空;
- 方案2:在方案1基础上修改XML中的文件名(指定实际文件而非
CP_Commandes.csv),结果同样无报错表为空;
- 偶尔未修改程序也能正常导入2-3个文件,但整体不稳定。
稳定导入的可行方案
1. 强制释放文件锁与缓存
Access可能对CP_Commandes.csv持有隐性文件锁,或缓存了旧文件元数据。在替换文件前和导入前添加锁检测与释放逻辑:
' 替换文件前检查并释放可能的文件锁 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") If fso.FileExists("CP_Commandes.csv") Then On Error Resume Next ' 尝试打开文件验证是否可写 Open "CP_Commandes.csv" For Append As #1 Close #1 If Err.Number <> 0 Then ' 延迟等待锁释放 DoEvents Application.Wait Now + TimeValue("00:00:02") Err.Clear End If On Error GoTo 0 End If ' 执行文件替换 fso.CopyFile "你的新CSV完整路径.csv", "CP_Commandes.csv", True Set fso = Nothing
2. 绕过导入规范缓存,直接调用DoCmd.TransferText
放弃依赖ImportExportSpecifications的缓存,直接在VBA中指定导入参数,确保每次读取最新文件:
' 先清空目标表,避免残留数据干扰判断 CurrentDb.Execute "DELETE * FROM x_temp_commandes", dbFailOnError ' 直接调用TransferText复用原导入规范的格式设置 DoCmd.TransferText _ TransferType:=acImportDelim, _ SpecificationName:="import-CP_Commandes", _ TableName:="x_temp_commandes", _ FileName:="CP_Commandes.csv", _ HasFieldNames:=True ' 根据你的CSV是否包含表头调整此参数
3. 使用唯一临时文件名避免缓存冲突
每次导入生成唯一临时文件名,避免重复使用CP_Commandes.csv导致的缓存问题:
' 生成带时间戳的唯一临时文件名 Dim tempFileName As String tempFileName = "CP_Commandes_" & Format(Now, "YYYYMMDDHHMMSS") & ".csv" ' 复制新文件到临时路径 FileCopy "你的新CSV完整路径.csv", tempFileName ' 加载导入规范XML并替换文件名 Dim ch As String Open "导入规范XML文件的完整路径.txt" For Input As #1 ch = Input$(LOF(1), 1) Close #1 ch = Replace(ch, "CP_Commandes.csv", tempFileName) ' 更新导入规范 If CurrentProject.ImportExportSpecifications("import-CP_Commandes").Exists Then CurrentProject.ImportExportSpecifications("import-CP_Commandes").Delete End If CurrentProject.ImportExportSpecifications.Add "import-CP_Commandes", ch ' 执行导入 CurrentProject.ImportExportSpecifications("import-CP_Commandes").Execute ' 导入完成后清理临时文件 Kill tempFileName
4. 禁用Access硬件图形加速
Access的图形加速可能引发UI层面的缓存异常,通过以下步骤关闭:
- 打开Access,点击
文件→选项→客户端设置 - 在
高级区域勾选禁用硬件图形加速 - 重启Access生效
内容的提问来源于stack exchange,提问作者Till Ducroquet
相关产品推荐
相关产品推荐

