C#dataGridView更新用另一个线程更改到数据库

时间:2016-12-01 12:43:36

标签: c# database multithreading datagridview

我想用另一个线程更新数据库的更改,因为当我更改超过100个单元格值时,表单会冻结几秒钟。

我尝试了很多解决方案,但我总是得到这个错误

  

与此DataReader相关联的已打开Connection   必须先关闭。

我该如何解决这个问题? 没有使用此代码更新数据库的线程:

private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    try
    {
        DataTable changes = ((DataTable)dataGridView1.DataSource).GetChanges();

        if (changes != null)
        {
            MySqlCommandBuilder mcb = new MySqlCommandBuilder(mySqlDataAdapter);
            ((DataTable)dataGridView1.DataSource).AcceptChanges();
            mySqlDataAdapter.UpdateCommand = mcb.GetUpdateCommand();
            mySqlDataAdapter.Update(changes);
        }
    }
    catch (Exception _ex)
    {
        MessageBox.Show(_ex.ToString());
    }
}

2 个答案:

答案 0 :(得分:0)

您的错误信息非常简单:

  

DataReader关联的已开放Connection必须先关闭

您必须关闭与数据库的现有连接,不应将其保持打开状态。这可以通过关闭(或处理)连接或适配器来完成,这显然是不会这样做的。

此外,您应该从UI中删除数据库逻辑 - 这是一个糟糕的设计。如果您想在后台处理某些事件,可以使用async/awaitasynchronous event handler并在后台触发Task

答案 1 :(得分:-1)

尝试这样的事情:

Thread thread = new Thread(updateChanges);
thread.Start();

private void updateChanges() 
{
    //here your code to update changes.        
}

但是,如果要更新updateChanges()函数中的任何UI组件,则必须使用InvokeRequired。