gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:20:42 25 4
gpt4 key购买 nike

我将 RODBC 与 R 和 knit 结合使用,使用各种生产数据库来执行一些报告。在其中一些报告中,我对多个数据库运行多重查询。

我的每个查询都是通过以下形式的函数执行的:

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)
}

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

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

Warning: closing unused RODBC handle 41

运行报告的次数越多,错误中报告的句柄编号就越大。

为什么,如果我在查询函数中打开和关闭 channel ,我是否会留下打开的、“未使用的”RODBC 句柄?

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

最佳答案

我会使用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)
}

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

[编辑]

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

[编辑2]

正如其他人所指出的,这可能没什么好担心的 - 另一方面,如果你明确地告诉它关闭,弄清楚为什么连接没有关闭仍然很有趣。也许这只是几毫秒的问题,并且在分配结果时查询尚未完成。这对我来说没有多大意义,因为如果结果被分配给 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
}

这听起来真的很愚蠢,但如果它真的有效,我不会太惊讶。

另一个想法是,如果您使用 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

也许数据库处理程序也会发生类似的情况 - 如果是这种情况,看看您在 RStudio 和控制台中是否收到相同的警告(Windows 中的 Rgui 或 Rterm 或在 linux 的终端中运行 R)会很有启发。 。如果您使用 Rstudio,这当然适用。

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

所以如你所见,我没有真正的答案,如果需要太多努力才能弄清楚,我建议不要担心:)

关于r - 为什么我会收到有关关闭未使用的 RODBC 句柄的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18618092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com