如何正确地将bindingSource更改提交到源数据库?

时间:2012-01-07 10:31:06

标签: c# .net winforms dataset bindingsource

我设置了DataGridView和其他UI组件,以允许用户编辑来自SQLite DB的数据。但是这些更改(即使它们在应用程序中正确显示)也不会保存到DB。我试过这段代码

aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts);   

但是有并发异常:

  

System.Data.DBConcurrencyException未处理Message = Concurrency   违规:UpdateCommand影响了预期的1条记录中的0条。

那么我应该如何将绑定源更改提交给DB呢?


POST EDIT 我在启动程序时遇到此异常,然后单击DataGridView中的第二行,然后单击第三行,此时程序引发并发异常。希望他的帮助能让这个问题更加详细。

先谢谢你,伙计们!

4 个答案:

答案 0 :(得分:3)

这样的东西?

try
{
   aBindingSource.EndEdit();
   dbDataSetA.GetChanges();
   aTableAdapter.Update(dbDataSetA.Accounts);   
}
catch (DBConcurrencyException exc)
{
   MessageBox.Show("original data changed, please redo updates");
   aTableAdapter.Fill(dbDataSetA);
}

然后根据需要将dbDataSetA重新分配为DataSource,用户必须再次输入数据。

答案 1 :(得分:3)

有同样的问题。诀窍是,一旦你更新表,你应该“清空”GetChanges()。您可以通过调用方法AcceptChanges()来实现。所以......

aBindingSource.EndEdit();
dbDataSetA.GetChanges();
aTableAdapter.Update(dbDataSetA.Accounts); 
dbDataSetA.AcceptChanges();

它应该有效,只要它是同样的问题。

答案 2 :(得分:1)

您可以将适配器与命令构建器结合使用,如下所示:

DataTable table = new DataTable();
var adapter = new SqlDataAdapter("SELECT * FROM ...", con)) 

//Load the dataTable and the bound datagridView
adapter.Fill(table);



    using (new SqlCommandBuilder(adapter))
    {
      //When done you can update the database using the Command builder
      adapter.Update(table);
    }

答案 3 :(得分:0)

也许超大但是你可以尝试使用交易只是阅读这篇文章,可能会有所帮助:

Transactional sqlite