如何使用 R 下载所有 MS 访问附件

how to download all MS access attachments using R

我在 MS Access 中有大约 100 行,每行都包含一个附件。在 R 中使用 RODBC 我可以访问 table 但不知道如何访问附件并在 R

中下载它们

你能帮我看看怎么做吗

MS Access 中的附件是特殊数据类型,实际上涉及元数据(文件名和文件数据)信息的嵌套 table。因此,您不能通过 RODBC 单独使用 DML SQL 语句访问此数据,但可以使用 COM 接口,特别是连接到 DAO SaveToFile() 方法。

考虑以下使用 RDCOMClient 包的情况,它允许连接到 Access Object Library。请注意:为了 运行 下面的代码,您必须安装 MSAccess.exe (MS Office GUI 程序)而不仅仅是 .accdb 文件。在下面的 SQL 查询中,ColAttach 是 table 中附件字段的名称,您必须使用这些限定符 .filedata.文件名。 DAO 记录集字段编号是从零开始的(因此是 0 和 1)。

library(RDCOMClient)

# INITIALIZING OBJECTS
accApp <- COMCreate("Access.Application")
accApp$OpenCurrentDatabase("C:\Path\To\Database.accdb")
docmd <-  accApp[["DoCmd"]]
db <- accApp$CurrentDb()

rst <- db$OpenRecordset("SELECT ColAttach.filedata, ColAttach.filename FROM TblAttach")

while(rst$EOF() == FALSE){     
  rst$Fields(0)$SaveToFile(paste0("C:\Path\To\Output_", rst$Fields(1)$Value()))      
  rst$MoveNext()
}

# CLOSING OBJECTS
rst$close()
docmd$CloseDatabase()
accApp$Quit()

# RELEASING RESOURCES
accApp <- db <- docmd <- rst <- NULL    
rm(rst, db, accApp)
gc()

对于多个附件,在每个 filenamefiledata 值上循环遍历子记录集(注意不同的 SQL) .请务必检查文件是否存在并相应销毁,否则您将收到 COM 错误:

rst <- db$OpenRecordset("SELECT ID, ColAttach FROM TblAttach")

while(rst$EOF() == FALSE){    
  childRS <- rst[['ColAttach']]$Value()

  while(childRS$EOF() == FALSE){
    if (file.exists(paste0("C:\Path\To\Output_", childRS[["filename"]]$Value()))) {
      unlink(paste0("C:\Path\To\Output_", childRS[["filename"]]$Value()))
    }

    childRS[["filedata"]]$SaveToFile(paste0("C:\Path\To\Output_", 
                                     childRS[["filename"]]$Value()))
    childRS$MoveNext()
  }

  rst$MoveNext()
}