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))
error
是sqlQuery
的参数,默认为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 功能和错误/警告的主要内容,如果未能解决你的问题,请参考以下文章
使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误
RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?
“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句
Rodbc 错误:sqlSave 中的错误(DataConnection,dataframeInput,tablename = tableNameString,:无法附加到表