【问题标题】:RODBC not recognizing my odbc settingsRODBC 无法识别我的 odbc 设置
【发布时间】:2012-11-29 00:50:07
【问题描述】:

我在 Red Hat Linux 6 服务器上运行 R 2.15.2。我的目标是通过 RODBC 连接到另一台机器上的 MS SQL Server 数据库。我做了研究,从the microsoft support website 下载并安装了 MS SQL ODBC 驱动程序的 linux 版本。我必须从源代码构建 unixODBC 版本 2.3.0,因为它是 Windows 驱动程序所必需的,并且尚未在 RHL 存储库中(存储库版本是 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,这就是我现在遇到问题的原因?

【问题讨论】:

  • 即使在 Windows 中,我也发现 odbcDriverConnect 语句很挑剔,以至于我从来没有让它工作。相反,我使用 odbcConnect('odbc_dsn_entry', uid='username')。我知道 ubuntu 有一个 odbc 管理器,它看起来很像一个 windows 的管理器,但并没有做太多的工作来提供更多帮助,尤其是在 red hat 中。此外,我在 odbc 管理器中将数据库设置为用户和系统 dsn 方面取得了更大的成功。

标签: linux r unixodbc rodbc


【解决方案1】:

哇,我以为我是唯一一个从事这种工作的人。我不得不解决同样的问题,发现最好的解决方案是使用 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]")); 

【讨论】:

  • 非常感谢!! JDBC 比 ODBC 简单得多
  • 它对我还不起作用,但上面的行也不起作用(isql -v test testuser testpass。我正在尝试与 FileMaker 连接:ch &lt;- odbcDriverConnect('driver={FileMaker ODBC};server=serverDNS;database=odbc1;uid=admin;pwd=password;')。任何提示?我还发布了一个问题在这里:stackoverflow.com/questions/40823458/…
  • @Bobby 您应该尝试使用 RJDBC。您只需要下载并使用 filemaker jdbc 驱动程序。 help.filemaker.com/app/answers/detail/a_id/13603/~/…
【解决方案2】:

找不到驱动是因为你没有指定!我也不明白 DSN 的东西应该如何工作,但这在类似情况下对我有用:

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

当然需要准确。并将 {SQL Server} 替换为您拥有的任何驱动程序。这是棘手的部分。服务器名称与 Management Studio 中下拉菜单中出现的名称相同,在您的情况下可能是“测试”。 isql 必须自动使用正确的驱动程序。

即对于 MySQL,它可能是:

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

我只搜索“mysql odbc 连接字符串”而不是任何 R 特定的内容。

【讨论】:

    【解决方案3】:

    在 Ubuntu Server 中我是这样设置的


    • 编辑 ~/.bash_profile

      nano ~/.bash_profile

    • 添加这行

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


    那么 RODBC 就可以正常工作了。

    【讨论】:

      【解决方案4】:

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

      我能够使 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

      【讨论】:

        猜你喜欢
        • 2015-01-09
        • 1970-01-01
        • 2020-07-11
        • 2013-02-09
        • 2014-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        相关资源
        最近更新 更多