Подтвердить что ты не робот

Запросы RODBC возвращают нулевые строки

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

Ситуация:

Я использую RODBC для подключения к DSN, который я создал с помощью коммерческого DB ODBC-драйвера (OSI Soft PI Historian Time Series 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
4b9b3361

Ответ 1

Оказывается, все, что мне нужно было сделать, это установить 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)

Ответ 2

  • Проверьте правильность работы драйвера ODBC. Каждый драйвер ODBC должен предоставлять простые средства для проверки соединения. Также попробуйте подключиться к источнику ODBC, используя MS Office (Access, Excel...) или Open Office.
  • Если это работает, перейдите к R и попробуйте самый простой запрос, например select 1 (ваш запрос не самый простой, как отметил darcken! запрос обязательно).
  • Если это не сработает, попробуйте вызвать функцию odbcGetErrMsg() после каждого вызова функции RODBC (после подключения, после запроса,...).

Ответ 3

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

believeNRows = FALSE

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

Ответ 4

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

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

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

Ответ 5

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

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

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