RODBC-запросы возвращают ноль строк - PullRequest
20 голосов
/ 15 сентября 2011

Проблема: RODBC (ложно) возвращает ноль строк

Ситуация:

Я использую RODBC для подключения к DSN, созданному мной с использованием коммерческого драйвера ODBC БД (PI Historian Time OSI SoftСерия DB, если вам интересно).

> 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 ]

13 голосов
/ 12 июня 2012

Оказывается, все, что мне нужно было сделать, это установить rows_at_time = 1 в дополнение к believeNRows = FALSE при настройке моего соединения ODBC.

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)
3 голосов
/ 23 сентября 2011
  1. Проверка правильности работы драйвера ODBC .Каждый драйвер ODBC должен предоставлять простые средства для проверки соединения.Также попробуйте подключиться к источнику ODBC с помощью MS Office (Access, Excel ...) или Open Office.
  2. Если вышеприведенное сработает, перейдите к R и попробуйте самый простой запрос , например select 1 (ваш запрос не самый простой, как заметил Даркен! Вы должны попробовать действительносамый простой запрос, чтобы быть уверенным).
  3. Если он не работает, попробуйте вызывать функцию odbcGetErrMsg() после каждого вызова функции RODBC (после подключения, после запроса, ...).
2 голосов
/ 15 сентября 2011

Попробуйте добавить

believeNRows = FALSE

к запросу.Эта проблема возникла из-за нескольких драйверов, которые сообщают о неправильном размере в наборе результатов.

1 голос
/ 24 мая 2012

У меня возникла та же проблема, и я исправил ее, добавив "row_at_time = 1" в вызов odbcConnect. Из справки odbcConnect:

* Несколько ошибок, о которых сообщалось как об ошибках в RODBC 1.3-0, которые на самом деле были ошибками драйвера ODBC, которые можно обойти, установив row_at_time = 1 (и предупреждение под этим аргументом всегда присутствовало) В качестве драйверов были использованы драйверы Oracle сторонних производителей и старые драйверы SQL Server. *

В моем случае я использовал 64-битную версию R 2.15.0, RODBC 1.3-5 и драйвер ODBC для Actual ODBC на OS X Lion.

0 голосов
/ 17 сентября 2011

Я думаю, вам нужно исключить, что вы сначала подключаетесь к базе данных / таблице, заставив SELECT * FROM MYTABLE работать в R. Если вы не можете заставить это работать, значит что-то не так с вашей установкой / драйверами.

Если вы уверены, что действительно можете запросить базу данных / таблицу в R, то постепенно усложняете ваш запрос и пытаетесь определить, в чем проблема. Одна вещь, которую можно попробовать, может быть двойной == при ваших условиях равенства.

Я пытался использовать несколько баз данных (sql server, mysql, sqlite) в R, и у всех их производительность была низкой. Мне кажется, вам лучше исходить из базы данных, делать дамп в текст, а затем читать файл в R.

...