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

使用RODBC在R中访问临时下载的MDB文件时出错

问题描述

尝试在R中下载在线MS Access(.mdb)文件并通过RODBC包处理,使用临时目录存储下载文件时打开失败,但将文件下载到永久路径却能正常加载。

使用的代码:

wsc_url <- "https://collaboration.cmc.ec.gc.ca/cmc/hydrometrics/www/INRS%202017%20WatTemp%20Database/WaterTemperature_NHS%20-%20cleaned_20220607.mdb"
wsc_dir <- tempdir()
wsc_file <- tempfile(tmpdir = wsc_dir, fileext = ".mdb")
  
options(timeout = 2000) # 增加下载超时阈值
download.file(wsc_url, wsc_file)
  
wsc_mdb <- RODBC::odbcConnectAccess2007(wsc_file)

出现的错误提示:

Warning messages:
1: In odbcDriverConnect(con, ...) :
  [RODBC] ERROR: state HY000, code -1206, message [Microsoft][ODBC Microsoft Access Driver] Cannot open database '(unknown)'. It may not be a database that your application recognizes, or the file may be corrupt.
2: In odbcDriverConnect(con, ...) : ODBC connection failed
可能原因及解决方法

核心原因分析

  1. 二进制文件下载模式缺失:.mdb是二进制格式文件,download.file()默认使用文本模式下载,会导致文件损坏,临时目录下的文件校验更严格,问题暴露更明显。
  2. 系统临时目录权限限制:Windows默认临时目录(tempdir()返回的路径)权限管控严格,Access ODBC驱动可能无法读取该目录下的文件。
  3. 临时文件名/路径兼容性问题:tempfile()生成的随机文件名或过长路径,可能触发Access驱动的路径解析bug。

具体解决方法

方法1:添加二进制下载模式(优先尝试)

下载时指定mode="wb",确保文件以二进制格式完整保存:

wsc_url <- "https://collaboration.cmc.ec.gc.ca/cmc/hydrometrics/www/INRS%202017%20WatTemp%20Database/WaterTemperature_NHS%20-%20cleaned_20220607.mdb"
wsc_dir <- tempdir()
wsc_file <- tempfile(tmpdir = wsc_dir, fileext = ".mdb")
  
options(timeout = 2000)
download.file(wsc_url, wsc_file, mode = "wb") # 关键:添加二进制模式
  
wsc_mdb <- RODBC::odbcConnectAccess2007(wsc_file)

方法2:使用自定义临时目录

避开系统默认临时目录,在用户权限可控的路径下创建临时文件夹:

wsc_url <- "https://collaboration.cmc.ec.gc.ca/cmc/hydrometrics/www/INRS%202017%20WatTemp%20Database/WaterTemperature_NHS%20-%20cleaned_20220607.mdb"
# 在用户文档下创建自定义临时目录
wsc_dir <- file.path(Sys.getenv("USERPROFILE"), "R_MDB_Temp")
dir.create(wsc_dir, showWarnings = FALSE) # 目录不存在则创建
wsc_file <- file.path(wsc_dir, "WaterTemp.mdb") # 指定简洁文件名
  
options(timeout = 2000)
download.file(wsc_url, wsc_file, mode = "wb")
  
wsc_mdb <- RODBC::odbcConnectAccess2007(wsc_file)

方法3:等待文件完全写入

临时文件可能存在写入延迟,通过检查文件大小确保下载完成后再连接:

wsc_url <- "https://collaboration.cmc.ec.gc.ca/cmc/hydrometrics/www/INRS%202017%20WatTemp%20Database/WaterTemperature_NHS%20-%20cleaned_20220607.mdb"
wsc_dir <- tempdir()
wsc_file <- tempfile(tmpdir = wsc_dir, fileext = ".mdb")
  
options(timeout = 2000)
download.file(wsc_url, wsc_file, mode = "wb")

# 等待文件大小稳定(该目标文件约18MB,设置阈值为17MB)
while(file.size(wsc_file) < 17*1024*1024) {
  Sys.sleep(1)
}
  
wsc_mdb <- RODBC::odbcConnectAccess2007(wsc_file)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:02:44