zoukankan      html  css  js  c++  java
  • 错误:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条

    在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 语句

  • 相关阅读:
    查询语句
    索引的增删改成查
    pymysql模块
    mysql备份
    单表查询语法
    单表查询
    mysql增删改差
    Leetcode--1. Two Sum(easy)
    Leetcod--20. Valid Parentheses(极简洁的括号匹配)
    Leetcode-448. Find All Numbers Disappeared in an Array(solve without extra space easy)
  • 原文地址:https://www.cnblogs.com/dullfish/p/6202895.html
Copyright © 2011-2022 走看看