首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RODBC连接问题

RODBC连接问题
EN

Stack Overflow用户
提问于 2022-04-01 17:42:42
回答 1查看 76关注 0票数 0

我试图使用RODBC连接到access数据库。在这个项目中,我曾多次使用相同的结构,并取得了成功。然而,在这种情况下,它现在是失败的,我不知道为什么。代码不是真正的reprex,因为我不能提供DB,但是.这适用于单个表:

代码语言:javascript
复制
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

但是,我真的很想在一个函数中使用它,这样我就可以将几个类似的表读入列表中。作为一种功能,它不起作用:

代码语言:javascript
复制
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

以上代码将返回错误:

代码语言:javascript
复制
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文件,但每次都要提取不同的工作表名。

我是不是太快地打开和关闭了它,它对我很生气?这似乎不太可能,因为如果我强制它作为函数的第一行,它只会打印第一个表名。如果它对打开关闭的速度感到恼火,我希望它在抛出错误之前打印两个表名。

EN

回答 1

Stack Overflow用户

发布于 2022-04-01 20:06:13

return返回它的参数并退出,这样剩下的代码(odbcCloseAll())就不会被执行,打开的文件(AccessDB)仍然像您想象的那样被锁定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71710891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档