Sql RODBC查询返回零行 问题:RODBC(错误)返回零行 情况:
我使用RODBC连接到我使用商业数据库的ODBC驱动程序(如果您好奇的话,OSI软件的PI Historian时间序列数据库)创建的DSN 我还能试什么Sql RODBC查询返回零行 问题:RODBC(错误)返回零行 情况:,sql,r,odbc,rodbc,Sql,R,Odbc,Rodbc,我使用RODBC连接到我使用商业数据库的ODBC驱动程序(如果您好奇的话,OSI软件的PI Historian时间序列数据库)创建的DSN 我还能试什么 应该有多行的证明: 在Excel或命令提示符中 SELECT tag, time, status, value FROM piinterp WHERE tag = 'PW1.PLANT1.PRODUCTION_RATE' and time > DATE('-4h') and timestep = '+2m' 结果 TAG
应该有多行的证明: 在Excel或命令提示符中
SELECT tag, time, status, value FROM piinterp WHERE tag = 'PW1.PLANT1.PRODUCTION_RATE' and time > DATE('-4h') and timestep = '+2m'
结果
TAG TIME STATUS VALUE
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:33 448 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:31 452 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:29 390 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:27 419 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:25 413 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:23 393 0
PW1.PLANT1.PRODUCTION_RATE 15/09/2011 9:21 427 0
etc
在R和Excel中,如果我查询一个不存在的标记,可以说tag='aeee11!!!'代码>,它正确返回零行
> sqlQuery(piconn, sqlStr)
[1] TAG TIME STATUS VALUE
<0 rows> (or 0-length row.names)
附加信息
SQL表
> sqlTables(piconn)
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS
1 <NA> <NA> pialias TABLE pialias
2 <NA> <NA> piavg TABLE piavg
3 <NA> <NA> pibatch TABLE pibatch
4 <NA> <NA> picomp TABLE picomp
5 <NA> <NA> piinterp TABLE piinterp
我的会话信息:
sessionInfo()
R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 plyr_1.6 RODBC_1.3-3
loaded via a namespace (and not attached):
[1] tools_2.12.2
尝试添加
believeNRows = FALSE
对查询进行修改。这是一些在结果集中报告错误大小的驱动程序出现的问题。我认为您需要首先通过让SELECT*FROM MYTABLE在R中工作来排除您实际连接到数据库/表的可能性。如果无法使其工作,则说明您的设置/驱动程序有问题
一旦确定可以在R中实际查询数据库/表,然后逐步使查询更加复杂,并尝试隔离问题所在。在等式条件下,可以尝试使用double==
我曾尝试在R中使用大量数据库(SQLServer、mysql、sqlite),但它们的性能都很差。在我看来,最好是本机查询数据库,转储为文本,然后将文件读入R
测试ODBC驱动程序是否正常工作。每个ODBC驱动程序都应该提供测试连接的简单方法。还可以尝试使用MS Office(Access、Excel…)或Open Office连接到ODBC源李>
如果上述方法有效,则转到R并尝试尽可能最简单的查询,如选择1
(正如darcken所指出的,您的查询不是最简单的!您必须尝试最简单的查询才能确定)
如果它不起作用,请尝试在每次RODBC函数调用后调用odbcGetErrMsg()
函数(连接后、查询后……)
我也遇到了同样的问题,并通过在odbcConnect调用中添加“rows\u at\u time=1”来修复它。从odbcConnect帮助中:
*RODBC 1.3-0中报告为Bug的几个错误实际上是ODBC驱动程序错误,可以通过在_time=1时设置行_来避免(该参数下的警告一直存在)。涉及的驱动程序是第三方Oracle驱动程序和旧的SQL Server驱动程序*
在我的例子中,我运行的是64位R2.15.0、RODBC 1.3-5和OS X Lion上的实际ODBC Oracle驱动程序。结果表明,在设置ODBC连接时,除了设置BelienRows=FALSE
之外,我所需要做的就是在时间=1时设置rows\u
piconn <- odbcConnect(dsn = "PI", uid = "pwd", believeNRows = FALSE, rows_at_time = 1)
sqlStr <- "SELECT tag, time, status, value FROM piinterp WHERE tag = 'RV1.MADST101_WINDSPEED' and time > DATE('-12h') and timestep = '+2m'"
results <- sqlQuery(piconn, sqlStr)
piconn如果您完全省略WHERE
子句,是否返回任何数据?对于一个简洁、描述性且经过深思熟虑的问题,我会给您10票赞成票。我肯定你想知道答案,但我帮不了你。可以安全地假设,为piinterp运行table info命令没有区别吗?您能否验证RODBC select语句是否返回行(删除where子句),以帮助区分是查询中的筛选器问题还是获取数据的一般问题?@Joshua,HY000-268[OSI][PI ODBC][PI]偏移量8 token处的语法错误->[2]“[RODBC]错误:无法SQLExecDirect“从piinterp中选择标记、时间、状态、值”
@billinkc。我不知道是否可以为这个RDMBS返回带有WHERE子句的行。但是无论哪种方式,我肯定应该为这个查询返回行,就像从cmd提示符以及Excel中返回的行一样。仅供参考-我的问题是否不清楚?我不清楚虽然还可以,但我会编辑看看我能做些什么。我会尝试以下方法。你能直接在数据库上运行SQL查询而不是通过ODBC吗?你能通过ODBC运行一个简单的查询吗(比如选择0作为n;
)?您可以使用ODBC从其他环境(如VBA或MS Access)连接到数据库吗?嘿,Dirk,不幸的是sqlQuery(piconn,sqlStr,believeNRows=FALSE)
仍然返回零行。正如sqlQuery(piconn,sqlStr,believeNRows=FALSE,max=0)
一样,我已经看到其他人成功地使用了它(尽管对于Oracle)。事实证明,我需要添加believeNRows=FALSE
以及rows\u at_time=1
。感谢Dirk。最简单的查询可能是“从piinterp WHERE time>DATE('-1h')中选择*”
。这将返回零行。没有time>DATE()
。我尝试过许多其他同样有效的查询变体,它们通过ODBC在Excel中工作,但在R中返回零行。我100%确定所有有效查询在R中都返回零行。正如我在上面的评论中所说,尝试一个简单的查询,如选择0作为n;
。它不会变得更简单。如果不起作用,那么你知道这是什么问题正在与驱动程序交互。如果是,则表明您的查询有问题。正如我在上面的评论中所说,在该数据库中不可能执行类似于选择0作为n;
的查询。您只需在该时间序列数据库的每个查询中指定表名和日期范围。非常感谢您的回答。我遇到了相同的问题(莫名其妙)我很好奇,你是在使用PI Historian ODBC还是其他一些挑剔的ODBC?SQLite驱动程序似乎也需要BelienRows=FALSE。谢谢Klaas!事实证明你和Dirk都是对的。时间=1
和BelienRows=F的组合ALSE
是这里的诀窍所在。
sessionInfo()
R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] grid stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.2 reshape_0.8.4 plyr_1.6 RODBC_1.3-3
loaded via a namespace (and not attached):
[1] tools_2.12.2
believeNRows = FALSE
piconn <- odbcConnect(dsn = "PI", uid = "pwd", believeNRows = FALSE, rows_at_time = 1)
sqlStr <- "SELECT tag, time, status, value FROM piinterp WHERE tag = 'RV1.MADST101_WINDSPEED' and time > DATE('-12h') and timestep = '+2m'"
results <- sqlQuery(piconn, sqlStr)