关于此 R 代码的问题:
library(RODBC)
ch <- tryCatch(odbcConnect("RTEST"),
warning=function(w){print("FAIL! (warning)");return(NA)},
error=function(e){print(paste("ERROR:",geterrmessage()));return(NA)})
df <- tryCatch(sqlQuery(ch,"SELECT Test from tblTest"),
warning=function(w){print("FAIL! (warning)");return(NA)},
error=function(e){print(paste("ERROR:",geterrmessage()));return(NA)})
odbcClose(ch)
在两种情况下,代码都可以很好地处理错误(通过省略代码中所需的参数来强制)(警告和错误部分几乎完全相同):我得到一个 NA 值和一条错误消息。
另外,对于 sqlQuery 错误(给出无效的 DSN):NA 值和错误消息。
但不适用于 sqlQuery 的警告。没有消息输出,但 df 包含消息(因此没有 NA)。为什么?
最佳答案
我检查了 sqlQuery
的代码并发现了这个:
stat <- odbcQuery(channel, query, rows_at_time)
if (stat == -1L) {
if (errors)
return(odbcGetErrMsg(channel))
else return(invisible(stat))
}
error
是 sqlQuery
的参数,默认为 TRUE
,因此它会为您提供没有错误或警告的字符向量。如果将其更改为sqlQuery(ch,"SELECT Test from tblTest",FALSE)
,则df
将包含-1
值。这是 C 级别的错误代码,但不是 R 中的错误,因此 tryCatch
无法处理它。
我想您需要在 tryCatch
之后检查是否 df==-1
。
关于RODBC 函数和错误/警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3501528/