RODBC功能和错误/警告

时间:2010-08-17 10:40:15

标签: r rodbc

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

2 个答案:

答案 0 :(得分:5)

我检查了sqlQuery的代码,发现了这个:

stat <- odbcQuery(channel, query, rows_at_time)
if (stat == -1L) {
    if (errors) 
        return(odbcGetErrMsg(channel))
    else return(invisible(stat))
}

errorsqlQuery的参数,默认为TRUE,因此它为您提供了字符向量,没有错误或警告。如果您将其更改为sqlQuery(ch,"SELECT Test from tblTest",FALSE),则df将包含-1值。这是来自C级的错误代码,但不是R中的错误,因此tryCatch无法处理它。

我想您需要在df==-1之后检查tryCatch

答案 1 :(得分: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)
  }
}