我试图使用RODBC连接到access数据库。在这个项目中,我曾多次使用相同的结构,并取得了成功。然而,在这种情况下,它现在是失败的,我不知道为什么。代码不是真正的reprex,因为我不能提供DB,但是.这适用于单个表:
library(magrittr);library(RODBC)
#xWalk_path is simply the path to the accdb
#xtabs generated by querying the available tables
x=1
tab=xtabs$TABLE_NAME[x]
temp<-RODBC::odbcConnectAccess2007(xWalk_path)%>%
RODBC::sqlFetch(., tab, stringsAsFactors = FALSE)
odbcCloseAll()
#that worked perfectly但是,我真的很想在一个函数中使用它,这样我就可以将几个类似的表读入列表中。作为一种功能,它不起作用:
xWalk_ls<- lapply(seq_along(xtabs$TABLE_NAME), function(x, xWalk_path=xWalk_path, tab=xtabs$TABLE_NAME[x]){
#print(tab) #debug code
temp<-RODBC::odbcConnectAccess2007(xWalk_path)%>%
RODBC::sqlFetch(., tab, stringsAsFactors = FALSE)
return(temp)
odbcCloseAll()
})
#error every time以上代码将返回错误:
Warning in odbcDriverConnect(con, ...) :
[RODBC] ERROR: Could not SQLDriverConnect
Warning in odbcDriverConnect(con, ...) : ODBC connection failed
Error in RODBC::sqlFetch(., tab, stringsAsFactors = FALSE) :
first argument is not an open RODBC channel我很困惑。我访问db以获取表名,并使用xtabs生成sql Tables变量。而且,在前面的代码中,我使用了类似的代码结构(不完全相同,但是相同的核心:sqlFetch将表检索到列表中),而且没有问题。当时和现在唯一的区别是:然后我打开和关闭不同的.accdb文件,但是从每个文件中提取相同的表名。现在,我打开和关闭相同的.accdb文件,但每次都要提取不同的工作表名。
我是不是太快地打开和关闭了它,它对我很生气?这似乎不太可能,因为如果我强制它作为函数的第一行,它只会打印第一个表名。如果它对打开关闭的速度感到恼火,我希望它在抛出错误之前打印两个表名。
发布于 2022-04-01 20:06:13
return返回它的参数并退出,这样剩下的代码(odbcCloseAll())就不会被执行,打开的文件(AccessDB)仍然像您想象的那样被锁定。
https://stackoverflow.com/questions/71710891
复制相似问题