c# - 删除行时数据表/数据源自动增量列同步的棘手错误

标签 c# mysql concurrency datatable dataadapter

我几天前发布了这个问题,但对这个问题进行了适当的解释,所以希望这次尝试更加清晰。当尝试在我的数据源(MYSQL 数据库)上使用 C# MySQLDataAdapter.Update() 函数时,我遇到了 DBConcurrency 错误。

我在 C# 程序中操作的 DataTable 的来源是数据库中的一个表,我使用 MySQLDataAdapter 提取该表。我想操作行,然后使用 DataAdapter 的 Update() 函数将更改保存到数据库。它在大多数情况下都运行良好,但我发现了一个涉及自动增量列的难以解决的问题。

假设数据库表有一个记录列表,例如:

1 Apple
2 Orange
3 Banana
4 Pear

其中第一个 ID 列自动递增。我可以很好地填充 DataTable 并使用 MissingSchemaAction.AddWithKey() 等使其自动增量,如果我向 DataTable 添加新记录“Grapes”,则自动增量 ID 列将为 5,并且当我添加新记录“Grapes”时,数据库将接受它对其运行 Update()。

但是,如果我将 Grapes 记录添加到 DataTable,然后删除它,然后再次添加它(我知道这难以置信,但它确实发生了),DataTable 自动增量只会不断增加,所以现在看起来像这样:

1 Apple
2 Orange
3 Banana
4 Pear
6 Grapes

如果我现在运行 Update(),“Grapes”记录自动 ID 会作为 5 保存到数据库表中,因为这是数据库自动增量所在的位置,但在 DataTable 中它被列为 6,所以它们'现在不同步,如果我从 DataTable 中删除 Grapes 行并再次运行 Update(),我会收到错误:

"Concurrency violation: the DeleteCommand affected 0 of the expected 1 records."

在我的程序的 Update() 行上。

我环顾四周,似乎这种不同步的情况相当频繁地发生,但在这个阶段,我想知道是否可以做些什么,而不必返回并撕毁我的大部分代码。已经写过了。

最佳答案

我能够解决此问题的唯一方法是执行以下操作:

DataTable copyTable = Table.Copy();
Table.Clear();

for( int i = 0; i < copyTable.Rows.Count; i++ )
 {
      DataRow r = copyTable.Rows[i];
      r[0] = i;
      Table.ImportRow( r );
 }

实际上,删除一行后,我将表复制到临时表,然后循环遍历剩余行,使用行数设置“ID”列 (r[0])。

关于c# - 删除行时数据表/数据源自动增量列同步的棘手错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452405/

相关文章:

php - 以逗号分隔的字符串分割并在 MySQL 和 PHP 中显示

ios - 异步执行但同步写入

Java Thread.join : what is the behaviour when calling join on multiple threads

linux - OSX 和 LINUX 上的 POSIX 线程之间的区别?

c# - 有效地合并列表列表

PHP 和 mySQL - 将单个 HTML 字段文本解析/分离为 2 个变量

c# - 为什么我的 ASP Web 应用程序试图写入 C :\Windows\Microsoft. NET\Framework64\v4.0.30319\Temporary ASP.NET 文件?

mysql - 统计查询花费的时间

c# - 如何按行读取特定单词的文本文件并将整行写入另一个文本文件?

C#如何自己命名Main()方法?