Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql RODBC查询返回零行 问题:RODBC(错误)返回零行 情况:_Sql_R_Odbc_Rodbc - Fatal编程技术网

Sql RODBC查询返回零行 问题:RODBC(错误)返回零行 情况:

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

我使用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                         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)