我没有为an的结果找到任何良好的错误测试功能sqlQuery,这让我感到惊讶。
sqlQuery
在文档(http://www.inside-r.org/packages/cran/rodbc/docs/sqlQuery)中,他们指出其返回值为:
“成功后,将显示一个数据帧(可能具有0行)或字符串。错误时,如果errors =TRUE,则为错误消息的字符向量,否则为不可见的整数错误代码-1(一般,请致电odbcGetErrMsg以获得详细信息)或-2(无数据,这可能不是错误,因为某些SQL语句确实不返回数据)。”
我从来没有复制过返回的-1或-2(默认情况下,错误= 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))
有什么想法/意见吗?
是的,这种情况看起来很可怕,但实际上并没有它可能要糟的多。该文档含糊不清,令人费解,因为RODBC处理与任何类型的数据库的连接,并且在出现问题时,不同的数据库会返回不同的结果。
RODBC
我已经使用ROBDC将R连接到SQLServer做了大量的工作,并且一般来说SELECT查询很容易处理:它们返回一个数据帧,如果不工作,返回一个字符向量。所以像
SELECT
records <- sqlQuery(channel, "SELECT blah FROM somewhere") if(is.character(records)) { stop(paste(records, collapse = "\n")) }
效果很好。
为了绝对确定,您将需要更加彻底的研究,但是如果您仅连接到一种类型的数据库,则希望它将在失败方面保持一致。