为什么我收到有关关闭未使用的RODBC句柄的警告?

mac*_*mac 10 r rodbc

我使用RODBC和R和knitr使用各种生产数据库进行一些报告.在其中一些报告中,我正在针对多个数据库运行多次查询.

我的每个查询都是以以下形式执行的:

get.total.orders <- function(db.connex.string, start.date, end.date){
    db.connex <- odbcDriverConnect(db.connex.string)
    ord.qry <- sprintf("SELECT ord_OrderReference AS 'order.ref',
ord_RegisterDate as 'register.date'
FROM Orders
WHERE ord_RegisterDate >= '%s' AND ord_RegisterDate < '%s'",
                       start.date, end.date)
    orders <- sqlQuery(db.connex, ord.qry)
    odbcClose(db.connex)
    return(orders)
}
Run Code Online (Sandbox Code Playgroud)

请注意,在此函数中打开和关闭ODBC通道,并且在通道的打开和关闭之间只运行一个简单的查询.

尽管如此,当我多次运行报告时(例如,在编写报告时),我会收到以下警告:

Warning: closing unused RODBC handle 41
Run Code Online (Sandbox Code Playgroud)

运行报告的次数越多,错误中报告的句柄数就越高.

为什么,如果我在查询功能中打开和关闭频道,我是否会打开"未使用"的RODBC句柄?

更重要的是,我该如何避免这个问题?

leb*_*nok 5

我会避免这样使用on.exit

get.total.orders <- function(db.connex.string, start.date, end.date){
   db.connex <- odbcDriverConnect(db.connex.string)
   on.exit(odbcClose(db.connex))  # <-----------------------   change here
   ord.qry <- sprintf("SELECT ord_OrderReference AS 'order.ref',
      ord_RegisterDate as 'register.date'
         FROM Orders
         WHERE ord_RegisterDate >= '%s' AND ord_RegisterDate < '%s'",
         start.date, end.date)
 orders <- sqlQuery(db.connex, ord.qry)
 return(orders)
 }
Run Code Online (Sandbox Code Playgroud)

这样,即使出现错误,连接也将关闭。另请参阅?on.exit

[编辑]

上面假定句柄没有关闭,因为执行查询时出错。如果查询还可以,但是句柄没有关闭,那我就不知道了。odbcClose如果成功返回0,那么您可以检查一下。

[EDIT2]

正如其他人指出的那样,这可能没什么好担心的-另一方面,如果您明确告诉它关闭连接,为什么找出未关闭的连接仍然很有趣。也许只是几毫秒,分配结果时查询尚未完成。这对我来说没有多大意义,好像将结果分配给orders了数据库之后还有什么呢?但是也许有些事情。在这种情况下,可能会尝试给它更多时间,例如。

#...
orders <- sqlQuery(db.connex, ord.qry)
orders # or force(orders) - to just evaluate the result once more
Sys.sleep(0.01)  # give it 10 milliseconds
orders # or return(orders) - to return the result
# presuming on.exit as before - so odbcClose will happen here too
}
Run Code Online (Sandbox Code Playgroud)

这听起来确实很愚蠢,但是如果它真的起作用,我不会感到惊讶。

另一个想法是,如果您使用的是Rstudio,则可能会收到一些幻象错误消息,例如,当第一次使用plot不存在的图形参数,而第二次没有错误时。

plot(1, bimbo=2)  # here you get some warnings as bimbo is not a graphical parameter
plot(2)   # nothing wrong here but RStudio replays the previous warnings
Run Code Online (Sandbox Code Playgroud)

db处理程序可能会发生类似的情况-如果是这种情况,那么看看在RStudio和控制台中是否收到相同的警告(在Windows中为Rgui或Rterm或在Linux中为终端中运行R)会很有帮助。如果您使用的是Rstudio,那当然适用。

最后,您可以尝试将它发布在r-help上,因为Brian Ripley(RODBC的作者之一)在那里,但不在这里。

因此,正如您所看到的,我没有一个真正的答案,如果需要花费太多的精力来找出答案,我建议不要担心:)


May*_*you 2

odbcClose()如果连接上有打开的事务,该函数将失败。在这种情况下,该连接将保持打开状态。