【发布时间】:2014-11-05 10:07:10
【问题描述】:
我在 C# 的 DataGridView 中有一个数据表。我用从 MySql 数据库获得的值填充了这个表。现在,一旦我在 WinForm 端的数据表中添加任何新值,它就可以成功检索数据库表并添加到它。这是用于此目的的代码:
dbDataset.RowChanged += new DataRowChangeEventHandler(Row_Changed); // dbDataset is my datatable name
和
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
// here sda is my MySqlDataAdapter
try
{
MySqlCommandBuilder cmdb = new MySqlCommandBuilder(sda);
dbDataset.GetChanges();
dbDataset.GetChanges(DataRowState.Added);
dbDataset.GetChanges(DataRowState.Deleted);
dbDataset.GetChanges(DataRowState.Detached);
dbDataset.GetChanges(DataRowState.Modified);
dbDataset.GetChanges(DataRowState.Unchanged);
sda.Update(dbDataset);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
但是现在我发现当我想从表中删除任何一行时,例如我选择一行并按“删除”键,它会在屏幕上显示它已被删除,但是一旦我重新加载我的 WinForm,它仍然在那里。显然它没有从数据库中删除该选定的行。为此,经过一番搜索,我添加了以下部分:
dbDataset.RowDeleted += new DataRowChangeEventHandler(Row_Deleted);
和
private static void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
dbDataset.AcceptChanges();
}
通过调试发现,当我按下“delete”键时,进入Row_Delete函数,然后进入Row_Changed函数,但抛出异常,说:
Additional information: Concurrency violation: the DeleteCommand affected 0 of the expected 1 records.
我搜索得到当前选择的行索引,这样我就可以使用 DataRow.delete 方法,例如:
CurrencyManager xCM = = (CurrencyManager)this.BindingContext[this.dataGridView1.DataSource, this.dataGridView1.DataMember];
在Row_Deleted 函数中我添加了:
DataRowView xDRV = (DataRowView)xCM.Current;
DataRow xDR = ((DataRowView)xCM.Current).Row;
xDR.Delete();
但它给出了空异常,说dataGridView1的数据源不能为空。
有没有关于如何从数据库中删除所选行的想法?提前致谢。
【问题讨论】:
-
AcceptChanges 很棘手。它不会更新数据库上的任何内容。它只接受内存数据表上的更改。如果您调用它,则不会将任何内容写入数据库,因为每行的状态都将重置为未更改,并且已删除的行将从数据表中删除
-
那么我应该怎么做才能从数据库中删除呢?
-
Row_Changed 事件中的代码应该可以工作(删除不需要的 GetChanges 调用)但是,我会在 button_click 事件(保存按钮)中编写该代码,而不是为每个更改的行执行它.如果我没记错的话,Update 调用会导致对 RowChanged 的递归调用。
-
确实很棘手 :) 我按照你说的做了,删除了 Row_Changed 函数中的所有 GetChanges 调用,然后只保留了 Row_Deleted 函数中的 dbDataset.AcceptChanges() 行。现在它按预期工作。谢谢。
-
我认为它起作用只是因为您在删除后进行了更改。使用 Update 调用对 RowChanged 的调用是使用更改更新数据库的调用。如果您只是删除一行而不进行任何其他更改,我认为您的行没有从数据库中删除。
标签: c# mysql sql winforms datatable