在 R 中使用 RODBC 连接到 Azure SQL

Posted

技术标签:

【中文标题】在 R 中使用 RODBC 连接到 Azure SQL【英文标题】:Using RODBC in R to connect to Azure SQL 【发布时间】:2016-04-15 06:43:05 【问题描述】:

我正在使用 R 3.2.4 和 El Captain,我想使用 R 中的 RODBC 包连接到 Azure SQL,我做了以下安装

brew install unixodbc
install.packages("RODBC",type="source")

还有

brew install freetds --with-unixodbc 

上述命令的输出:

Warning: unixodbc-2.3.4 already installed
Warning: freetds-0.95.80 already installed

但每当我尝试使用以下连接时:

library("RODBC")

con = odbcDriverConnect(
  'driver = SQL Server;
  Server = xxxxxx;
  Database = xxxxx;
  User Id= xxxxx;
  Password= xxxxx;')

我收到以下错误:

[RODBC] ERROR: state IM007, code 59478176, message [iODBC][Driver Manager]No data source or driver specified, dialog prohibited

【问题讨论】:

我怀疑 ODBC 连接字符串对空格很敏感。删除 = 周围的所有空格,并删除换行符。有关示例,请参阅 connectionstrings.com/sql-azure。 对不起,这不起作用 【参考方案1】:

这是我的第一篇文章,所以请见谅。我已将此设置用于 Windows 环境和使用 Active Directory 的 Azure SQL 服务器。

针对这个问题的攻击计划:

首先尝试使用 SQL server management Studio 连接到 Azure 数据库。

其次,尝试使用odbcad32 连接到 Azure 数据库。如果可行,您可以创建一个用户 DSN,出于示例的原因,我将其称为 example

最后在R中使用odbcDriverConnect("DSN=example;")

首先尝试使用 Sql Server Management Studio 登录 Azure 数据库。这涉及两个子步骤。

    在目标数据库上,您的用户域和名称可能与您尝试连接到目标数据库的计算机上的用户域和名称不同。如果是这种情况,则使用 Windows 中的凭据管理器创建凭据。

Creating a windows credential to match your identity with that used by the Azure database

    在与 SQL Server Management Studio 连接时出现的对话框中验证身份验证方法。因此,在我的机器上,我看到 Azure SQL 服务器使用了一个叫做 'Active Directory Integration' 的东西。

Select the method of authentication that applies

其次,使用 ODBC 管理员更方便,而不是直接使用 RODBC 调用进行测试。运行“odbcad32”。您必须选择驱动程序。

如果您想使用 Active Directory 进行身份验证,您需要“ODBC Driver 13 for SQL Server”。其他驱动程序,例如“SQL Server”和“Native Client”不支持 Active Directory。

创建一个用户 DSN 并对其进行测试。 The end result should look like this.

如果您没有获得预期的成功,您可能会收到以下错误消息。

If this occurs simply go ahead and install the required software

继续安装登录助手。

另一个可能弹出的错误是您尚未安装 SQL Server 的 Active Directory 身份验证库的错误。如果您通过 SQL Server Management Studio 进行设置,这肯定不是真的。问题是odbcad32 找不到adalsql.dll。解决方案是添加一些注册表项。

Which registry entries to add

附录:下面有些人注意到他们使用 11.0 驱动程序而不是 13.0 驱动程序。他们是完全正确的,但那是因为他们使用用户/密码身份验证。如果您的服务器使用活动目录集成,您确实需要 13.0 或更高版本的 ODBC 驱动程序。

【讨论】:

【参考方案2】:

所以在经历了很多尝试和错误之后,这就是我所拥有的:

1) 抛弃 RODBC 并使用 RSQLServer

install.packages("RSQLServer")

创建一个名为“sql.yaml”的配置文件(使用sublime),内容如下:

SQL_PROD:
    server: 11.1.111.11
    type: &type sqlserver
    port: &port 1433
    domain: &domain companyname
    user: &user winusername
    password: &pass winpassword
    useNTLMv2: &ntlm true
SQL_DEV:
    server: 11.1.111.15
    type: *type
    port: *port
    domain: *domain
    user: *user
    password: *pass
    useNTLMv2: *ntlm
AW:
   server: <yourservername>
   type: sqlserver
   user: <username>
   password: <password>
   port: 1433

2) 将此 YAML 文件保存在以下位置(在 R 中运行以下命令:Sys.getenv("HOME"))例如:如果用户名是 dave,则其“/Users/dave”

3)

 #############
 #     DBI   #
 #############

# Note we do not attach the RSQLServer package.
library(DBI)
# Connect to AW server in ~/sql.yaml
aw <- dbConnect(RSQLServer::SQLServer(), "AW", database = 'db')

# RSQLServer only returns tables with type TABLE and VIEW.
dbListTables(aw)

【讨论】:

【参考方案3】:

我安装了“odbc”库并按照 RStudio 页面上的说明设置了连接。 11.0 驱动程序为我工作。

library(odbc)
con <- dbConnect(odbc(),
             Driver = "SQL Server Native Client 11.0",
             Server = "servername",
             Database = "databasename",
             UID = "username",
             #PWD = rstudioapi::askForPassword("Database password"),
             PWD = "pwd",
             Port = 1433)

【讨论】:

我在 mac 中得到 Error: nanodbc/nanodbc.cpp:950: 01000: [unixODBC][Driver Manager]Can't open lib 'SQL Server Native Client 11.0' : file not found。有什么线索吗?

以上是关于在 R 中使用 RODBC 连接到 Azure SQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 R studio 连接到 dashDB 的 RODBC

RODBC 包的替代方案,用于从 R 连接到 MS Access

使用 docker、rbase 和 RODBC 连接到 sql server 时出错

从 R 连接到 Oracle 数据库? [复制]

使用 R RODBC 参数化 SQL 查询

将 R 连接到 MS Access 64 位 Windows