use*_*592 3 sql error-handling odbc r
我没有找到任何好的错误测试功能的结果,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))
Run Code Online (Sandbox Code Playgroud)
有什么想法/意见吗?
Ric*_*ton 10
是的,情况似乎很可怕,但在实践中并没有它可能的那么糟糕.文档是模糊和复杂的,因为RODBC处理与任何类型的数据库的连接,并且不同的数据库在出现问题时返回不同的东西.
我已经使用ROBDC将R连接到SQL Server做了相当多的工作,并且通常SELECT查询很容易处理:它们返回数据帧是否有效,如果没有则返回字符向量.所以代码就像
records <- sqlQuery(channel, "SELECT blah FROM somewhere")
if(is.character(records))
{
stop(paste(records, collapse = "\n"))
}
Run Code Online (Sandbox Code Playgroud)
效果很好.
为了绝对确定,您需要更加彻底,但如果您只连接到一种类型的数据库,则希望它能够如何失败.
| 归档时间: |
|
| 查看次数: |
3828 次 |
| 最近记录: |