【问题标题】:RODBC error handling for sqlQuerysqlQuery 的 RODBC 错误处理
【发布时间】: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


【解决方案1】:

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

我已经使用 ROBDC 将 R 连接到 SQL Server 做了大量工作,一般来说,SELECT 查询很容易处理:它们返回一个数据框是否有效,如果没有则返回一个字符向量.像这样的代码

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

效果很好。

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

【讨论】:

  • 这与我写的精神相同,但更简单(is.character 而不是is.null(nrow))。非常感谢您的回答!
  • 既然您有连接到 SQL Server 的专业知识,那么去寻找 DBI 是否有意义?为什么好/不好?
  • 对不起,我不太明白这个问题。如果您的意思是“是否有基于DBI 包的用于连接到 SQL Server 的 R 包?”,那么答案是肯定的。见github.com/agstudy/rsqlserver
  • 感谢您的指点。我的问题是:现在似乎围绕 DBI (IIUC) 出现了趋同运动,看看 DBI 而不是在 RODBC 之上编写程序是否是明智之举?
  • rsqlserver 包是这种融合运动的一部分。它不如RODBC 成熟,但质量仍然很高。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多