从Mac / Linux上的R连接到MS SQL Server

时间:2013-01-25 00:13:45

标签: r rjdbc

我正在尝试从Mac / Linux上的R连接到Microsoft SQL Server,我遇到RJDBC问题。当我下载了Microsoft的驱动程序和JTDS时,但以下所有行都不起作用:

library(RJDBC)

drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver",
            "/Users/victor/Downloads/sqljdbc_3.0/enu/sqljdbc4.jar") 

drv1 <- JDBC('net.sourceforge.jtds.jdbc.Driver',
           "/Users/victor/Downloads/jtds-1/jtds-1.3.0.jar")

每个都返回以下错误消息:

Error in .jfindClass(as.character(driverClass)[1]) : class not found

我怀疑问题可能出现在错误的Java版本上:我的默认java是

$ java -version
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

但我的机器上也安装了Jave 1.6。我安装了SquirrelSQL并使用JTDS驱动程序连接到MS SQL Server没有任何问题; SquirrelSQL运行的Java版本是1.7.0.11。

我已运行R CMD javareconf,结果如下:

$ R CMD javareconf
Java interpreter : /usr/bin/java
Java version     : 1.7.0_11
Java home path   : /Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home/jre
Java compiler    : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
Java library path: 
JNI linker flags : -framework JavaVM
JNI cpp flags    : -I$(JAVA_HOME)/include

Updating Java configuration in /Library/Frameworks/R.framework/Resources
Done.

并删除/再次安装RJDBC和rJava包,但仍然无效。

我想我现在卡住了,因为我对Java / RJDBC及其互动并不熟悉。搜索谷歌发现有几个有类似问题的人没有解决方案。

有关如何使JDBC行为的任何提示,或任何其他方式从R连接到MS SQL Server,将非常感谢!

更新1 。好吧,第一个语句似乎现在正常工作 - 我正在获得连接并且可以毫无问题地查询数据库。不知道是什么解决了问题 - 可能是我需要重新启动我的mac / R会话。第二个语句仍然不起作用,并显示相同的错误消息。

6 个答案:

答案 0 :(得分:5)

我已经在这方面苦苦挣扎了一段时间。这是我找到的。

  1. here下载 - 用于SQL Server的Microsoft JDBC驱动程序
  2. 解压缩文件,找到sqljdbc4.jar
  3. 使用:

    drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "<wherever sqljdbc4.jar is>")
    
  4. 这应该有用。

    如果我是对的,那么想法是对于PATH函数中的drv变量,需要指定JDBC驱动程序所在的PATH(如果没有,则下载它)第一)。否则,将收到常见的class not find错误。

答案 1 :(得分:4)

以下代码实现了从Mac OS x连接到R的目标。 从Microsoft here

下载Microsoft JDBC驱动程序

Link to Gist / Code in Github

# install.packages("RJDBC",dep=TRUE)
library(RJDBC)
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver" , "/Users/johndacosta/Downloads/sqljdbc_4.0/enu/sqljdbc4.jar" ,identifier.quote="`")
conn <- dbConnect(drv, "jdbc:sqlserver://192.172.1.210:55158;databaseName=master", "sa", "password")
d <- dbGetQuery(conn, "select * from sys.databases where database_id <= 4 ")
summary(d)

答案 2 :(得分:2)

我遇到了完全相同的问题。这是一个jTDS解决方案:

  1. 下载jTDS 1.2.8并解压缩。假设它保存在~/Downloads/jtds-1.2.8-dist/jtds-1.2.8.jar注意:其他版本可能无效!
  2. R,设置驱动程序:drv <- JDBC("net.sourceforge.jtds.jdbc.Driver", "~/Downloads/jtds-1.2.8-dist/jtds-1.2.8.jar")
  3. 设置连接对象:conn <- dbConnect(drv, "jdbc:jtds:sqlserver://servername:port;DatabaseName=databasename", domain="windows domain", user="user", password="pwd")
  4. 这里的字段domain搞砸了。您无法将domain\username作为user。您必须根据jTDS driver implementation单独定义它们。

答案 3 :(得分:1)

我在Linux上遇到过jtds-1.3.1这个问题。当我尝试切换到jtds-1.2.7时,问题就消失了。看来jtds-1.3。*中存在某些东西,这使得它与RJDBC不兼容。

答案 4 :(得分:0)

 library(RJDBC) 
 cp <- c
 ( 
      "<usr path>/jdbc/mdb/log4j.jar", 
      "<usr path>/jdbc/mdb/commons_lang.jar", 
      "<usr path>/jdbc/mdb/commons_logging.jar" 
  ) 

 .jinit(classpath=cp) 

 drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver",
        "/Users/victor/Downloads/sqljdbc_3.0/enu/sqljdbc4.jar") 

答案 5 :(得分:0)

当我尝试使用RJDBC连接到Cassandra时,我发生了同样的错误,它通过将Cassandra JDBC依赖项放在JAVA ClassPath中来解决。

请参阅此answer