RODBC查询返回零行

时间:2011-09-15 02:01:49

标签: sql r odbc rodbc

问题:RODBC(错误地)返回零行

情况:

我正在使用RODBC连接到我使用商业数据库的ODBC驱动程序创建的DSN(OSI Soft的PI Historian时间序列数据库,如果你很好奇的话)。

> 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

5 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

  1. 测试ODBC驱动程序是否正常工作。每个ODBC驱动程序都应提供测试连接的简单方法。还尝试使用MS Office(Access,Excel ...)或Open Office连接到ODBC源。
  2. 如果上述方法有效,请转到R并尝试最简单的查询,例如select 1(您的查询不是最简单的,正如darcken所说的那样!你必须真的尝试最简单的查询()。
  3. 如果不起作用,请尝试在每次RODBC函数调用后调用odbcGetErrMsg()函数(在连接后,查询后,...)。

答案 2 :(得分:2)

尝试添加

believeNRows = FALSE

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

答案 3 :(得分:1)

我遇到了同样的问题并通过在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驱动程序。

答案 4 :(得分:0)

我认为您需要排除实际连接到数据库/表的方法是首先让SELECT * FROM MYTABLE在R中工作。如果你不能使这个工作,那么你的设置/驱动程序有问题。< / p>

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

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