如何获取数据阅读器中的记录数?
Posted
技术标签:
【中文标题】如何获取数据阅读器中的记录数?【英文标题】:How to get the number of records in a Data Reader? 【发布时间】:2014-06-29 16:49:10 【问题描述】:我正在尝试在数据阅读器中显示记录数。这是我尝试过的。
if (mybtnreader1.HasRows)
using (DataTable dt = new DataTable())
dt.Load(mybtnreader1);
int rc = dt.Rows.Count;
MessageBox.Show("Have "+rc+"records");
虽然有记录,但始终显示为 0。应该如何更正或有其他方法可以获取数据读取器中的记录数?
我正在使用此代码来显示数据。
while(mybtnreader1.Read())
MessageBox.Show(mybtnreader1.GetValue(0) + " "+mybtnreader1.GetValue(1)+" ");
它正在显示数据,但当涉及到记录数时,它显示为 0。
【问题讨论】:
您确定数据表中存在记录吗? 您可以尝试显示记录吗? @KhushalDave 我编辑了问题 【参考方案1】:遍历查询结果后,您可以使用 RecordsAffected
:
mybtnreader1 = command.ExecuteReader();
while(mybtnreader1.Read())
///do your stuff
mybtnreader1 .Close();
MessageBox.Show(mybtnreader1 .RecordsAffected.ToString());
【讨论】:
【参考方案2】:DataReader 是只进的只读的,因此您无法在遍历所有记录之前获取记录数。循环时可以计数,但不能计数。
如果您需要提前知道记录的数量并且想要 DataReader 的性能和内存优势,那么将您的查询更改为运行两个查询。首先是带有 select count(*)...
的相同底层查询,然后是实际的询问。根据查询,这显然会影响性能。由于缓存,它不会加倍时间,而是额外的处理时间。您必须权衡提前计数的需求与使用 DataReader 与 DataTable 的优势。
例如,如果您要从这样的表中查询每条记录:
string sql = "SELECT * FROM MyTable";
using(var dataReader = ...)
那么你可以这样做:
string sql = @"
SELECT COUNT(*) FROM MyTable;
SELECT * FROM MyTable;
;
using(var dataReader = ...)
... process first result in data reader (count) ...
if (dataReader.NextResult)
... process the second result (records) ...
【讨论】:
如果这是我的查询,SqlCommand mybtncmd02 = new SqlCommand("SELECT * FROM DirectNodes", mybtnconn1);你能告诉我一个如何添加第二个查询的例子吗?【参考方案3】:您不能直接使用 Datareader 执行此操作。你可以像下面那样做 -
SqlDataReader reader = command.ExecuteReader();
DataTable dt_results = new DataTable();
dt_results.Load(reader);
int count= dt_results.Rows.Count;
if(count>0)
//Hey! we Have records for this query
else
//Sorry! No Records Exist for this query
【讨论】:
以上是关于如何获取数据阅读器中的记录数?的主要内容,如果未能解决你的问题,请参考以下文章