Покажите прогресс заполнения DataSet из MySQL - PullRequest
3 голосов
/ 27 февраля 2011

В настоящее время я занимаюсь разработкой приложения с использованием 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();
}

Я знаю, что мне придется поместить этот раздел кода в поток, как фоновый рабочий, но как я могу изменить этот кодпоказать прогресс.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2014

Этот ответ может прийти с небольшим опозданием, но, возможно, он поможет другим.

Во многих случаях достаточно показать количество прочитанных записей. Это можно сделать обработкой события DataTable.RowChanged. Из реализации теста я мог убедиться, что событие запускается для каждой строки, добавленной DataAdapter.Fill-Method. При обработке события вы можете получить считанные записи чисел, посмотрев DataTable.Rows.Count-Property

Обычно я читаю данные в фоновом потоке, который обновляет метку или запись списка. Метод, который фактически обновляет графический интерфейс, буферизует обновления метки, так что изменения графического интерфейса происходят только раз в секунду, чтобы предотвратить мерцание.

Надеюсь, это поможет.

Sascha

1 голос
/ 28 февраля 2011

Вместо

myDA.Fill(table);

... у вас должна быть возможность заполнять строку за строкой:

var dataReader = myDA.SelectCommand.ExecuteReader();
int progress = 0;
while (dataReader.Read()) {
   table.Rows.Add(dataReader);
   progress++;

   // Update progress view..
}

Хотя это не так аккуратно, как при использовании метода Fill, поэтомуЯ не уверен, если вы хотите сделать это таким образом.И, конечно же, для того, чтобы показать, сколько процентов работы выполнено, вам также необходимо получить количество строк в таблице по «Выбрать количество» или подобному, как указывало phsr.

0 голосов
/ 27 февраля 2011

Я хотел бы, чтобы Stecya прокомментировал реализацию индикатора выполнения в виде выделенного индикатора выполнения.

Чтобы иметь возможность обновлять индикатор выполнения заполнения набора данных, вам необходимо заранее знать, сколько записей у вас есть, а затем продолжать делать что-то вроде обертки dataAdapter, чтобы знать, сколько записей он поместил внабор данных, который я не совсем уверен, что вы могли бы сделать.

Если привязка источника данных также занимает значительное время, я бы получил сообщение о состоянии вместе со строкой выделения и обновил бы ее «Извлечение записей», а затем что-то вроде «Рендеринг записей»..

...