我想用另一个线程更新数据库的更改,因为当我更改超过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());
}
}
答案 0 :(得分:0)
您的错误信息非常简单:
与
DataReader
关联的已开放Connection
必须先关闭
您必须关闭与数据库的现有连接,不应将其保持打开状态。这可以通过关闭(或处理)连接或适配器来完成,这显然是不会这样做的。
此外,您应该从UI中删除数据库逻辑 - 这是一个糟糕的设计。如果您想在后台处理某些事件,可以使用async/await
与asynchronous event handler并在后台触发Task
。
答案 1 :(得分:-1)
尝试这样的事情:
Thread thread = new Thread(updateChanges);
thread.Start();
private void updateChanges()
{
//here your code to update changes.
}
但是,如果要更新updateChanges()函数中的任何UI组件,则必须使用InvokeRequired。