我正在尝试从 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)
但我的机器上也安装了 Java 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 会话。第二条语句仍然不起作用,并显示相同的错误消息。
我已经为此苦苦挣扎了一段时间。这是我的发现。
- 从这里下载 -- Microsoft 适用于 SQL 服务器的 JDBC 驱动程序
- 解压缩文件,您可以在其中找到
sqljdbc4.jar
. -
用:
drv <- JDBC("com.microsoft.sqlserver.jdbc.SQLServerDriver", "<wherever sqljdbc4.jar is>")
这应该有效。
如果我是对的,这个想法是,对于drv
函数中的PATH
变量,需要指定 JDBC 驱动程序所在的 PATH(因此,如果没有,则先下载它)。否则,将收到常见的class not find
错误。
以下代码实现了从 Mac OS x 连接到 R 的目标。从此处Microsoft下载Microsoft JDBC 驱动程序
链接到 Github 中的 Gist/Code
# 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)
我在Linux上使用jtds-1.3.1时遇到了这个问题。当我尝试切换到jtds-1.2.7时,问题消失了。jtds-1.3.* 中似乎有一些东西使其与 RJDBC 不兼容。
我遇到了完全相同的问题。这是一个jTDS
解决方案:
- 下载 jTDS 1.2.8 并解压缩。说它保存在
~/Downloads/jtds-1.2.8-dist/jtds-1.2.8.jar
.注意:其他版本可能无法正常工作! - 从
R
,设置驱动程序:drv <- JDBC("net.sourceforge.jtds.jdbc.Driver", "~/Downloads/jtds-1.2.8-dist/jtds-1.2.8.jar")
。 - 设置连接对象:
conn <- dbConnect(drv, "jdbc:jtds:sqlserver://servername:port;DatabaseName=databasename", domain="windows domain", user="user", password="pwd")
。
在这里,domain
把事情搞砸了。你不能把domainusername
作为你的user
.您必须根据 jTDS 驱动程序实现单独定义它们。
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")
当我尝试使用 RJDBC 连接到 Cassandra 时,我之前也发生了同样的错误,通过将 Cassandra JDBC 依赖项放在 JAVA ClassPath 中来解决。
看到这个答案: