RODBC无法识别我的ODBC设置

17

我在一个Red Hat Linux 6服务器上运行R 2.15.2。我的目标是通过RODBC连接到另一台机器上的MS SQL Server数据库。我进行了研究,并从Microsoft支持网站下载并安装了Linux版本的MS SQL ODBC驱动程序。由于它是Windows驱动程序所需的,而且尚未在RHL仓库中(仓库版本为2.2.14),因此我必须从源代码构建unixODBC版本2.3.0。

经过一番努力,我终于成功安装和配置了驱动程序,并可以通过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和$ODBC_LIBS。我有一个合理的想法应该设置这些内容,但我不确定如何永久性地设置它们,以便RODBC可以识别出适当的文件所在位置。

有人能为我解释一下吗?我不确定我是否正确理解了环境变量在Linux中的工作方式,特别是为什么isql可以毫无问题地连接,但RODBC甚至找不到驱动程序/数据源。

注意:当我安装了repo版本的unixODBC时,使用R中的install.packages('RODBC')命令可以很好地安装RODBC。但是,在我从源代码安装了unixODBC 2.3.0之后,由于依赖性问题,RODBC安装将失败,并且我必须使用此处发布的指南从源代码安装RODBC。我是否可能最初未正确配置ODBC,这就是为什么现在遇到困难的原因?


即使在Windows中,我发现odbcDriverConnect语句很难处理,以至于我从未让它工作。相反,我使用odbcConnect('odbc_dsn_entry',uid ='username')。我知道Ubuntu有一个ODBC管理器,看起来很像Windows的那个,但在Red Hat中没有做过更多的帮助。此外,在ODBC管理器中将DB设置为用户和系统DSN,我更成功了些。 - Dean MacGregor
4个回答

6

哇,我以为只有我在处理这类问题。我必须解决相同的问题,发现最好的解决方案是使用rjdbc。这要容易配置,因为在Linux或OSX上使用ODBC非常不稳定。 RJDBC性能很棒,因为它使用本地ms sql server jar执行查询。以下是我们脚本中的一个示例。您只需要从Microsoft下载sqljdbc4.jar,然后将其安装.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]")); 

非常感谢!JDBC 比 ODBC 简单多了。 - ganeshran
目前对我来说还没有起作用,而且上面的那一行也没有起作用(isql -v test testuser testpass)。我正在尝试使用FileMaker连接:ch <- odbcDriverConnect('driver={FileMaker ODBC};server=serverDNS;database=odbc1;uid=admin;pwd=password;')。有什么建议吗?我也在这里发布了一个问题:http://stackoverflow.com/questions/40823458/odbc-data-source-name-not-found-and-no-default-driver-specified - Bobby
@Bobby 你应该尝试使用RJDBC。你只需要下载并使用FileMaker JDBC驱动程序即可。http://help.filemaker.com/app/answers/detail/a_id/13603/~/installing-filemaker-jdbc-client-drivers - Chris Hinshaw

2
在Ubuntu服务器上,我像这样设置了:
  • 编辑~/.bash_profile

    nano ~/.bash_profile

  • 添加以下行

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


然后RODBC就可以正常工作了。

2

找不到驱动程序是因为您没有指定它!我不明白DSN应该如何工作,但在类似的情况下,以下方法适用于我:

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

当然,它必须是精确的。将 {SQL Server} 替换为您拥有的任何驱动程序,这是一个棘手的部分。服务器名称与管理工具中下拉列表中出现的内容相同,在您的情况下可能是 "test"。isql 必须自动使用正确的驱动程序。

例如,对于 MySQL,可能是:

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

我只是搜索了“mysql odbc连接字符串”,而不是任何与R有关的内容。


1
我在配置了Mac OS 10.13.3 High Sierra上的unixODBC后也遇到了这个问题。我尝试配置我的.Renviron以设置一个R特定的环境变量来设置ODBCINI,但RODBC仍无法列出我的数据源名称(DSNs)。此外,我无法使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接