从C#数据库中获取数据时显示自定义进度条

时间:2014-12-20 15:37:16

标签: c# sql database progress-bar

我使用下面的代码从数据库中获取数据并在dataGrid上显示数据如何在从数据库中获取数据时显示自定义进度条?

private void ReadRecords(){
        using (SqlConnection c = new SqlConnection(Properties.Settings.Default.Database1ConnectionString)) {
            try{
                c.Open();
                if (c.State == ConnectionState.Open) {
                    using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM Items ORDER BY item_id", c)) {
                        try {
                            DataTable t = new DataTable();
                            a.Fill(t);
                            dataGridView1.DataSource = t;
                        }

                        catch(Exception ex){
                            MessageBox.Show("Failed Fill Data :." + ex);
                            return;

                        }
                    }
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Failed To Open Connection :." + ex);
                return;
            }
        }

    }

2 个答案:

答案 0 :(得分:1)

这里的“技巧”是适当地使用UI线程,如果您使用UI线程从数据库加载数据(通常由点击或加载事件产生),那么任何动画或进度指示器都将被冻结,因为UI线程忙于数据操作。您需要做的是线程输出或通过TPL“任务”完成数据加载操作,并在该操作完成时Invoke关闭进度指示器的方法。

通过将数据操作线程化为非UI线程,UI线程可用于执行动画。这是一个详细说明如何调用UI线程的链接:

Execute a delegate in the ui thread (using message pump)

答案 1 :(得分:0)

最简单的解决方案是显示没有任何进度值的加载指示器。

ShowProgressIndicator();
ReadRecords()
HideProgressIndicator();

如果要显示实际进度,则必须确定工作量。例如,让我们说总行数是整个工作。您可以通过除fetched rows / total rows count来计算进度百分比。您应该向数据库发出多个请求以实现此类进度条。

首先 - 请求总行数。 然后 - 按部分获取行,比如每个请求500行,直到获取所有行。