【问题标题】:How to properly commit bindingSource changes to source DB?如何正确提交 bindingSource 更改到源数据库?
【发布时间】:2012-02-04 20:12:13
【问题描述】:

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

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

但是有并发异常:

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

那么,伙计们,我应该如何将 bindingsource 更改提交到 DB?


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

提前谢谢各位!

【问题讨论】:

  • 并发异常意味着:在您阅读数据和尝试更新数据之间,某人或某事更改了您的数据。基本上,在这种情况下,您要么需要再次加载数据并向用户显示新数据,以便他再次进行更改,要么需要一些冲突解决策略来将新更改合并到数据库中。
  • @marc_s 好的,谢谢,马克!那么如何再次加载数据以显示使用变化?

标签: c# .net winforms dataset bindingsource


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    也许过大,但您可以尝试使用 Transaction 只是阅读这篇文章,可能会有所帮助:

    Transactional sqlite

    【讨论】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 请看我上面的编辑。我认为解决方案比您建议的更容易。希望此编辑将帮助您更详细地理解它。谢谢!
        猜你喜欢
        • 2019-11-28
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2016-05-03
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多