我想使用进度条显示已加载数据行的当前进度%。我看到similiar question已被问到,但解决方案只是建议使用字幕样式。
例如,我运行一个Select语句来查询可能需要几秒钟的大型数据表。 我希望进度条更新查询的当前进度。可能吗?
我知道我需要的东西很少:
对于2.是我不知道如何实现的部分。
我可以想到将它拆分成情侣查询,但这可能无法一直存在。
但是在SQL中Cursor
类似的东西呢?让SQL Server查询一个块并重复返回数据。
for loop{
//query a chunk of records
//return
//Next
}
所以我可以计算进度并将它们填入一个DataTable
。
可以做一些上面的事吗?如果是这样,怎么样?
因为我看到ASP.NET应用程序能够显示加载大型数据表的进度,所以我想在WPF中实现相同的功能。
答案 0 :(得分:2)
如果要将整个表加载到内存中,则可能是错误的。用户真的需要所有数据吗?有多少用户会同时查询数据库?您确定用户将使用整个表吗?
如果你回答是所有这些问题,你可以考虑使用分页模式:跳过 + 选择,你可以提升进度使用skip / take / total值更新事件。
//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
}
答案 1 :(得分:1)
如果查询当前数据集的计数,它将遍历所有行。这几乎和获取它一样慢。您可以尝试通过sql语句选择计数。
例如:"SELECT COUNT(ID_COLUMN) FROM TABLE WHERE ..."
。这是你必须执行的另一个sql语句,但要求数据集计算它的速度要快
有一个C#progressbar控件。您只需设置一个最大值,每次迭代循环时都可以调用函数step()。它会将进度条设置为领先一步;)
您无需进行百分比计算。
答案 2 :(得分:1)
首先,您需要确定将查询分解为两个不会使查询时间加倍。你可能会发现自己在获得记录数之前等了几秒钟,而你还没有解决任何问题。
你可以并行执行两个查询(数据库喜欢并发并处理得很好),但是你会给数据库带来额外的负担,这可能成为未来的可扩展性问题
至于查询块,我相信SqlDataReader
将允许您在可用时获取记录,而无需先等待整个查询完成。但是,您必须自己将它们添加到DataTable中。