2012-02-27 36 views
1

我想使用进度条显示当前进度%数据行已经被加载。我看到similiar question已被问到,但解决方案只是建议使用字幕样式。如何指示查询大型数据集的当前进度?

例如,我运行一个Select语句查询可能需要几秒钟的大型数据表。 我想要进度条更新查询的当前进度。那是possbile?

我知道有几件事情,我需要:

  1. 的总记录数将被检索。 (可以通过首先选择计数(1)获得)
  2. 某些通知告诉我刚刚检索了多少条记录。

对于2.是我不知道如何实现的部分。

我可以把它分成夫妇查询,但这可能一直不可能。

但是在SQL中与Cursor类似的东西呢?要求SQL Server查询块并重复返回数据。

for loop{ 
    //query a chunk of records 

    //return 

    //Next 
} 

所以我可以计算进度并将其填入单个DataTable

有没有可能做到以上的事情?如果是这样,怎么样?

因为我看到一个ASP.NET应用程序能够显示加载大型数据表的进度,所以我想在WPF中实现同样的功能。

+0

什么用于数据访问:ORM,Web服务,ADO.NET等?你的后端服务器是什么? – oleksii 2012-02-27 19:07:00

+0

@oleksii我正在使用实体框架,但我认为这可能与ORM很难对付。所以我打算使用ADO.NET来实现这与SQL Server。 – 2012-02-27 19:09:04

+0

@KingChan,你确定有一个进度条不值得使用ORM吗? – svick 2012-02-27 19:13:37

回答

1

首先,您需要确保将查询分解为两个不会使查询时间加倍。您可能会发现自己等待几秒钟才能获得记录,而且您还没有解决任何问题。

可以并行执行两个查询(数据库爱并发,处理得很好),但是你可以在数据库中,这可能会成为未来的可扩展性问题上把一个额外的负担。

至于查询块,我相信SqlDataReader将允许您获取记录,因为它们变得可用,而无需等待整个查询完成。不过,您必须自己将它们添加到DataTable中。

+0

+1我选择这个答案作为答案,因为它最适合我的问题。 – 2012-02-27 21:14:56

1

如果您查询当前数据集的数量,它将遍历所有行。这几乎就像取得它一样慢。您可以尝试通过sql语句选择一个计数。 例如:"SELECT COUNT(ID_COLUMN) FROM TABLE WHERE ..."。这是您必须执行的另一个sql语句,但要求数据集的计数更快。
有一个C#progressbar控件。你只需要设置一个最大值,并且每次迭代循环时都可以调用函数step()。它会将进度条设置一步;) 不需要您进行百分比计算。

+0

+1。这解决了“下载我millsion行需要时间”的问题,而不是“查询速度慢”。相反,它会通过严重查询命中服务器两次。人们因这种优化而被解雇。 – TomTom 2012-02-27 19:15:31

+0

据我所知,这是使用sql数据集进度条的最佳方式。我期待着学习更好的解决方案! – gimbar 2012-02-27 19:19:56

+0

@gimbar你可以详细说明'通过sql语句选择一个计数器'是什么意思吗? – 2012-02-27 19:21:24

2

如果你正在加载整个表在内存中,你可能会做错。用户是否真的需要所有这些数据?有多少用户会同时查询数据库?你确定用户将使用整个桌子吗?

如果你的回答是所有这些问题比你可以考虑使用分页模式:跳过 + 采取,你可以升到进度更新的事件与跳跃/带/总价值。

//META CODE 
var dataTable = new List<DataTable>(); //in-memory storage 
int rowCount = [...].Rows.Count(); //this is fast check with database 
int current; 

while (current < rowCount) 
{ 
    var fetchedData = [...].Skip(current).Take(1000).ToList(); 
    dataTable.AddRange(fetchedData); 
    current = dataTable.Rows.Count(); 

    //fire progress update event 
} 
+0

什么是“[..]”? – 2012-02-27 19:35:15

+0

这是你如何访问你的实际数据库,通过EF或SqlDataReader或其他任何东西(请原谅我的语法,这只是为了表明一个想法) – oleksii 2012-02-27 19:42:49

+0

+1我看,谢谢。 – 2012-02-27 21:14:00