Seite 1 von 1

Verbindung zw. R und Access

Verfasst: So Nov 12, 2017 10:51 pm
von mp4711
Hallo zusammen,

ich würde gerne meine Access-Datenbank ("Test_DB.accdb") mit R verbinden. Habe Das R-Paket "RODBC" gefunden. Leider gibt es Probleme bezüglich der bit-Versionen (so scheint es mir). Kenne mich allerdings gar nicht damit aus. Habe einen 64-bit Rechner und R läuft auch auf 64-bit.

Meine Fehlermeldung sieht so aus:

Code: Alles auswählen

library(RODBC)
> db <- "C:/.../Test_DB.accdb"
> connection <- odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=db")

Warning messages:
1: In odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=db") :
  [RODBC] FEHLER: Status IM002, Code 0, Nachricht [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben
2: In odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=db") :
  ODBC-Verbindung fehlgeschlagen
Kennt sich einer damit aus? Die Lösungsvorschläge aus Google habe ich nicht verstanden.

Re: Verbindung zw. R und Access

Verfasst: Mo Nov 13, 2017 7:24 pm
von EDi

Code: Alles auswählen

DBQ=db
Wird nicht zum Pfad aufgelöst(was du vermutlich gerne hättest). ?paste() schafft Abhilfe.

Re: Verbindung zw. R und Access

Verfasst: Mo Nov 13, 2017 9:52 pm
von mp4711
Leider produziere ich mit

Code: Alles auswählen

connection <- odbcConnectAccess("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Users.../Test_DB")
den folgenden Fehler:

Code: Alles auswählen

Warning messages:
1: In odbcDriverConnect(con, ...) :
  [RODBC] FEHLER: Status HY000, Code -1811, Nachricht [Microsoft][ODBC Microsoft Access Driver] Datei '(unbekannt)' nicht gefunden.
2: In odbcDriverConnect(con, ...) :
  [RODBC] FEHLER: Status 01000, Code 1, Nachricht [Microsoft][ODBC Microsoft Access Driver]Allgemeine Warnung Registrierungsschlüssel 'Temporary (volatile) Jet DSN for process 0x93c Thread 0x3f20 DBC 0xbf5a14c Jet' kann nicht geöffnet werden.
3: In odbcDriverConnect(con, ...) : ODBC-Verbindung fehlgeschlagen
Der sieht mir noch böser aus. Den Pfad, Dateinamen und Dateityp habe ich gecheckt.

Re: Verbindung zw. R und Access

Verfasst: Mo Nov 13, 2017 10:47 pm
von mp4711
Update: Wollte mir parallel mal einen Treiber für die ODBC-Datenquellen einrichten (wahrscheinlich waren in diesem Satz 23 Fehler). Jetzt habe ich mir sowohl die 32-Bit, als auch die 64-bit Version von Microsoft heruntergeladen und bekomme folgende Fehlermeldungen:

Bild

Da kann man doch nur verrückt werden.

Re: Verbindung zw. R und Access

Verfasst: Mo Mai 14, 2018 9:44 pm
von databraineo
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")