【问题标题】:R's dbConnect fails with "DSN error" when executed by script called from batch file当从批处理文件调用的脚本执行时,R 的 dbConnect 失败并出现“DSN 错误”
【发布时间】:2020-03-17 13:31:01
【问题描述】:

我的 Windows 10 机器上安装了 64 位 R,版本 3.6.0。

我使用以下代码在我的机器上建立与本地 MySQL 数据库的连接

library(DBI)
con <- dbConnect( odbc::odbc(),"my_dsn")

其中my_dsn 是 ODBC 数据源管理器中定义的 MySQL 数据库的 64 位系统 DSN。

在新的 R Studio 或 R GUI 会话中执行此代码可以正常工作并提供预期的连接对象。所以我将代码保存到C:/some_folder_location/my_script.R 的R 脚本中。

现在我想从批处理文件中调用脚本。批处理文件包含以下代码:

cd /d C:\some_folder\
"C:\Program Files\R\R-3.6.0\bin\i386\Rscript.exe"  my_script.R
pause

当我执行批处理文件时,出现以下错误:

错误:nanodbc/nanodbc.cpp:950: IM014: [Microsoft][ODBC 驱动程序 Manager] 指定的 DSN 包含之间的体系结构不匹配 驱动程序和应用程序

执行停止

所以我的问题是,为什么这段代码在批处理文件执行时突然不起作用?错误消息似乎是说 DSN 存在问题,但我们知道事实并非如此,因为脚本直接从控制台运行没有问题。

【问题讨论】:

    标签: mysql r odbc r-dbi


    【解决方案1】:

    该错误通常是由于 32/64 位驱动程序和 32/64 位平台不匹配而发生的。您可能安装了两个版本的 R(即两个不同的Rscript.exe),按平台类型(32 位与 64 位)进一步复杂化(3.2 与 3.5)。例如:

    • 您的 Rscript.exe 表示带有子文件夹 i386 的 32 位 R 版本,它与 64 位 DSN 不兼容。
    • 您的 RStudio 和 RGui 可能正在运行与您的 DSN 兼容的 64 位 R 版本。请与R.home() 联系。 这和批处理文件夹一样吗?如果没有,请在该目录的 bin 中使用Rscript.exe

    要在 R GUI 或批处理工具中检查可用数据源,请调用以下命令并比较结果:

    library(odbc) 
    
    odbcListDataSources()    # SEE IF DSN SHOWS
    odbcListDrivers()        # SEE IF DSN USES AVAILABLE DRIVER
    

    【讨论】:

    • 感谢您的回复!所以R.home() 从 RStudio 控制台和批处理文件输出(添加到被调用脚本时)返回“C:/PROGRA~1/R/R-36~1.0”,但是 DSN 列表不同(太长在此处粘贴),缺少目标 DSN。我的一个问题是:如果我调用的 Rscript.exe 指示 32 位版本,并且此版本与 RStudio 控制台中R.home() 返回的版本相同,代码在 RStudio 控制台中工作,是什么允许它在该环境中工作?根据您的有用提示,我希望它在 RStudio 中失败...
    • R.home的bin文件夹内除了i386还有多个子文件夹吗?此外,DSN 是否显示在 RStudio 结果中?你提到了不同的列表。检查您运行的平台:Sys.info()[["machine"]] .
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多