删除行时,DataTable / Datasource自动增量列同步的棘手错误

时间:2011-12-09 22:17:25

标签: c# mysql concurrency datatable dataadapter

我几天前发布了这个问题,但是正确地解释了这个问题,所以希望这个尝试更清楚。尝试在我的数据源(MYSQL数据库)上使用C#MySQLDataAdapter.Update()函数时,我遇到了DBConcurrency错误。

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

让我们说数据库表有一个记录列表,如:

1 Apple
2 Orange
3 Banana
4 Pear

第一个ID列是自动增量的。我可以通过使用MissingSchemaAction.AddWithKey()等来填充DataTable并使其自动增量,如果我向DataTable添加新记录“Grapes”,则自动增量ID列将为5,数据库将在我接受时在它上面运行Update()。

但是,如果我将Grapes记录添加到DataTable中,然后删除它,然后再次添加它(我知道这是不可信的,但它发生了),DataTable自动增量只是一直在增加,所以现在它看起来像这样: / p>

1 Apple
2 Orange
3 Banana
4 Pear
6 Grapes

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

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

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

我环顾四周,看起来这种去同步可能会经常发生,但在这个阶段,我想知道是否有任何我可以做的事情,而不会回头并撕毁大部分代码我写完了。

1 个答案:

答案 0 :(得分:1)

我能解决这个问题的唯一方法就是执行以下操作:

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])。