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

本文关键字:提交 数据库 bindingSource | 更新日期: 2023-09-27 18:19:37

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

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

但也有并发异常:

System.Data.DBConcurrentException未处理消息=并发冲突:UpdateCommand影响了预期的1条记录中的0条。

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


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

提前谢谢,伙计们!

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

类似的东西?

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

只要是同样的问题,它就应该起作用。

您可以将Adapter与命令生成器结合使用,如下所示:

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