53

R を Access データベースに接続しようとすると、エラーが発生します

odbcConnectAccess is only usable with 32-bit Windows

これを解決する方法を知っている人はいますか?

library(RODBC) 
mdbConnect<-odbcConnectAccess("D:/SampleDB1/sampleDB1.mdb")
4

8 に答える 8

34

odbcDriverConnect代わりに使用してください。64 ビット R がインストールされている場合は、32 ビット R ビルドを使用する必要がある場合があります。

odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/SampleDB1/sampleDB1.mdb")
于 2012-10-25T14:26:46.313 に答える
15

これは、ファイルを保存することなく、32 ビット アクセスから 64 ビット R にデータを転送する単一の関数です。この関数は、2 番目の 32 ビット セッションに渡される式文字列を作成します。その後、データはソケット サーバー パッケージ (svSocket) を使用して元のセッションに返されます。注意すべきことの 1 つは、ソケット サーバーがアクセス データをグローバル環境に保存するため、「<-」を使用して出力を保存する代わりに、2 番目のパラメーターを使用して出力を定義することです。

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)
  }
}

この関数は時折エラーを返しますが、データの取得には影響せず、ソケット サーバー接続を閉じた結果と思われます。

改善の余地がある可能性がありますが、これにより、32 ビット アクセスから R にデータをプルする簡単で迅速な方法が提供されます。

于 2016-10-10T15:53:47.300 に答える
9

与えられた答えでは成功しませんでしたが、最終的に私のためにトリックを行った段階的なアプローチは次のとおりです。Windows 8 を 64 ビットにします。64 ビットと 32 ビットの R がインストールされています。私のアクセスは 32 ビットです。

Windows 8 での 32 ビット アクセスを想定した使用手順

  1. 32ビットRを選択します(これはRスタジオの設定です)
  2. Windows で Setup ODBC data sources (32 ビット) を検索します。
  3. システム DSN > 追加に移動します
  4. Driver do Microsoft Access (*.mdb) > 完了を選択します。
  5. データ ソース名: ProjecnameAcc
  6. 説明: ProjectnameAcc
  7. 実際にデータベースを選択してください > OK

好きなコードを実行できるようになりました

channel <- odbcConnect("ProjectnameAcc")
Table1Dat <- sqlFetch(channel, "Table1")
于 2015-10-21T11:47:49.827 に答える
2

他の人からのアドバイスを使用して、手動で手順を実行する必要がないように、スクリプトに書き込むことができる 32 ビット Access データを 64 ビット R に取得する明示的な例を次に示します。これを実行するには、マシンで 32 ビット R を使用できるようにする必要があります。このスクリプトは、32 ビット R のデフォルトの場所を想定しているため、必要に応じて調整してください。

最初のコード部分はメイン スクリプトに入ります。2 番目のコード部分は、作成した小さな R スクリプト ファイルの内容全体であり、メイン スクリプトから呼び出されます。この組み合わせは、アクセス データベースからデータを抽出して保存し、ロードします。停止する必要があります。

これが私のメインスクリプトに入るビットです。これは64ビットR内から実行されます

##  Lots of script above here
## set the 32-bit script location
pathIn32BitRScript <- "C:/R_Code/GetAccessDbTables.R"
## run the 32 bit script
system(paste0(Sys.getenv("R_HOME"), "/bin/i386/Rscript.exe ",pathIn32BitRScript))
## Set the path for loading the rda files created from the little script 
pathOutUpAccdb <- "C/R_Work/"
## load the tables just created from that script
load(paste0(pathOutUpAccdb,"pots.rda"))
load(paste0(pathOutUpAccdb,"pans.rda"))
## Lots of script below here

これは、GetAccessTables.R と呼ばれる別のスクリプトであるビットです。

library(RODBC).    
## set the database path
inCopyDbPath <- "C:/Projects/MyDatabase.accdb"
## connect to the database
conAccdb <- odbcConnectAccess2007(inCopyDbPath) 

## Fetch the tables from the database. Modify the as-is and string settings as desired
pots <- sqlFetch (conAccdb,"tbl_Pots",as.is=FALSE, stringsAsFactors = FALSE)
pans <- sqlFetch(conAccdb,"tbl_Pans",as.is=FALSE, stringsAsFactors = FALSE)
## Save the tables
save(pots, file = "C/R_Work/pots.rda")
save(pans, file = "C:/R_Work/pans.rda")
close(conAccdb)
于 2016-02-11T15:04:34.017 に答える