如何在64位窗口中将R与Access数据库连接?

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)

  • 它适用于我安装AccessDatabaseEngine_x64.exe (3认同)

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中.


Den*_*din 8

没有成功的答案,但这是一步一步的方法,最终为我做了伎俩.在64位上安装Windows 8.安装了64位和32位R.我的访问是32位.

使用步骤,假设Windows 8上的32位访问

  1. 选择32位R(只是R studio中的一个设置)
  2. 在Windows上搜索以设置ODBC数据源(32位)
  3. 转到系统DSN>添加
  4. 选择驱动程序执行Microsoft Access(*.mdb)>完成
  5. 数据源名称:ProjecnameAcc
  6. 描述:ProjectnameAcc
  7. 确保实际选择数据库>确定

现在我可以运行我喜欢的代码了

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)