我在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;
答案 0 :(得分:1)
在获取所有行之前,SqlDataAdapter
无法返回行数。这仅仅是因为基础数据库驱动程序将不提供此信息。因此,您必须在获取行的同时或之后对行进行计数。
或者,您需要按照Progman的建议查询数据库中的结果数量。但这有一些缺点。
SELECT COUNT(*)
返回SqlDataAdapter
完全不同的行数之后,数据可能会更改。另一种解决方案是让数据库处理分页。在T-SQL中,SELECT TOP n ...
将完成这项工作。
缺点是您无法以这种方式检索页面总数。 但是很容易检查是否还有其他数据。只需选择比页面大小多一行。如果您得到n + 1行,则还有另一页。
DataTable
=效果不佳最后一个注意事项:如果性能计数摆脱了数据表和适配器的作用。它们不打算用于屏幕上无法容纳的大量数据。
特别是如果您有int
或DateTime
之类的许多值类型,由于过多的自动装箱,效果会很明显。
前一段时间,我以这种方式重构了C#应用程序,速度提高了近两个数量级。 我同时进行了另一项更改:从结果集中的不同行中删除了相同的字符串。这也使内存占用量减少了近一个数量级,因为某些值经常重复出现。
就这么快,我最终将所有数据加载到会话缓存中并从该缓存中进行分页。甚至几百万行只花了大约一秒钟的时间。