R を Access データベースに接続しようとすると、エラーが発生します
odbcConnectAccess is only usable with 32-bit Windows
これを解決する方法を知っている人はいますか?
library(RODBC)
mdbConnect<-odbcConnectAccess("D:/SampleDB1/sampleDB1.mdb")
odbcDriverConnect
代わりに使用してください。64 ビット R がインストールされている場合は、32 ビット R ビルドを使用する必要がある場合があります。
odbcDriverConnect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:/SampleDB1/sampleDB1.mdb")
これは、ファイルを保存することなく、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 にデータをプルする簡単で迅速な方法が提供されます。
与えられた答えでは成功しませんでしたが、最終的に私のためにトリックを行った段階的なアプローチは次のとおりです。Windows 8 を 64 ビットにします。64 ビットと 32 ビットの R がインストールされています。私のアクセスは 32 ビットです。
好きなコードを実行できるようになりました
channel <- odbcConnect("ProjectnameAcc")
Table1Dat <- sqlFetch(channel, "Table1")
他の人からのアドバイスを使用して、手動で手順を実行する必要がないように、スクリプトに書き込むことができる 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)