当前位置: 首页 > 面试题库 >

sqlQuery的RODBC错误处理

彭阳朔
2023-03-14
问题内容

我没有为an的结果找到任何良好的错误测试功能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处理与任何类型的数据库的连接,并且在出现问题时,不同的数据库会返回不同的结果。

我已经使用ROBDC将R连接到SQLServer做了大量的工作,并且一般来说SELECT查询很容易处理:它们返回一个数据帧,如果不工作,返回一个字符向量。所以像

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

效果很好。

为了绝对确定,您将需要更加彻底的研究,但是如果您仅连接到一种类型的数据库,则希望它将在失败方面保持一致。



 类似资料:
  • 问题内容: 我正在使用该程序包从数据库查询文本列。该数据库基于Microsoft SQL Server 2008 R2构建。SQL中列的数据类型为。 但是,当我运行时: 在SQL中,我期望(对于第一行): 但是,当我这样做时: 它返回: 255 。 所以我的问题是,是什么导致了这种截断,我该如何避免呢?谢谢!! 问题答案: 好的,看来我已经找到了解决方法。经过更多Google搜寻后,我发现: SQ

  • 在WeX5中的baas目录下,提供了默认的Action能力,SQLQuery数据查询功能。可以通过简单的数据库语句,实现对数据的过滤,排序等功能。再通过前端的调用,使数据灵活的显示在Web页面中。下面,我们就来介绍一下SQLQuery的使用方法: 准备工作: 首先我们需要在baas目录下新建一个文件,在新建的文件中创建一项服务服,服务创建好之后,我们需要建立一个新的Action,选择好我们需要的数

  • org.springframework.jdbc.object.SqlQuery类提供表示SQL查询的可重用操作对象。 Class 声明 (Class Declaration) 以下是org.springframework.jdbc.object.SqlQuery类的声明 - public abstract class SqlQuery<T> extends SqlOperation 用法

  • org.springframework.jdbc.object.SqlQuery类提供表示SQL查询的可重用操作对象。 Class 声明 (Class Declaration) 以下是org.springframework.jdbc.object.SqlQuery类的声明 - public abstract class SqlQuery<T> extends SqlOperation 用法

  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

  • 错误处理(error handling)是处理可能发生失败情况的过程。例如读取一个文件失败,然后继续使用这个失效的输入显然是有问题的。错误处理允许我们以一种显式的方式来发现并处理这类错误,避免了其余代码发生潜在的问题。 有关错误处理的更多内容,可参考官方文档的错误处理的章节。