我几天前发布了这个问题,但对这个问题进行了适当的解释,所以希望这次尝试更加清晰。当尝试在我的数据源(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/