錯誤:違反並發性: 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 語句


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM