R tryCatch RODBC函数问题

时间:2019-04-24 13:44:15

标签: r odbc

我们在服务器上有许多MS Access数据库,这些数据库是从远程位置复制的副本,这些副本会在一夜之间进行更新。我们每天整理来自这些机器的一些数据以用于报告目的。有时通宵更新失败,这意味着我们无法访问所有数据库,因此我试图编写一个R脚本来测试我们是否可以连接(使用数据库路径列表)并输出更新的版本仅包括我们可以连接的列表。然后,它将用于运行其他脚本,该脚本将仅更新与可用数据库有关的数据。

到目前为止,这是我所拥有的(我是R的新手,但是相当精通SAS和SQL –试图将R既用作学习活动,又可以节省成本);

{

# Create Store data locations listing

A=matrix(c(1000,1,"One","//Server/Comms1/Access.mdb"

,2000,2,"Two","//Server/Comms2/Access.mdb"

,3000,3,"Three","//Server/Comms3/Access.mdb"

)

,nrow=3,ncol=4,byrow=TRUE)

# Add column names

colnames(A)<-c("Ref1","Ref2","Ref3","Location")



#Create summary for testing connections (Ref1 and Location)

B<-A[,c(1,4)]



ConnectionTest<-function(Ref1,Location)

{

out<-tryCatch({ch<-odbcDriverConnect(paste("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=",Location))

sqlQuery(ch,paste("select ",Ref1," as Ref1,COUNT(variable) as Count from table"))}

,error=matrix(c(Ref1,0),nrow=1,ncol=2,byrow=TRUE)

)

return(out)

}



#Run function, using 'B' to provide arguments

C<-apply(B,1,function(x)do.call(ConnectionTest,as.list(x)))

#Convert to matrix and add column names

D<-matrix(unlist(C),ncol=2,byrow=T)

colnames(D)<-c("Ref1","Count")


} 

运行脚本时,出现以下错误消息;

  

值[3L]错误:尝试应用无效功能

我猜这是因为我在UDF中使用了不正确的TryCatch吗?

有人对我的不正确操作有任何建议吗,即使这是做我尝试的最佳方法?

谢谢

(抱歉,如果格式不正确,由于Stackoverflow发布被阻止而不得不在我的手机上发布)

编辑-我想我通过在tryCatch的错误部分中的矩阵函数周围添加function(e){}来解决“ value [3L]中的错误”问题。

现在的问题是,如果脚本无法访问数据库之一,则脚本只会失败,而不是执行矩阵函数。我是否需要添加其他内容以使其忽略该错误?

编辑2-似乎tryCatch现在可以工作-它处理 错误时的备用功能,但也会显示有关错误的警告,这是有道理的。

1 个答案:

答案 0 :(得分:0)

如上面的编辑中所述,使用'function(e){}'将Matrix函数包装在tryCatch的错误部分中,修复了'Error in value [3L]'问题,因此脚本现在可以使用,但是如果无法访问特定频道,则会显示错误消息。我猜想tryCatch的“警告”部分可以根据需要进行调整。