sqlQuery的RODBC错误处理

时间:2014-09-08 15:11:30

标签: sql r error-handling odbc

我没有找到sqlQuery的结果的任何好的错误测试功能,这让我感到惊讶。

在文档(http://www.inside-r.org/packages/cran/rodbc/docs/sqlQuery)中,他们声明其返回值为:

“成功时,数据框(可能有0行)或字符串。出错时,如果errors = TRUE,则为错误消息的字符向量,否则为不可见的整数错误代码-1(通用,调用odbcGetErrMsg有关详细信息)或-2(没有数据,这可能不是错误,因为某些SQL语句不返回任何数据)。“

我永远不会复制-1或-2返回(默认情况下,error = false)。怎么可能?

如果使用无效表写一个SELECT请求,我会收到一个带有来自SQL Server的错误消息的字符串,但不是-1L,也不是-2L。它们什么时候发生?

本着同样的精神,测试SQL错误或空结果集包括一系列较小的测试,以避免测试时出现错误。

我终于使用了以下if..else..else代码,但我想知道是否可以简化它(以及为什么我从未看到-1或-2)。这让我感觉不能涵盖所有案件......

sql.invalid.table.name <-
 "SELECT pfiID
  FROM test"

sql.0.rows <-
 "SELECT pfiID
  FROM dossier
  WHERE pfiID = 'fake-id'"

sql.10.rows <-
 "SELECT pfiID
  FROM dossier
  WHERE pfiID like '%/200201/0001'"

records <- sqlQuery(channel, sql.invalid.table.name)

if (is.null(nrow(records))) {
  stop(paste("", records, sep="\n"))
} else if (nrow(records) == 0) {
  cat("No data\n")
} else
  print(head(records))

records <- sqlQuery(channel, sql.0.rows)

if (is.null(nrow(records))) {
  stop(paste("", records, sep="\n"))
} else if (nrow(records) == 0) {
  cat("No data\n")
} else
  print(head(records))

records <- sqlQuery(channel, sql.10.rows)

if (is.null(nrow(records))) {
  stop(paste("", records, sep="\n"))
} else if (nrow(records) == 0) {
  cat("No data\n")
} else
  print(head(records))

任何想法/评论?

1 个答案:

答案 0 :(得分:9)

是的,这种情况看起来很可怕,但在实践中并没有那么糟糕。文档含糊不清,因为RODBC处理与任何类型数据库的连接,不同的数据库在出现问题时返回不同的内容。

我使用ROBDC将R连接到SQL Server做了相当多的工作,一般来说SELECT查询很容易处理:它们返回数据帧是否有效,以及字符向量如果不。所以像

这样的代码
records <- sqlQuery(channel, "SELECT blah FROM somewhere")
if(is.character(records))
{
  stop(paste(records, collapse = "\n"))
}

效果很好。

为了绝对确定,你需要更加彻底,但是如果你只连接到一种类型的数据库,那么它有望在失败方面保持一致。