【问题标题】:Why might IDbCommand.ExecuteReader() fail when IDbCommand.ExecuteScalar() succeeds?当 IDbCommand.ExecuteScalar() 成功时,为什么 IDbCommand.ExecuteReader() 会失败?
【发布时间】:2009-08-19 22:05:47
【问题描述】:

我有一些 C# 代码可以动态生成 SQL 查询并通过 IDbCommand.ExecuteScalar() 执行它。这很好用;在数据库中只有一个结果与我的查询匹配,并且始终返回该结果。

但就在最近,作为支持数据库中多个匹配项的重构的第一步,我将对 ExecuteScalar() 的调用替换为对 ExecuteReader() 的调用。设置和数据库访问中的其他所有内容都是相同的。但是返回的 IDataReader 不包含任何数据,并且每当我尝试从中获取数据时都会抛出 InvalidOperationExceptions。

我知道数据还在;当我切换回 ExecuteScalar() 时一切正常。这怎么可能?

【问题讨论】:

    标签: c# sql tsql


    【解决方案1】:

    在尝试访问之前,请确保您正在调用 IDataReader 上的 Read() 方法,该方法由 ExecuteReader() 返回。调用Read() 会将读者推进到结果集的第一行(仅在您的情况下)。如果您在访问IDataReader 之前没有调用Read(),那么当您尝试访问其数据时,您将得到一个InvalidOperationException - 正如您所经历的那样。

    【讨论】:

    • 我使用的是 NextResult() 而不是 Read()。哎呀。
    【解决方案2】:

    这是否与在同一连接上打开多个 IDataReader 有关?

    因为您不会遇到 ExecuteScalar() 的问题,但是一旦您开始使用 ExecuteReader(),您需要确保同一连接上的所有先前 DataReader 都已关闭(例如,通过使用“使用”块)

    您收到的 InvalidOperationException 错误消息是什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2021-12-23
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多