Как отправить результат в основной поток в DoWork (BackgroundWorker) - PullRequest
0 голосов
/ 25 сентября 2019

У меня проблема с BackgroundWorker!Когда я получаю данные из базы данных и пытаюсь передать данные в RunWorkerCompleted, я получаю сообщение об ошибке:

System.NullReferenceException Ссылка на объект не указывает, что экземпляр объекта e был нулевым.

проблема возникает в e.Result = dataTable;

private void BackgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)   
{
        string Refresh = "dbo.GetRenderedService '" + dateTimePicker2.Value.Date.ToString() + "','" + dateTimePicker4.Value.Date.ToString() + "'";
        DataTable dataTable = DbConnection.DBConnect(Refresh);
        int i = 1;
        try
        {enter code here
            foreach (DataRow dr in dataTable.Rows)
            {
                backgroundWorker1.ReportProgress(i);
                Thread.Sleep(100);
                i++;
            }
            e.Result = dataTable;
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

private void BackgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    progBar.Value = e.ProgressPercentage;
}

private void BackgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
        source.DataSource = e.Result;
        dataGridView1.DataSource = source;
        dataGridView1.Columns[0].Visible = false;
        dataGridView1.Columns[1].Visible = false;
        dataGridView1.Columns[2].Visible = false;
        dataGridView1.Columns[3].Visible = false;
        dataGridView1.Columns[4].Visible = false;
        dataGridView1.Columns[5].Visible = false;
        dataGridView1.Columns[6].Visible = false;
}

Это класс для извлечения данных из SQL Server.

class DbConnection
{
    public static string connectionString = "Data Source=POTITPC-01\\PLMLOCAL;Initial Catalog=Batys;User ID=sa;Password=!sql123;";
    public static DataTable DBConnect(string query)
    {
        SqlConnection conn = new SqlConnection(connectionString);
        SqlDataAdapter da = new SqlDataAdapter(query, conn);
        DataTable dataTable = new DataTable();

        try
        {
            conn.Open();
            da.Fill(dataTable);
            conn.Close();
            conn.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        return dataTable;
    }
...