【问题标题】:IDataReader - Any way to get the total rows?IDataReader - 有什么方法可以获取总行数?
【发布时间】:2011-10-07 17:34:59
【问题描述】:

在使用reader.Read(); 遍历行之前,有什么方法可以获取从 SQL 查询(来自 IDataReader)返回的总行数?

【问题讨论】:

标签: c# count rows datareader


【解决方案1】:

没有。

IDataReader 是一个简单的只进结果集视图;它无法计数。

【讨论】:

    【解决方案2】:

    不,数据读取器不会首先返回计数。但是,如果您确实需要这样做,请使用两个返回多个结果集的查询。

    例如在 SQL Server 中:

    sql = "SELECT COUNT(1) FROM A; SELECT * FROM A;"
    

    迭代结果集。在第二个结果集上使用IDataReader

    如果数据库服务器使用适当的索引,它应该能够非常快地做到这一点。

    【讨论】:

    • 这样的事情在一般情况下会失败,例如EXECUTE ReportQuestionsWithMoreThanTenAnswersAndNoAccepted
    【解决方案3】:

    已经过了发布的日期,但有一种方法对我有用,但我花了一段时间才得到,因为我的谷歌搜索措辞很糟糕。

    dbCommand.Connection.Open();
    //dbReader = dbCommand.ExecuteReader();  I left this here to show not to do the read
    
    searchCount = dbCommand.ExecuteScalar(); // this line returns the value count
                                             // from my tests on my reader it works perfectly
    

    【讨论】:

    • 这不需要两个单独的执行,这意味着如果有人在调用 ExecuteScalar()(获取计数)和调用 ExecuteReader()(获取行本身)?
    【解决方案4】:

    也许不是一个好主意,但我在 while 循环中使用变量计数。这段代码对我来说很好用:

    IDataReader reader = SqlHelper.ExecuteReader(sqlConnectionString, Procedure.GetSuperUserOwnerDetails, ProfileName);
    int count = 0;
    while (reader.Read())
    {
       count = count + 1;
    }
    lblProfileOperator.Text = " Owner : " + count;
    

    【讨论】:

      【解决方案5】:

      仅在读取 DataReader 时计算的行数 但我没明白,为什么你想在阅读之前知道行数。

      【讨论】:

      • 在存储整个结果集的副本时准确分配所需的完美存储量(而不是让List(T).Add() 经常自动增长其Capacity)。
      • 这也是我想到的最明显的一个。另一个用例是在读取行时更新确定的进度条。另一个可能是如何处理行的启发式输入(即,您可能希望以不同于处理 1000 万行的方式处理 100 行,中途切换可能会很痛苦)。可能还有很多其他正当理由。
      • 在导出过程中创建进度条。提供用户反馈。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2019-12-23
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      相关资源
      最近更新 更多