21

問題: RODBC (誤って) 0 行を返す

状況:

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 = FALSE120行を返す必要がありますが、これらの結果はすべてゼロのままです。

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

5 に答える 5

13

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)
于 2012-06-11T23:50:52.480 に答える
3
  1. ODBC ドライバーが正しく動作するかどうかをテストします。各 ODBC ドライバーは、接続をテストするための簡単な手段を提供する必要があります。また、MS Office (Access、Excel...) または Open Office を使用して ODBC ソースに接続してみてください。
  2. 上記が機能する場合は、R に移動して、可能な限り単純なクエリを試してください (darkken が指摘したようselect 1に、クエリは最も単純ではありません! 確認するには、最も単純なクエリを実際に試す必要があります)。
  3. うまくいかない場合は、odbcGetErrMsg()各 RODBC 関数呼び出しの後 (接続後、クエリ後など) に関数を呼び出してみてください。
于 2011-09-23T09:05:16.133 に答える
3

追加してみる

believeNRows = FALSE

クエリに。これは、結果セットで間違ったサイズを報告するいくつかのドライバーで発生した問題です。

于 2011-09-15T02:23:49.007 に答える
1

同じ問題があり、odbcConnect 呼び出しに「rows_at_time=1」を追加して修正しました。odbcConnect ヘルプから:

*RODBC 1.3-0 のバグとして報告されているいくつかのエラーは、実際には、rows_at_time = 1 を設定することで回避できる ODBC ドライバー エラーでした (そして、その引数の下の警告は常にそこにありました)。関連するドライバーは、サードパーティの Oracle ドライバーと古い SQL Server ドライバーです。*

私の場合、OS X Lion で 64 ビット R 2.15.0、RODBC 1.3-5、および Actual ODBC Oracle ドライバーを実行していました。

于 2012-05-24T00:53:07.403 に答える
0

SELECT * FROM MYTABLEをR内で機能させることにより、最初にデータベース/テーブルに実際に接続することを除外する必要があると思います。これを機能させることができない場合は、セットアップ/ドライバーに問題があります。

R内のデータベース/テーブルを実際にクエリできることを確認したら、クエリを徐々に複雑にして、問題がどこにあるかを特定してみてください。試してみるべきことの1つは、平等条件でdouble==になる可能性があります。

R内で多数のデータベース(sql server、mysql、sqlite)を使用してみましたが、すべてのデータベースでパフォーマンスが低下しました。データベースをネイティブにクエリし、テキストにダンプしてから、ファイルをRに読み込む方がよいでしょう。

于 2011-09-17T08:11:43.470 に答える