如何安装 RODBC 以便使用 unixODBC?

How do I install RODBC so that is uses unixODBC?

在安装和配置 FreeTDS 和 unixODBC 并确认它们正常工作后,我正在尝试配置 RODBC。但是,当我尝试在 R 控制台中查看 ODBC 数据源时,我得到了以下结果。

> odbcDataSources()
named character(0)

如果我尝试使用 FreeTDS 驱动程序,我会得到以下结果。

>odbcDriverConnect("driver={FreeTDS};server=xx.xx.xx.xx;port=1433;database=XXXX_Analysis;trusted_connection=true;UID=********;PWD=********") :
[RODBC] ERROR: state IM003, code 0, message [iODBC][Driver Manager]Specified driver could not be loaded

根据错误,RODBC 似乎正在尝试使用 iODBC 而不是 unixODBC。我不确定如何配置 RODBC 以使用 unixODBC。

事实证明,默认的 RODBC 软件包安装不适用于 unixODBC。下面是重新编译安装RODBC的过程。

  1. 通过 R 控制台删除当前的通用 RODBC 包。

    >remove.packages("RODBC")
    Removing package from ‘/Library/Frameworks/R.framework/Versions/3.4/Resources/library’
    (as ‘lib’ is unspecified)
    
  2. 下载 RODBC 的源代码。

    https://cran.r-project.org/src/contrib/RODBC_1.3-15.tar.gz

  3. 将环境变量 DYLD_LIBRARY_PATH 设置为您的 unixODBC 库所在的位置。我使用自制软件安装 unixODBC,所以我的库位于 /usr/local/lib。

    export DYLD_LIBRARY_PATH=/usr/local/lib

  4. 现在重新安装 RODB,以便它选择新的库位置。

    R CMD INSTALL /Users/xxxxxx/Downloads/RODBC_1.3-15.tar.gz

有相当多的输出,但看最后,您应该会看到类似这样的内容。

clang -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o RODBC.so RODBC.o -lodbc -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
    installing to /Library/Frameworks/R.framework/Versions/3.4/Resources/library/RODBC/libs
    ** R
    ** inst
    ** preparing package for lazy loading
    ** help
    *** installing help indices
    ** building package indices
    ** installing vignettes
    ** testing if installed package can be loaded
    * DONE (RODBC)

注意 -L/usr/local/lib 表示图书馆位置已被提取。

现在您应该能够看到 unixODBC 提供的 ODBC 连接。回到重新启动的 R 控制台,您可以键入以下内容以验证 RODBC 是否正在使用 unixODBC。

> library("RODBC")
> odbcDataSources()
      MYMSSQL1        MYMSSQL XXXXXXXXX_C_DB  XXXXXXXX-SQL1 
     "FreeTDS"      "FreeTDS"      "FreeTDS"      "FreeTDS" 

感谢 hiltmon 帮助我走上正轨。

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

最终起作用的只是:

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

似乎如果您在 mac 上从源代码安装 RODBC,它会正确地选择 odbc.ini 文件和 odbcinst.ini 文件。

多亏了这个 post 的微妙评论才能解锁密钥: http://eriqande.github.io/2014/12/19/setting-up-rodbc.html

正确的方法是将 odbc 管理器指定到包的配置脚本中,就像这样

install.packages("RODBC", 
 type = "source", 
 INSTALL_opts="--configure-args='--with-odbc-manager=odbc'"
)

--with-odbc-manager=odbc 表示您要使用 unixODBC
--with-odbc-manager=iodbc 表示您要使用 iODBC