在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語句: