2011-05-10 140 views
0

我正在访问商业数据库。通过提示:RODBC返回0值

select PersonCode, PersonDate from CODB.mastertable where PersonCode=42 
PersonCode PersonDate 
----------- ------------ 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 
     42 Jan 3 2011 

在R:

library(RODBC) 
query <- "select PersonCode, PersonDate from CODB.mastertable where PersonCode=42" 

connection1 <- odbcConnect("RESDB", uid="userID", pwd="pwdaccess", believeNRows=FALSE) 

sqlQuery(connection1,query) 


sqlQuery(connection1,query) 
    PersonCode     PersonDate 
1   42 01/03/2011 00:00:00.000 UTC 
2   42 01/03/2011 00:00:00.000 UTC 
3   42 01/03/2011 00:00:00.000 UTC 
4   42 01/03/2011 00:00:00.000 UTC 
5   42 01/03/2011 00:00:00.000 UTC 
6   0 01/03/2011 00:00:00.000 UTC 
7   0 01/03/2011 00:00:00.000 UTC 
8   0 01/03/2011 00:00:00.000 UTC 
9   0 01/03/2011 00:00:00.000 UTC 
10   0 01/03/2011 00:00:00.000 UTC 

查询的输出不正确。有没有人遇到过这个问题?这里有一些附加信息。

> sessionInfo() 
R version 2.12.1 (2010-12-16) 
Platform: x86_64-unknown-linux-gnu (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base 

other attached packages: 
[1] timeDate_2130.92 data.table_1.5.3 RODBC_1.3-2 

loaded via a namespace (and not attached): 
[1] tools_2.12.1 
+0

?你是通过ODBC还是直接连接?使用R,你使用的是什么ODBC驱动程序?在使用64位Linux的RODBC中存在已知的错误,但当您应该获得NA(NULL数据)时,它们通常会给出0。我从来没有见过非NULL数据的腐败。 – Harlan 2011-05-10 21:01:55

+0

我认为你的R安装(locale可能?)有一些非常时髦的事情。这看起来非常类似于[早期问题](http://stackoverflow.com/q/5915728/271616)。这是否发生在您之前的问题中显示的两种情况中? – 2011-05-10 21:05:12

+0

@harlan 1. sqsh,或者也叫dbvis的前端。其他用户使用其他应用程序获得相同的结果。 2.如何告诉正在使用的ODBC驱动程序?我想提供这些信息。 @joshua不,这不是我昨天遇到的问题。虽然我必须说,在3次罢工后,我可能不得不将一些关键代码移到Python中。我不能承受错误。 – gappy 2011-05-10 21:12:08

回答

1

找到了解决办法;不知道为什么它的工作原理,但在这里它是:当你说“通过提示”,您使用什么应用程序使用的选项rows_at_time=1

sqlQuery(connection1,query,rows_at_time=1) 
1

您可以使用odbcGetInfo()查看有关所使用的驱动程序的信息。

考虑到ODBC的起源,你有尝试过使用ROracle(DBI包)吗?在Linux环境中,RJDBC也可能是一个更稳定的选项,特别是现在fetch()代码已被重新​​编写为Java(截至R-Forge开发版0.2-0),其性能与(如果不是好于)RODBC。

这听起来很明显,但问题是否发生在R32上(如果这对你来说甚至是一种选择)?众所周知,32位与64位驱动程序的不兼容性难以追查; Windows会抱怨使用R64和32位ODBC驱动程序导致架构不匹配,并导致odbcConnect()彻底失败,但我不知道Linux是否相同。

+0

不幸的是,ROracle近四年来一直没有更新。 R对Oracle的支持是在企业系统中使用的一个*真正的问题,有人必须投资解决方案!试图修补ODBC来处理64位问题是一个巨大的痛苦,作者没有时间处理它。 – Harlan 2011-05-11 15:21:43