我正在尝试在数据读取器中显示记录数。这是我尝试过的。
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。
循环查询结果后,可以使用 RecordsAffected
:
RecordsAffected
DataReader是只读的,因此您无法在遍历所有记录之前获取记录数。当您遍历时,您可以数,但不能数。
如果您需要提前知道记录数,并希望获得DataReader的性能和内存优势,请更改查询以运行两个查询。首先使用mybtnreader1 = command.ExecuteReader();
while(mybtnreader1.Read())
{
///do your stuff
}
mybtnreader1 .Close();
MessageBox.Show(mybtnreader1 .RecordsAffected.ToString());
进行相同的基础查询,然后进行实际查询。根据查询,这显然会影响性能。缓存不会使时间翻倍,而是额外的处理时间。您必须权衡需要提前进行计数的需求与使用DataReader与DataTable的优势的比较。
例如,如果您要从像这样的表中查询每条记录:
select count(*)...
然后您可以执行此操作:
string sql = "SELECT * FROM MyTable";
using(var dataReader = ...)
您不能直接使用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) ...
}
}