Verbindung zw. R und Access

... zu anderer statistischer Software, zu Datenbanken und Programmiersprachen.

Moderatoren: EDi, jogo

Antworten
mp4711

Verbindung zw. R und Access

Beitrag 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.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Verbindung zw. R und Access

Beitrag von EDi »

Code: Alles auswählen

DBQ=db
Wird nicht zum Pfad aufgelöst(was du vermutlich gerne hättest). ?paste() schafft Abhilfe.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
mp4711

Re: Verbindung zw. R und Access

Beitrag 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.
mp4711

Re: Verbindung zw. R und Access

Beitrag 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.
Dateianhänge
odbc.jpg
Benutzeravatar
databraineo
Beiträge: 10
Registriert: Mo Apr 02, 2018 8:20 am

Re: Verbindung zw. R und Access

Beitrag 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")
Lasst uns helfen, dass Menschen mittels Datenanalyse intelligente Entscheidungen treffen

Website: Databraineo - Data Science Blog
Twitter: @databraineo
Facebook-Gruppe: Data Science Deutschland
Antworten