【问题标题】:RODBC functions and errors/warningsRODBC 功能和错误/警告
【发布时间】:2010-08-17 10:40:14
【问题描述】:

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

【问题讨论】:

  • 对不起,我把第一部分贴出来了。现已编辑
  • 我这几天没有访问数据库,所以无法回复 cmets in your previous question
  • 没问题,你回答了我的问题95%,剩下的部分在这个问题中。非常感谢

标签: r rodbc


【解决方案1】:

我检查了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 之后。

【讨论】:

  • 谢谢。因此,如果我添加 errors=FALSE 部分并删除警告功能部分,我可以通过检查 NA 值来检测错误,并通过检查 -1 值来检测警告。它有效,但我宁愿看到一种处理错误和警告的方法,但我认为这是不可能的
  • 你可以留下警告部分,以防你得到实际的“R-警告”。 -1 值给出了 odbc 连接的 C 级部分出现问题的信息。
【解决方案2】:

我最终得到了这段代码。现在我可以处理特定的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)
  }
}

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多