RODBC 功能和错误/警告

Posted

技术标签:

【中文标题】RODBC 功能和错误/警告【英文标题】:RODBC functions and errors/warnings 【发布时间】: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%,剩下的部分在这个问题中。非常感谢 【参考方案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)
  

【讨论】:

以上是关于RODBC 功能和错误/警告的主要内容,如果未能解决你的问题,请参考以下文章

尝试连接数据库时出现 RODBC 错误代码 202

使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误

RODBC 错误:无法 SQLExecDirect

RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?

“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句

Rodbc 错误:sqlSave 中的错误(DataConnection,dataframeInput,tablename = tableNameString,:无法附加到表