【发布时间】:2014-09-08 15:11:29
【问题描述】:
对于sqlQuery 的结果,我没有找到任何好的错误测试功能,这让我很吃惊。
在文档 (http://www.inside-r.org/packages/cran/rodbc/docs/sqlQuery) 中,他们声明其返回值为:
"成功时,一个数据帧(可能有0行)或字符串。出错时,如果errors = TRUE一个错误消息的字符向量,否则一个不可见的整数错误代码-1(一般,调用odbcGetErrMsg了解详情)或 -2(无数据,这可能不是错误,因为某些 SQL 语句确实没有返回数据)。”
我永远无法复制返回的 -1 或 -2(默认情况下,errors = 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))
有什么想法/cmets?
【问题讨论】:
-
我不知道细节,但我的直觉是,并非所有数据库都可能出现所有结果。因此,与 SQL Server 的 ODBC 连接可能永远不会返回 -2,但 MySQL 可能(例如)。
-
@joran -- 是的,你可能是对的!
标签: sql r error-handling odbc