我在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。
有没有想过如何从数据库中删除所选行?提前致谢。
答案 0 :(得分:1)
我会使用两种不同的方法进行更新。一个用于插入/更新,另一个用于删除 删除行时,框架将调用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
当您在DataSet上调用AcceptChanges时,任何DataRow对象仍然存在 在编辑模式下,他们的编辑成功完成。的RowState属性 每个DataRow也会发生变化;添加和修改的行变为不变, 删除已删除的行。