Sql 在odbcCloseAll()之后,R中缓存的RODBC odbcConnect()失败
我基本上使用了Joe Cheng和Aaron Mackey在R中发布的用于缓存SQL连接的代码。在我调用odbcCloseAll,然后再次尝试调用getConnection之前,它工作得很好。下面是我一步一步做的: 调用getConnection-这可以正常工作 调用odbcCloseAll-看看如果所有连接都以某种方式关闭会发生什么 调用getConnection-这是我遇到错误的地方 错误 直到我调用rmlist=lsall.names=TRUE并将getConnection函数再次源代码化到R中,我才得到要消失的错误消息 我的代码如下所示: 图书馆RODBCSql 在odbcCloseAll()之后,R中缓存的RODBC odbcConnect()失败,sql,r,caching,Sql,R,Caching,我基本上使用了Joe Cheng和Aaron Mackey在R中发布的用于缓存SQL连接的代码。在我调用odbcCloseAll,然后再次尝试调用getConnection之前,它工作得很好。下面是我一步一步做的: 调用getConnection-这可以正常工作 调用odbcCloseAll-看看如果所有连接都以某种方式关闭会发生什么 调用getConnection-这是我遇到错误的地方 错误 直到我调用rmlist=lsall.names=TRUE并将getConnection函数再次源代码化
getConnection您已关闭连接。函数要做的第一件事是检查连接是否存在。如果它这样做了,它将返回它。如果没有,并且只有在没有的情况下,它才能建立连接。删除函数中的else,如下所示,防止它关闭不存在的连接,我相信它应该可以工作
library(RODBC)
getConnection <- function() {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- odbcConnect("myDsn")
}
if (class(try(sqlQuery(.connection, "SELECT 1"))) == "try-error") {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- odbcConnect("myDsn")
}
else {
odbcClose(.connection)
}
.connection <<- odbcConnect("myDsn")
}
return(.connection)
}
谢谢你的回复。我尝试使用您发布的代码,删除了else,但仍然得到一个错误:sqlQuery.connection中出错,选择1:第一个参数不是开放的RODBC通道隐藏回溯重新运行,odbcClose中出现调试错误。连接:参数这次不是开放的RODBC通道,我相信,第一个条件失败;也就是说,R认为存在连接。在第二种情况下失败,其中.connection不是开放的RODBC通道。是否包括检查是否存在.connection?我尝试了使用第二个if发布的代码!存在。。。检查ifclasstry的内部。。。我仍然在sqlQuery.connection中遇到错误,选择1:第一个参数不是odbcClose中的开放RODBC通道错误。连接:参数不是开放RODBC通道,因此调用odbcCloseAll:-.连接仍然存在-。连接不是开放RODBC通道抱歉。。。下面继续评论:sqlQuery.connection中出错,请选择1:第一个参数不是odbcClose中的开放RODBC通道错误。连接:参数不是开放RODBC通道,因此调用odbcCloseAll后似乎:-。连接仍然存在-。连接不是开放RODBC通道-classtrysqlQuery。。。失败,因为它可能期望一个开放的RODBC通道甚至尝试-否则{odbcCose…也会失败,因为。连接不是RODBC通道。我的想法正确吗?该错误不可能发生。它包含在一次尝试中。
library(RODBC)
getConnection <- function() {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- odbcConnect("myDsn")
}
if (class(try(sqlQuery(.connection, "SELECT 1"))) == "try-error") {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- odbcConnect("myDsn")
}
else {
odbcClose(.connection)
}
.connection <<- odbcConnect("myDsn")
}
return(.connection)
}
getConnection <- function() {
if (!exists('.connection', where=.GlobalEnv)) {
.connection <<- odbcConnect("myDsn")
}
if (class(try(sqlQuery(.connection, "SELECT 1"))) == "try-error") {
odbcClose(.connection)
.connection <<- odbcConnect("myDsn")
}
return(.connection)
}