【问题标题】:RODBC queries returning zero rows返回零行的 RODBC 查询
【发布时间】: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 -&gt; [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)连接到数据库吗?

标签: sql r odbc rodbc


【解决方案1】:

事实证明,我需要做的就是在设置 ODBC 连接时设置 rows_at_time = 1believeNRows = 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)

【讨论】:

  • 非常感谢您的回答。我遇到了同样的(令人困惑的)问题,而您为我节省了很多时间。
  • 很高兴为您提供帮助。我很好奇,您使用的是 PI Historian ODBC 还是其他一些挑剔的 ODBC?
  • SQLite 驱动程序似乎也需要相信NRows = FALSE。
【解决方案2】:

尝试添加

believeNRows = FALSE

到查询。这是一些驱动程序在结果集上报告错误大小的问题。

【讨论】:

  • 嘿Dirk,不幸的是sqlQuery(piconn, sqlStr, believeNRows = FALSE) 仍然返回零行。 sqlQuery(piconn, sqlStr, believeNRows = FALSE, max = 0) 也是如此,我看到其他人已经成功了(虽然,对于 Oracle)。
  • 原来我需要添加believeNRows = FALSErows_at_time = 1。谢谢德克。
【解决方案3】:
  1. 测试 ODBC 驱动程序是否正常工作。每个 ODBC 驱动程序都应该提供简单的方法来测试连接。还可以尝试使用 MS Office(Access、Excel...)或 Open Office 连接到 ODBC 源。
  2. 如果上述方法可行,则转到 R 并尝试最简单的查询,例如 select 1(您的查询并不是最简单的,正如 darcken 所说!您必须尝试最简单的查询以确保)。
  3. 如果不起作用,请尝试在每个 RODBC 函数调用后(连接后、查询后……)调用 odbcGetErrMsg() 函数。

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,并通过在 odbcConnect 调用中添加“rows_at_time=1”来修复它。来自 odbcConnect 帮助:

    *在 RODBC 1.3-0 中报告为错误的几个错误实际上是 ODBC 驱动程序错误,可以通过设置 rows_at_time = 1 来规避(并且该参数下的警告一直存在)。涉及的驱动程序是第三方 Oracle 驱动程序和旧的 SQL Server 驱动程序。*

    就我而言,我在 OS X Lion 上运行 64 位 R 2.15.0、RODBC 1.3-5 和实际 ODBC Oracle 驱动程序。

    【讨论】:

    • 感谢克拉斯!事实证明,你和德克都是对的。 rows_at_time = 1believeNRows = FALSE 的组合就是这里的诀窍。
    【解决方案5】:

    我认为您需要首先通过让 SELECT * FROM MYTABLE 在 R 中工作来排除您实际连接到数据库/表的可能性。如果您无法使其正常工作,那么您的设置/驱动程序有问题。

    一旦您确定可以在 R 中实际查询数据库/表,然后逐步使您的查询更加复杂,并尝试找出问题所在。要尝试的一件事可能是在您的平等条件下加倍 ==。

    我尝试在 R 中使用一堆数据库(sql server、mysql、sqlite),但所有这些数据库的性能都很差。我最好在本机查询数据库,转储为文本,然后将文件读入 R。

    【讨论】:

    • 最简单的查询可能类似于"SELECT * FROM piinterp WHERE time &gt; DATE('-1h')"。这将返回零行。如果没有time &gt; DATE(),您根本无法查询此数据库。我已经尝试了许多其他同样有效的查询变体,它们通过 ODBC 在 Excel 中工作,但在 R 中返回零行。我 100% 确定所有有效查询都在 R 中返回零行。
    • 正如我在上面的评论中所说,尝试像SELECT 0 as n; 这样的简单查询。它没有变得更简单。如果这不起作用,那么您知道这是驱动程序的问题。如果是这样,那么您的查询有问题。
    • 正如我在上面的评论中所说,在此数据库中无法进行像 SELECT 0 as n; 这样的查询。您只需在此时间序列数据库的每个查询中指定表名和日期范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多