从数据库中删除选定的数据表行
本文关键字:数据表 数据库 删除 | 更新日期: 2023-09-27 18:21:41
我在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();
}
通过调试,我发现当我按下"删除"键时,它进入了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();
但它给出了null异常,表示dataGridView1的数据源不能为null。
有没有关于如何从数据库中删除所选行的想法?提前谢谢。
我将使用两种不同的方法进行更新。一个用于插入/更新,一个用于删除
删除Row时,框架将调用RowDeleted事件处理程序,而不是RowChanged。
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
try
{
MySqlCommandBuilder cmdb = new MySqlCommandBuilder(sda);
sda.Update(dbDataset);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
try
{
SqlCommandBuilder cmdb = new SqlCommandBuilder(da);
da.Update(dt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
您应该删除AcceptChanges调用。根据MSDN
当您对数据集调用AcceptChanges时,任何DataRow对象仍然在编辑模式下成功结束编辑。的RowState属性每个DataRow也发生变化;添加和修改的行变为未更改,并且删除已删除的行。