【问题标题】:Handling concurrency exceptions in DataGridView在 DataGridView 中处理并发异常
【发布时间】:2015-08-06 23:37:42
【问题描述】:

This article here 描述处理并发异常。重现问题的步骤是:

  1. 创建一个新的 Windows 应用程序项目。
  2. 基于 Northwind 客户表创建一个新数据集。
  3. 使用 DataGridView 创建一个表单来显示数据。
  4. 使用 Northwind 数据库中客户表中的数据填充数据集。
  5. 填充数据集后,使用 Visual Studio 中的 Visual Database Tools 直接访问 Customers 数据表并更改记录。
  6. 然后在表单上,​​将同一记录更改为不同的值,更新数据集,并尝试将更改写入数据库,这会导致引发并发错误。
  7. 捕捉错误,然后显示不同版本的记录,让用户决定是继续更新数据库,还是取消更新。

我的问题是,为什么会发生这种情况?为什么我不能只保存和编辑 DataGridView 中的记录而不会导致任何错误?我正在使用 DataGridView 创建一个应用程序,我正面临这个问题。我需要一些方法来避免或解决此错误而不通知用户,因此他们在 DataGridView 中看到的任何内容都会完全按照您看到的方式保存。该错误的原因是什么?

【问题讨论】:

  • 似乎只有在受影响的行数为零时才调用 DBConcurrencyException。我假设记录被删除或主键可以更新。
  • 每当我编辑刚刚保存的行或编辑具有相同数据的两行之一(主键除外)时,都会发生这种情况。那么受影响的行数怎么可能为零呢?
  • 为什么要忽略这种异常?
  • 我不想忽略它。我想处理它,以便 DataGridView 始终以用户看到的方式保存表格。一种解决方案是彻底清除数据库,然后用来自 DGW 的数据填充它,但这不是矫枉过正吗?
  • 最好的做法是捕获异常并从数据库中重新加载记录,这样用户就可以根据当前数据决定要做什么。

标签: c# vb.net winforms datagridview dataset


【解决方案1】:

解决方案非常简单。

您需要做的就是在每次保存后再次将数据重新加载到 DataGridView 中。

所以 BindingNavigator 保存按钮的代码现在是:

this.Validate();
this.maintableBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.yourDataSet);
this.maintableTableAdapter.Fill(this.yourDataSet.yourtable);

我不知道为什么会这样,所以我需要专家来确认这一点。不过可行的解决方案。

感谢E-Bat 将这个想法植入我的脑海中。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多