Chr*_*ris 42 ms-access r rodbc
当我尝试连接R与Access数据库时,我收到一个错误
odbcConnectAccess is only usable with 32-bit Windows
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
library(RODBC)
mdbConnect<-odbcConnectAccess("D:/SampleDB1/sampleDB1.mdb")
Run Code Online (Sandbox Code Playgroud)
Mat*_*rde 25
请odbcDriverConnect改用.如果安装了64位R,则可能必须使用32位R版本.
odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/SampleDB1/sampleDB1.mdb")
Run Code Online (Sandbox Code Playgroud)
man*_*ark 13
这是一个单一的功能,可以将数据从32位访问传输到64位R而无需保存任何文件.该函数构建一个传递给第二个32位会话的表达式字符串; 然后使用套接字服务器包(svSocket)将数据返回到原始会话.有一点要注意的是,所以第二个参数是用来定义输出,而不是使用"< - "套接字服务器保存在全球环境中访问数据保存输出.
access_query_32 <- function(db_table = "qryData_RM", table_out = "data_access") {
library(svSocket)
# variables to make values uniform
sock_port <- 8642L
sock_con <- "sv_con"
ODBC_con <- "a32_con"
db_path <- "~/path/to/access.accdb"
if (file.exists(db_path)) {
# build ODBC string
ODBC_str <- local({
s <- list()
s$path <- paste0("DBQ=", gsub("(/|\\\\)+", "/", path.expand(db_path)))
s$driver <- "Driver={Microsoft Access Driver (*.mdb, *.accdb)}"
s$threads <- "Threads=4"
s$buffer <- "MaxBufferSize=4096"
s$timeout <- "PageTimeout=5"
paste(s, collapse=";")
})
# start socket server to transfer data to 32 bit session
startSocketServer(port=sock_port, server.name="access_query_32", local=TRUE)
# build expression to pass to 32 bit R session
expr <- "library(svSocket)"
expr <- c(expr, "library(RODBC)")
expr <- c(expr, sprintf("%s <- odbcDriverConnect('%s')", ODBC_con, ODBC_str))
expr <- c(expr, sprintf("if('%1$s' %%in%% sqlTables(%2$s)$TABLE_NAME) {%1$s <- sqlFetch(%2$s, '%1$s')} else {%1$s <- 'table %1$s not found'}", db_table, ODBC_con))
expr <- c(expr, sprintf("%s <- socketConnection(port=%i)", sock_con, sock_port))
expr <- c(expr, sprintf("evalServer(%s, %s, %s)", sock_con, table_out, db_table))
expr <- c(expr, "odbcCloseAll()")
expr <- c(expr, sprintf("close(%s)", sock_con))
expr <- paste(expr, collapse=";")
# launch 32 bit R session and run expressions
prog <- file.path(R.home(), "bin", "i386", "Rscript.exe")
system2(prog, args=c("-e", shQuote(expr)), stdout=NULL, wait=TRUE, invisible=TRUE)
# stop socket server
stopSocketServer(port=sock_port)
# display table fields
message("retrieved: ", table_out, " - ", paste(colnames(get(table_out)), collapse=", "))
} else {
warning("database not found: ", db_path)
}
}
Run Code Online (Sandbox Code Playgroud)
有时,此函数将返回错误,但它不会影响数据检索,并且似乎是由于关闭套接字服务器连接而导致的.
可能还有改进的余地,但这提供了一种简单快捷的方法,可以将数据从32位访问中提取到R中.
没有成功的答案,但这是一步一步的方法,最终为我做了伎俩.在64位上安装Windows 8.安装了64位和32位R.我的访问是32位.
现在我可以运行我喜欢的代码了
channel <- odbcConnect("ProjectnameAcc")
Table1Dat <- sqlFetch(channel, "Table1")
Run Code Online (Sandbox Code Playgroud)
小智 6
我在遇到类似问题时遇到了这个 SO,此时我们至少还有一个非常灵活的 odbc 库的选择。
不过这里有一个重要的注意事项:MS Access ODBC 驱动程序不是默认的 MS Office 安装的一部分,因此您必须从 Microsoft(在我的情况下为 Microsoft Access Database Engine 2016 Redistributable)下载适当的驱动程序,并确保下载适当的位数(例如 AccessDatabaseEngine_X64.exe)。下载后,它应该会自动显示在您的 Windows ODBC 数据源(64 位)实用程序中,或者您可以在 R 会话中使用 odbcListDrivers 函数进行确认。
library(odbc)
# run if you want to see what drivers odbc has available
# odbcListDrivers()
# full file path to Access DB
file_path <- "~/some_access_file.accdb"
# pass MS Access file path to connection string
accdb_con <- dbConnect(drv = odbc(), .connection_string = paste0("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=",file_path,";"))
Run Code Online (Sandbox Code Playgroud)