ver*_*lcw 17 linux r unixodbc rodbc
我在Red Hat Linux 6服务器上运行R 2.15.2.我的目标是通过RODBC连接到另一台机器上的MS SQL Server数据库.我做了我的研究,并从微软支持网站下载并安装了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>
Run Code Online (Sandbox Code Playgroud)
所以我知道我有我odbc.ini和odbcinst.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
Run Code Online (Sandbox Code Playgroud)
这是odbcDataSourcesR中命令的结果:
> odbcDataSources()
named character(0)
Run Code Online (Sandbox Code Playgroud)
我一直在做一些研究,我认为解决方案(尽管我可能是错的)可能与正确配置ODBC环境变量有关,这样RODBC就知道去哪里找odbc.ini.根据我的研究,我发现了以下可能相关的环境变量:$ODBCINI, $ODBCSYSINI, $ODBC_ROOT $ODBC_INCLUDE, and $ODBC_LIBS. 我对这些应该设置的内容有一个合理的认识,但我不确定如何永久设置它们,以便RODBC可以识别在哪里可以找到适当的文件.
任何人都可以为我阐明这一点吗?我不确定我是否正确理解环境变量在linux中是如何工作的,特别是为什么isql连接没有问题,但是RODBC甚至找不到驱动程序/数据源.
注意:当我安装了unixODBC的repo版本时,RODBC将使用install.packages('RODBC')R中的命令安装得很好.但是,在我从源安装unixODBC 2.3.0之后,由于依赖性问题,RODBC安装将失败,我不得不使用此处发布的指南从源代码安装RODBC .是否有可能我无法正确配置ODBC,这就是为什么我现在遇到麻烦?
哇,我以为我是唯一一个从事这类工作的人.我不得不解决同样的问题,发现最好的解决方案是使用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]"));
Run Code Online (Sandbox Code Playgroud)