RODBC无法识别我的odbc设置

时间:2012-12-11 12:47:10

标签: linux r unixodbc rodbc

我在Red Hat Linux 6服务器上运行R 2.15.2。我的目标是通过RODBC连接到另一台机器上的MS SQL Server数据库。我做了我的研究,并从the microsoft support website下载并安装了Linux版本的MS SQL ODBC驱动程序。我从源代码构建了unixODBC版本2.3.0,因为它是windows驱动程序所必需的,并且还没有在RHL repos中(repo版本是2.2.14)。

无论如何,经过一些工作,我终于安装并正确配置了驱动程序,并且我可以通过isql命令成功连接到SQL Server数据库:

$ isql -v test testuser testpass
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

所以我知道我已正确设置odbc.iniodbcinst.ini个文件。

但是,当我尝试从R中访问ODBC连接时,会发生以下情况:

> test <- odbcDriverConnect('DSN=test;Database=RSQLTest01;Uid=testuser;Pwd=testpass')
Warning messages:
1: In odbcDriverConnect("DSN=test;Database=RSQLTest01;Uid=testuser;Pwd=testpass") :
   [RODBC] ERROR: state IM002, code 0, message [unixODBC][Driver Manager]Data 
   source name not found, and no default driver specified
2: In odbcDriverConnect("DSN=test;Database=RSQLTest01;Uid=testuser;Pwd=testpass") :
   ODBC connection failed

以下是R中odbcDataSources命令的结果:

> odbcDataSources()
named character(0)

我一直在做一些研究,我认为解决方案(尽管我可能错了)可能与正确配置ODBC环境变量有关,这样RODBC就知道去哪里找odbc.ini。基于我的研究,我发现了以下可能相关的环境变量:$ODBCINI, $ODBCSYSINI, $ODBC_ROOT $ODBC_INCLUDE, and $ODBC_LIBS.我对这些应该设置的内容有一个合理的认识,但我不确定如何永久设置它们,以及RODBC可以识别在哪里找到合适的文件。

任何人都可以为我阐明这一点吗?我不确定我是否正确理解环境变量在linux中是如何工作的,特别是为什么isql连接没有问题,但是RODBC甚至找不到驱动程序/数据源。

注意:当我安装了unixODBC的repo版本时,RODBC将使用R中的install.packages('RODBC')命令安装得很好。但是,在我从源安装unixODBC 2.3.0后,RODBC安装将因为一个依赖问题,我不得不使用guide posted here从源代码安装RODBC。是否有可能我无法正确配置ODBC,这就是我现在遇到麻烦的原因?

4 个答案:

答案 0 :(得分:5)

哇,我以为我是唯一一个从事这类工作的人。我不得不解决同样的问题,发现最好的解决方案是使用rjdbc。这更容易配置,因为Linux或osx上的ODBC非常参差不齐。 RJDBC性能很好,因为它使用本机ms sql server jar来执行查询。以下是我们的一个脚本中的示例。您只需从microsoft下载sqljdbc4.jar,然后将install.package(“RJDBC”)下载到您的环境中。我意识到你正在努力让ODBC工作,我确实让它在osx上工作,但我放弃了由于时间的Linux。

library(RJDBC);  

drv <- JDBC('com.microsoft.sqlserver.jdbc.SQLServerDriver', '/usr/local/project/dataproviders/jdbc/sqljdbc4.jar', identifier.quote="'"); 

ch <- dbConnect(drv, 'jdbc:sqlserver://the.server.address.net;databaseName=DataWarehouse', 'USERNAME', 'PASSWORD'); 

allsupp_allprod_allproc <- dbGetQuery(ch, paste("SELECT  [Date], Sum([Fail]) as Numerator, Sum([Pass] + [Fail]) as Denominator,'' as Annotation,'True'  as 'Use for CL' FROM [PSU_YieldData] Group by [Date] Order by [Date]")); 

答案 1 :(得分:2)

在Ubuntu Server中我设置如下


  • 编辑〜/ .bash_profile

    nano ~/.bash_profile

  • 添加以下行

    export ODBCINI=/usr/local/etc/odbc.ini export ODBCSYSINI=/usr/local/etc


然后RODBC会很好用。

答案 2 :(得分:2)

它无法找到驱动程序,因为您没有指定它!我不明白DSN的内容是如何工作的,但是在类似的情况下这对我有用:

ch <- odbcDriverConnect('driver={SQL Server};server=servername;database=databasename;uid=username;pwd=password;')
sqlQuery(ch,'sql script',stringsAsFactors = FALSE)

当然需要准确。并使用您拥有的任何驱动程序替换{SQL Server}。这是棘手的部分。 servername与下拉列表中的Management Studio相同,可能是&#34; test&#34;在你的情况下。 isql必须自动使用正确的驱动程序。

即。对于MySQL,它可能是:

Driver={MySQL ODBC 5.1 Driver};Server=localhost;Database=myDataBase;User=myUsername;Password=myPassword;Option=3;

我只是搜索&#34; mysql odbc连接字符串&#34;而不是具体的任何东西。

答案 3 :(得分:1)

在Mac OS 10.13.3 High Sierra上配置unixODBC后,我也遇到了这个问题。我尝试配置.Renviron为ODBCINI设置R特定的环境变量,但RODBC仍然不会列出我的数据源名称(DSN)。另外,我无法找到在ODBCinst.ini中指定的驱动程序,甚至可以使用RODBC :: ODBCDriverConnect()获取连接字符串,尽管能够连接isql。

我能够使JDBC连接正常工作,但我并不想依赖JVM,而且我已经为RODBCext编写了重要的数据库访问代码。

最终工作的原因很简单:

remove.packages('RODBC')
install.packages('RODBC', type="source") 

看起来如果你从mac上安装了RODBC,它会正确地选择odbc.ini文件和odbcinst.ini文件。

感谢这篇帖子关于解锁密钥的微妙评论: http://eriqande.github.io/2014/12/19/setting-up-rodbc.html