我目前正在使用C#和MySQL数据库后端开发应用程序。
我的程序最终可能会从数据库中加载大量数据并添加到DataGridView中显示的数据集中。我希望能够显示填充DataSet的进度,但不确定如何获取对数据库中的位置的引用。
以下是我目前的代码。
DatabaseWork dbase = new DatabaseWork();
try
{
dbase.openConnection();
MySqlDataAdapter myDA = new MySqlDataAdapter();
myDA.SelectCommand = new MySqlCommand(query, dbase.conn);
DataTable table = new DataTable();
myDA.Fill(table);
BindingSource bSource = new BindingSource();
bSource.DataSource = table;
tblDetails.DataSource = bSource;
//tblGrid.Columns[0].Visible = false;
}
catch (MySqlException ex)
{
dbase.displayError(ex.Message, ex.Number);
}
finally
{
dbase.closeConnection();
}
我知道我必须将此部分代码放入像后台工作者这样的线程中,但是如何更改此代码以显示进度。
答案 0 :(得分:4)
这个答案可能会有点晚,但也许有助于其他人。
在许多情况下,显示到目前为止读取的记录数就足够了。这可以通过处理DataTable.RowChanged事件来完成。从我可以验证的测试实现中,事件将触发DataAdapter.Fill-Method添加的每一行。处理事件时,您可以通过查看DataTable.Rows.Count-Property
来获取读取的数字记录我通常做的是在后台线程中读取数据,更新标签或列表框条目。实际更新gui的方法缓冲对标签的更新,以便gui更改每秒仅发生一次以防止闪烁。
希望这有帮助。
的Sascha
答案 1 :(得分:1)
而不是
myDA.Fill(table);
...你应该能够逐行填写表格:
var dataReader = myDA.SelectCommand.ExecuteReader();
int progress = 0;
while (dataReader.Read()) {
table.Rows.Add(dataReader);
progress++;
// Update progress view..
}
虽然它不像使用Fill方法那样整洁,所以我不确定你是否想这样做。当然,为了能够显示完成了多少百分比的工作,您还需要通过“选择计数”或类似的方式获取表中的行数,就像phsr指出的那样。
答案 2 :(得分:0)
我会和Stecya一起评论一个工具,将进度条作为选框进度条。
为了能够更新数据集填充的进度条,你必须事先知道你有多少条记录,然后继续做一些事情,比如包装dataAdapter以了解它放入数据集的记录数,我不完全确定你能做到。
如果绑定dataSource也需要相当长的时间,我会有一个状态消息和选框栏,并用“检索记录”更新它,然后按照“渲染记录”的方式更新。