sqlQuery的RODBC错误处理

sqlQuery的RODBC错误处理,sql,r,error-handling,odbc,Sql,R,Error Handling,Odbc,对于sqlQuery的结果,我没有找到任何好的错误测试函数,这让我感到惊讶 在文档中,它们声明其返回值为: 成功时,数据帧可能包含0行或字符串。在error上,如果errors=TRUE,则为错误消息的字符向量,否则为不可见的整数错误代码-1 general,请调用ODBCGetErrorMsg以获取详细信息或-2 no data,这可能不是错误,因为某些SQL语句不返回任何数据 默认情况下,我永远无法复制返回错误为false的-1或-2。怎么可能呢 如果使用无效表编写SELECT请求,我将从S

对于sqlQuery的结果,我没有找到任何好的错误测试函数,这让我感到惊讶

在文档中,它们声明其返回值为:

成功时,数据帧可能包含0行或字符串。在error上,如果errors=TRUE,则为错误消息的字符向量,否则为不可见的整数错误代码-1 general,请调用ODBCGetErrorMsg以获取详细信息或-2 no data,这可能不是错误,因为某些SQL语句不返回任何数据

默认情况下,我永远无法复制返回错误为false的-1或-2。怎么可能呢

如果使用无效表编写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处理到任何类型数据库的连接,不同的数据库在出现问题时返回不同的内容

我已经使用ROBDC将R连接到SQL Server做了大量的工作,一般来说,SELECT查询非常容易处理:它们返回一个数据帧,如果有效,则返回一个字符向量。所以代码像

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


为了绝对确定,您需要更彻底,但如果您只连接到一种类型的数据库,那么它将有望在失败的原因上保持一致。

我不知道细节,但我的直觉是,并非所有数据库都可能出现所有结果。因此,与SQL Server的ODBC连接可能永远不会返回-2,但MySQL可能会返回-2。@joran-是的,你可能是对的!这和我写的精神是一样的,但更简单的是.character而不是is.nullnrow。非常感谢你的回答!由于您具有连接到SQL Server的专业知识,因此寻找DBI有意义吗?为什么好/不好?对不起,我不太明白这个问题。如果您的意思是有一个基于DBI包的用于连接SQL Server的R包,那么答案是肯定的。谢谢你的指点。我的问题是:现在似乎围绕DBI IIUC有了一场融合运动,那么看看DBI而不是在RODBC之上编写程序是否明智呢?rsqlserver包就是这种融合运动的一部分。它不如RODBC成熟,但质量仍然很高。