使用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
可能原因及解决方法
核心原因分析
- 二进制文件下载模式缺失:
.mdb是二进制格式文件,download.file()默认使用文本模式下载,会导致文件损坏,临时目录下的文件校验更严格,问题暴露更明显。 - 系统临时目录权限限制:Windows默认临时目录(
tempdir()返回的路径)权限管控严格,Access ODBC驱动可能无法读取该目录下的文件。 - 临时文件名/路径兼容性问题:
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
相关产品推荐
相关产品推荐

