IDataReader - 有办法获取总行数吗?

10

在使用 reader.Read(); 迭代行之前,是否有办法从 IDataReader 中获取 SQL 查询返回的总行数?


@sll:你所指的参考资料已经过时了,自己琢磨吧。 - michael
更新的链接,请查看C#中如何使用SqlDataReader获取行数 - sll
5个回答

13

不行。

IDataReader 是结果集的一个简单前向只读视图;它不能获得计数。


6
不会,Datareader不会先返回计数。但是,如果你确实需要这样做,可以使用返回多个结果集的两个查询。
例如,在SQL Server中:
sql = "SELECT COUNT(1) FROM A; SELECT * FROM A;"

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

如果数据库服务器使用适当的索引,它应该能够快速完成此操作。


类似这样的操作在一般情况下会失败,例如 EXECUTE ReportQuestionsWithMoreThanTenAnswersAndNoAccepted - Ian Boyd

4

虽然已经过了发布日期,但是有一种方法可以解决问题,对我很有用,只是我不太擅长用谷歌搜索表达我的意思,所以花费了一些时间。

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

1
这不需要两个单独的执行吗?这意味着如果在调用ExecuteScalar()(获取计数)和调用ExecuteReader()(获取行本身)之间有人更改了某些内容,它可能会容易受到竞态条件的影响。 - Joe Amenta

0

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

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

-1

只有在读取DataReader时才会计算行数,但我不明白,为什么您要在阅读之前就知道行数。


2
为了精确分配所需的存储空间,如果要存储整个结果集的副本(而不是让List(T).Add()自动增长其Capacity),需要进行适当的分配。 - binki
这是我想到的最明显的一个。另一个用例可能是在读取行时更新确定性进度条。另一个可能是作为启发式处理行的输入(即,您可能希望以不同于处理100行的方式处理1000万行,而在中途更改可能会很麻烦)。还有可能有其他合法的原因。 - Joe Amenta
创建导出进度条。提供用户反馈。 - Ian Boyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接