错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条

时间:2023-03-08 17:50:44

在access的mdb数据库动态更新的过程中,遇到了DeleteCommand出现DBConcurrencyException异常,错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条。

程序逻辑:遍历表1的所有行,如果符合条件,则删除表1当前行,且删除表2中的相关行(两行),并在表2中插入新的一行。由于在判断的时候需要用到表2中新插入的行,所以得在循环中实时更新。

经查找:

该错误的原因为:数据库的主键设置为-自动编号。

错误分析:

首先获取的DeleteCommand和InsertCommand为自动获取,

          OdbcCommandBuilder pCommbui_GD = new OdbcCommandBuilder(adapter_GD);
adapter_GD.DeleteCommand = pCommbui_GD.GetDeleteCommand(); OdbcCommandBuilder pCommbui_GX = new OdbcCommandBuilder(adapter_GX);
adapter_GX.DeleteCommand = pCommbui_GX.GetDeleteCommand();
adapter_GX.InsertCommand = pCommbui_GX.GetInsertCommand();

实际为:

DELETE FROM 管线表 WHERE ((ID = ?) AND ((? = 1 AND 起点号 IS NULL) OR (起点号 = ?)) AND ((? = 1 AND S_X IS NULL) OR (S_X = ?)) AND

 ((? = 1 AND S_Y IS NULL) OR (S_Y = ?)) AND ((? = 1 AND S_H IS NULL) OR (S_H = ?)) AND ((? = 1 AND 终点号 IS NULL) OR (终点号 = ?)) 

AND ((? = 1 AND E_X IS NULL) OR (E_X = ?)) AND ((? = 1 AND E_Y IS NULL) OR (E_Y = ?)) AND ((? = 1 AND E_H IS NULL) OR (E_H = ?)))

即通过对比以上的字段(包括主键ID)来删除行,但是由于ID为自动编号,当执行完删除、插入操作后,DataTable和数据库中相同ID号对应的其他字段值发生改变,这时候再根据原来读取的DataTable的一行为条件来删除数据库中的行时,会发现数据库ID值符合条件的其他字段的值不符合条件,所以出现错误。

修改办法:

只需要修改主键字段类型-将自动编号类型改为数字类型,再在插入的时候ID自动赋最大值即可。

思路:

新建字段ID_Copy,类型数字;将ID复制到ID_Copy;删除ID;将ID_Copy设为主键。每次在执行插入的操作时,将最大的编号赋值给ID_Copy。

参考sql语句:

SQL ALTER TABLE 语句