【发布时间】:2011-11-17 12:20:18
【问题描述】:
问题:RODBC(错误地)返回零行
情况:
我正在使用 RODBC 连接到我使用商业 DB 的 ODBC 驱动程序(OSI Soft 的 PI Historian Time Series DB,如果您好奇的话)创建的 DSN。
> library(RODBC)
> piconn <- odbcConnect("PIRV", uid = "pidemo")
> sqlStr <- "SELECT tag, time, status, value FROM piinterp WHERE tag = 'PW1.PLANT1.PRODUCTION_RATE' and time > DATE('-4h') and timestep = '+2m'"
现在如果我查询,我得到零行。
> sqlQuery(piconn, sqlStr)
[1] TAG TIME STATUS VALUE
<0 rows> (or 0-length row.names)
使用BelieveNRows = FALSE 这些仍然显示零结果,即使它应该返回 120 行。
> sqlQuery(piconn, sqlStr, believeNRows = FALSE)
> sqlQuery(piconn, sqlStr, believeNRows = FALSE, max = 0)
> sqlQuery(piconn, sqlStr, believeNRows = FALSE, max = 0, buffsize = 120)
我还能尝试什么?
证明应该有很多行:
在 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 = 'aeeEEEEE11!!!',它会正确返回零行。
附加信息
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
ODBC 信息
> odbcGetInfo(piconn)
DBMS_Name DBMS_Ver Driver_ODBC_Ver Data_Source_Name Driver_Name Driver_Ver ODBC_Ver Server_Name
"PI" "03.04.0370" "02.01" "PIRV" "PIODBC32.DLL" "01.03.0100" "03.52.0000" "Aurvyzpis1"
我的会话信息:
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
【问题讨论】:
-
如果完全省略
WHERE子句,是否会返回任何数据? -
对于一个简洁、描述性和深思熟虑的问题,我会给你 10 票。我敢肯定,你宁愿有一个答案,但我无法帮助你。可以安全地假设为 piinterp 运行表信息命令没有区别吗?您能否验证 RODBC 选择语句确实返回行(删除您的 where 子句)以帮助区分查询中的过滤器问题与获取数据的一般问题?
-
@Joshua,
HY000 -268 [OSI][PI ODBC][PI]Syntax error at offset 8 token -> [2] "[RODBC] ERROR: Could not SQLExecDirect 'SELECT tag, time, status, value FROM piinterp' -
@billinkc。我不知道是否可以为此 RDMBS 返回不带 WHERE 子句的行。但无论哪种方式,我都肯定应该为此查询返回行,就像在 cmd 提示符和 Excel 中一样。仅供参考-我的问题还不清楚吗?我认为这没问题,但我会编辑看看我能做什么。
-
我会尝试以下方法。您可以直接在数据库上而不通过 ODBC 运行 SQL 查询吗?你能通过 ODBC 运行一个简单的查询(比如
SELECT 0 as n;)吗?您可以使用 ODBC 从其他环境(如 VBA 或 MS Access)连接到数据库吗?