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

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

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

但是有并发exception:

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

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


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

先谢谢你,伙计们!

像这样的东西?

 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,用户必须再次输入数据。

有同样的问题。 诀窍是,一旦你更新表,你应该“清空” GetChanges() 。 你可以通过调用方法AcceptChanges()做到这一点。 所以…

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

它应该工作,只要它是同样的问题。

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

 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); } 

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

事务sqlite