- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 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,因此您可以检查一下。
正如其他人所指出的,这可能没什么好担心的 - 另一方面,如果你明确地告诉它关闭,弄清楚为什么连接没有关闭仍然很有趣。也许这只是几毫秒的问题,并且在分配结果时查询尚未完成。这对我来说没有多大意义,因为如果结果被分配给 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/
简单的 R 脚本 library(RODBC) odbChannel Rscript ./RODBC_SIMPLE_TEST.r Error in odbcQuery(channel, query,
我设置了一个 ODBC 连接到 Netezza(SQL 数据库)。连接很好。但是,R 默认只拉出 256 行,并且限制了它可以拉出的行数。 如果我在 Netezza 中运行查询,它将返回总行数 (30
我正在使用提供的 ODBC 驱动程序和 RODBC 测试新的数据库系统。包裹。 我遇到的问题是,仅在几次查询之后(都在 2~3 分钟或更短的时间内),R 不再将连接识别为有效。 具体来说,它只是一个C
在数据库中,我存储了包含特殊字符(例如“§”)的字符串。使用命令 查询() 从包 RODBC“§”被翻译成“?”。对于法语单词中的“'”等字符也是如此。 当然我不能替换每一个“?”通过查询后的特殊字符
我在使用RODBC的sqlSave创建表时遇到了麻烦(或更准确地说,是将数据写入到创建的表中)。 这与现有的sqlSave问题/答案不同,因为 他们遇到的问题是不同的,我可以创建表,而他们不能,而 我
关于此 R 代码的问题: library(RODBC) ch <- tryCatch(odbcConnect("RTEST"), warning=function(w){print("FAIL!
我正在尝试使用 R/RODBC 对 MSSQL 2008 R2 数据库的结构进行编目。我已经设置了一个 DSN,通过 R 连接并使用了 sqlTables()命令,但这只是获取“系统数据库”信息。 l
我有一个返回 varbinary 输出参数的存储过程。我想从 R 调用它并捕获返回变量。我试过: qq <- "declare @mm varbinary(max); exec spTrain_df_
我有一个返回 varbinary 输出参数的存储过程。我想从 R 调用它并捕获返回变量。我试过: qq <- "declare @mm varbinary(max); exec spTrain_df_
我有一个关于使用 sqlSave 的问题。 R 如何将数据框中的 RODBC 数据映射到数据库表列? 如果我有一个包含 X 和 Y 列的表以及一个包含 X 和 Y 列的数据框,RODBC 会将 X 放
这是我第一次尝试在本地 MySQL 数据库和 R 之间来回传递数据。也就是说,我在数据库中创建了一个表并想将数据插入其中。目前,它是一个空白表(使用 MySQL 查询浏览器创建)并且有一个 PK 集。
我正在使用 RODBC 从 MySql Server 获取数据到 R。 所以在数据库的一列中是一个字符向量 SELECT MAX(CHAR_LENGTH(column)) FROM reqtable;
我正在使用 RODBC 包从 R 连接到 Oracle 数据库,但我没有成功合并来自不同数据库的表而没有“下载”这些表(我不想下载它们,因为它们太大了!)。我想使用类似的东西: DBa=odbcCon
我正在尝试将数据从 Access 数据库导入 R。我想导入某些专业的 CIP 代码,其中可能包含前导零。 RODBC 正在将 CIP 代码转换为数字值,即使它在 Access 中被定义为文本。任何人都
相关 https://stackoverflow.com/a/33284035/3358272 ,我发现从 SQL Server (2014) 中提取数据的行为不一致。 library(RODBC)
我想了解 RODBC 如何确定新创建的 (Access) 表的列类型? sqlSave 的 R 文档非常神秘:“类型是通过咨询参数 varTypes 和 typeInfo 来选择的”。并且没有这个论点
我的数据库表大致如下所示: +-----+-------+--------------------+-----------+----------+ | ID1 | ID2 | FilePath1
所以这很奇怪。如果结果集足够大,RODBC 似乎会删除 DateTime SQL 列的时间部分。 (查询是针对 SQL Server 2012 机器运行的,是的,当我在 SQL Server 端运行它
我正在尝试使用R中的SQLite连接RODBC数据库。RODBC可以连接到数据库,但不能使用sqlTables获取数据库中的表列表,该列表返回"0 rows"。该数据库有20个表。 系统:R 3.1.
我想使用 R 脚本将数据框输入到数据库中的现有表中,并且我希望数据库中的表具有顺序主键。我的问题是 RODBC 似乎不允许主键约束。 这是创建我想要的表的 SQL: CREATE TABLE [dbo
我是一名优秀的程序员,十分优秀!