SqlDataAdapter计数行返回

时间:2018-08-11 14:38:12

标签: c#

我在C#Windows应用程序中有SqlDataAdapter个查询。在将其填充到DataGridView中之前,我需要知道返回的行数,因为当返回的行数为100万行时,填充方法需要9秒钟。

我需要一种不需要填充DataTable中所有数据并获取计数的方法,然后我使用分页原理来显示这样的数据

 DataTable dt = new DataTable();
 query = new Classes.order().GetAllBills();

 query.Fill(dt);
 DateTime date1 = System.DateTime.Now;
 MaxCount = dt.Rows.Count;

 int maxPag = (MaxCount / 25)+1;
 lblMaxCount.Text = MaxCount.ToString() ;

 lblNumOfPagFromAll.Text = (CounterPaging / 25) + "/" + maxPag;
 dt = new DataTable();
 query.Fill(CounterPaging,maxRecord,dt);

 dataGridView1.DataSource = dt;

1 个答案:

答案 0 :(得分:1)

在获取所有行之前,SqlDataAdapter 无法返回行数。这仅仅是因为基础数据库驱动程序将不提供此信息。因此,您必须在获取行的同时或之后对行进行计数。

选择计数(*)

或者,您需要按照Progman的建议查询数据库中的结果数量。但这有一些缺点

  • 首先,数据库需要两次提取数据。虽然缓存可能会使第二次访问更快,但这也可能发生,例如如果行数非常大并刷新缓存。
  • 第二,这是比赛条件。在SELECT COUNT(*)返回SqlDataAdapter完全不同的行数之后,数据可能会更改。

选择顶部

另一种解决方案是让数据库处理分页。在T-SQL中,SELECT TOP n ...将完成这项工作。

缺点是您无法以这种方式检索页面总数。 但是很容易检查是否还有其他数据。只需选择比页面大小多一行。如果您得到n + 1行,则还有另一页。

DataTable =效果不佳

最后一个注意事项:如果性能计数摆脱了数据表和适配器的作用。它们不打算用于屏幕上无法容纳的大量数据。 特别是如果您有intDateTime之类的许多值类型,由于过多的自动装箱,效果会很明显。

前一段时间,我以这种方式重构了C#应用程序,速度提高了近两个数量级。 我同时进行了另一项更改:从结果集中的不同行中删除了相同的字符串。这也使内存占用量减少了近一个数量级,因为某些值经常重复出现。

就这么快,我最终将所有数据加载到会话缓存中并从该缓存中进行分页。甚至几百万行只花了大约一秒钟的时间。