在MAC中将R连接到SQL Server

时间:2019-05-13 22:11:19

标签: sql r sql-server connect rodbc

我想将R连接到我的MAC(El Capitan)上的SQL Server,我可以在Python中很容易地做到这一点,但是在R中却不能。

在Python中,它很容易做到:

import pymssql
pymssql.connect(server = 'CHWN-DSX-DB02', user = 'XXXX',password ='XXXX',database = 'Info')

对于R,我尝试了RODBC库,但是没有用,我认为问题出在“驱动程序”上:

driver.name <- "SQL Server"
db.name <- "Info"
host.name <- "CHWN-DSX-DB02"
port <-""
server.name <-"XXX"
pwd <- "XXX"
# Use a full connection string to connect to a SAMPLE database
con.text <- paste("DRIVER=",RMySQL::MySQL(),
                  ";Database=",db.name,
                  ";Server=",host.name,
                  ";Port=",port,
                  ";PROTOCOL=TCPIP",
                  ";UID=", server.name,
                  ";PWD=",pwd,sep="")

con1 <- odbcDriverConnect(con.text)

R中的这段代码永无止境,当我停止它时,会出现以下警告:

  

警告消息:
  1:在odbcDriverConnect(con.text)中:
  [RODBC]错误:状态00000,代码0,消息[iODBC] [驱动程序管理器] dlopen(SQL Server,6):找不到图像

1 个答案:

答案 0 :(得分:0)

当前设置存在几个问题:

  1. 常规API与特定API :在Python中,您使用的是特定SQL Server API:pymssql。为了与R尝试进行公平比较,您应该使用ODBC API:pyodbc(与RODBC比较)。请记住,有多种方法可以通过特定的API或通用的API(ODBC,OLEDB,JDBC等)从客户端应用程序连接到后端数据库或数据存储。

  2. 必需的驱动程序:要使用任何ODBC库(无论是Python,R还是其他语言),您都需要在客户端计算机上安装一个ODBC驱动程序。在尝试连接前 下载此类驱动程序。几乎每个RDBMS或数据存储都维护(通常免费下载)适用于Windows,Mac和Linux操作系统(包括SQL Server:20132017)的ODBC驱动程序。

  3. 混合R库:在R中,大多数API都遵循DBI标准,包括ROracle, RJDBC, odbc, RMySQL, RPostgreSQL, RSQLite。不幸的是,RODBC没有遵循该标准。您尝试的连接似乎是使用DBI对象的尝试的RMySQL::MySQL()连接,而DBI中的 even 不是ODBC连接字符串的一部分。

    请注意,尽管两者都需要基础ODBC驱动程序(请参阅#2),但是RODBC是与odbc不同的库和实现。此外,请勿将特定的API(例如RMySQL)与尝试的常规SQL Server ODBC进行混淆。实际上,尚不清楚在拥有driver.name变量的情况下为什么要使用RMySQL的原因。同样'SQL Server'是Windows ODBC驱动程序名称,而不是macOS或Linux名称。请参见下面的R ODBC连接:

    RODBC

    driver.name <- "ODBC Driver 13 for SQL Server"      # REQUIRES DOWNLOAD
    driver.name <- "ODBC Driver 17 for SQL Server"      # REQUIRES DOWNLOAD
    ...    
    con.text <- paste0("driver=", driver.name,
                      ";database=", db.name,
                      ";server=", host.name,
                      ";port=", port,
                      ";protocol=TCPIP",
                      ";UID=", user.name,
                      ";PWD=", pwd)
    
    conn <- odbcDriverConnect(con.text)
    

    odbc

    conn <- dbConnect(odbc::odbc(), driver = driver.name,
                      server = host.name, port = port, database = db.name
                      uid = user.name, pwd = pwd)
    
    # ALTERNATIVE:
    conn <- dbConnect(odbc::odbc(), .connection_string = con.text)