2

关于此 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)。为什么?

4

2 回答 2

5

我检查了代码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)thendf将包含-1值。这是来自 C 级的错误代码,但不是 R 中的错​​误,因此tryCatch无法处理。

我想你需要检查 if df==-1after tryCatch

于 2010-08-17T11:20:00.890 回答
1

我最终得到了这段代码。现在我可以处理特定的 Mysql error_code:

saveText <- function(query, channel, errors = TRUE) {
  stat <- odbcQuery(channel, query)
  if (stat == -1L) {
    if (errors)
      err <- odbcGetErrMsg(channel)
    else {
      err <- invisible(stat)
    }
    return(err)
  }
}
于 2017-06-20T10:09:41.553 回答