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

C# 删除行时DataTable/Datasource自动增量列同步的棘手错误,c#,mysql,concurrency,datatable,dataadapter,C#,Mysql,Concurrency,Datatable,Dataadapter,我在几天前发布了这个问题,但是对这个问题做了一些适当的解释,所以希望这个尝试更加清晰。我在尝试对我的数据源(MYSQL数据库)使用C#MySQLDataAdapter.Update()函数时遇到了DBConcurrency错误 我在C#程序中操作的DataTable的源是我使用MySQLDataAdapter提取的数据库中的一个表。我想操作行,然后使用DataAdapter的Update()函数将更改保存到数据库中。它在大多数情况下工作得很好,但我发现了一个涉及自动递增列的难以解决的问题 假设数

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

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

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

1 Apple
2 Orange
3 Banana
4 Pear
其中第一个ID列是自动递增的。我可以使用MissingSchemaAction.AddWithKey()等将数据表填充得很好,并使其自动递增,如果我向数据表中添加一条新记录“Grapes”,则自动递增ID列将为5,并且当我对其运行Update()时,数据库将接受它

但是,如果我将Grapes记录添加到DataTable中,然后删除它,然后再添加它(我知道这是不可能的,但确实发生了),DataTable autoincrement会一直运行,所以现在看起来是这样的:

1 Apple
2 Orange
3 Banana
4 Pear
6 Grapes
如果我现在运行Update(),则“Grapes”记录的自动ID将以5的形式保存到数据库表中,因为数据库自动增量位于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 );
 }
DataTable copyTable=Table.Copy();
表1.Clear();
对于(int i=0;i

实际上,在我删除一行之后,我将该表复制到一个临时表中,然后循环其余的行,使用行数设置我的“ID”列(r[0])。

添加您自己的删除命令/过程,并在其中放置一个if,或者检测到您要删除的记录尚未过帐,并取消插入。问题不是我试图删除的记录不存在,而是我试图删除的记录在DataTable中具有autoID 6(例如),但在DataTable中具有autoID 5,所以delete命令在数据库中查找autoID 6,但找不到它(我想是吧?)您说您添加了它,然后删除了它,然后又添加了它。。。除非您提交每个更改和刷新、独占锁定表或使用GetChanges和Reconcide,否则这永远不会起作用。插入记录的id不可能与基础sql表同步,它已断开连接。