Hi,
ich kann mich zwar nicht mehr an die genaue Fehlermeldung erinnern, ich hatte aber mal Probleme, eine 32-bit Access-Datenbank mit der 64-bit Version von R zu öffnen. Da spielen die Windows-Treiber irgendwie verrückt, habe ewig probiert, irgendwelche passenden Treiber zu installieren.
Ich habe dann auf
Stackoverflow folgende Lösung gefunden. Die Funktion öffnet eine separate 32bit-Instanz von R, führt den Datenbank-Befehl durch und gibt ihn an das 64bit-R zurück.
Code: Alles auswählen
access_sql_32 <- function(db_sql = NULL, table_out = NULL, db_path = NULL) {
library(svSocket)
# variables to make values uniform
sock_port <- 8642L
sock_con <- "sv_con"
ODBC_con <- "a32_con"
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("%1$s <- sqlQuery(%3$s, \"%2$s\")", table_out, db_sql, 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, table_out))
expr <- c(expr, "odbcCloseAll()")
expr <- c(expr, sprintf("close(%s)", sock_con))
expr <- paste(expr, collapse=";")
# launch 32 bit R session and run the expression we built
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)
}
}
Dann kannst Du folgendermaßen darauf zugreifen:
Code: Alles auswählen
df <- data.frame()
query<- "SELECT a,b,c FROM dbo.tabelle
WHERE a= 'species' ORDER BY a"
access_sql_32(query, "df", "X:/path/path/mydata.accdb")