無法為更新定位行,一些值可能已在最后一次讀取后已更改


ADOTable,ACCESS數據庫,表某個字段A-數字類型,默認值是0.

添加一條記錄后,

http://wenku.baidu.com/view/bd87ea50ad02de80d4d840c8.html

 

無法為更新定位行,一些值可能已在最后一次讀取(2009-03-11 11:58:22)標簽:it 報錯:無法為更新定位行,一些值可能已在最后一次讀取后已更改 在Delphi 7中,用ADOQuery或ADODataSet操作數據庫很方便,可查詢,可增刪改。

但如果對數據進行修改保存,然后再次對其進行修改保存,就會遇到“無法為更新定位行,一些值可能已在最后一次讀取后已更改”的問題。

原因有這樣幾種:

1.在數據庫設計時,為某些字段設置了默認值,在修改進行提交以后,數據庫會自動修改對應字段的所有行的默認值,從而導致了數據庫與數據集中數據的不一致,使ADOQuery(adoDataSet)無法對數據集進行定位。

2.數據庫對應的表沒有主鍵,輸入了重復的數據以后,數據庫里有兩條一樣的數據,從而使ADOQuery無法對數據進行定位。

解決方法:

1.修改數據庫設計,不再設置默認值,為數據庫表定義主鍵,保證其唯一性。

2.在執行完ADOQuery.Post之后,執行ADOQuery.Refresh,對於設置默認值的情況可以解決。 (refresh后dataset中的默認值字段獲得了值,跟數據庫中一致了)

3.改用Insert into sql語句插入,而不是add--post方式. 但這種方式不更新其他打開該表的query, 所以要requery才行, refresh不起作用.

4.使用ADODataSet也是同樣的解決方法

 

http://www.cnblogs.com/terony/archive/2013/06/13/3133383.html

 

 

 

"無法為更新定位行。一些值可能已在最后一次讀取后已更改。"問題的解決方案

無數的DB Developers遇到過"無法為更新定位行。一些值可能已在最后一次讀取后已更改。"這一經典提示,其經典程度堪比當年的Windows藍屏。它並非大問題,卻是很“頑固”的存在。解決這一問題應該遵循如下兩條原則:

1. 盡量使用 "update"語句來更新數據庫中的指定行的數據;

2. 如果必須添加,盡量使用"insert"語句來完成添加;

實例說明:我寫了一個類用來讀寫數據庫中的指定記錄。我一前一后使用該類中的兩個方法對數據庫中同一表格的同一行數據的不同字段進行修改,此時出現"無法為更新定位行。一些值可能已在最后一次讀取后已更改。"錯誤提示。原因是兩次提交過於接近,時間間隔以毫秒計,數據庫服務器“響應不及”。通過遵循上述兩條原則該問題得到解決。

備注:網絡上給出了很多方法,不一而足,多數指向關鍵字未設置、某些字段是否設置為“允許為空”、出現重復數據等回答。一名合格的DB Developer是不會輕易犯下這些錯誤的,但他們(也包括我)可能會更傾向於使用開發語言(工具)所提供給的更簡潔的方法來訪問數據庫,然而這些方法可能存在“問題”,當然我不是指這些方法有Bug,它們單個執行都沒有問題,可程序設計是千變萬化的,把它們“組合”起來的時候就不一定能夠得到你想要的結果了。使用傳統SQL語句來更新數據則有效的將問題交給了服務器端,服務器端可以自行控制提交,只需在完成后向客戶端提交一個執行是否成功的結果。是的,這個返回的結果絕大多數情況下不會讓你失望的!^_^

 


免責聲明!

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



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