如何正确地将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