2014-10-08 75 views
0

當我嘗試更新我的客戶表,它是鏈接服務器上,從我的MSSQL服務器上的程序,我得到這個錯誤:Eror鏈接服務器上更新MySQL表時,從MSSQL服務器

OLE DB provider "MSDASQL" for linked server "PRESTA" returned message "Row cannot be located for updating. Some values may have been changed since it was last read.". 
Msg 7343, Level 16, State 4, Line 1 
The OLE DB provider "MSDASQL" for linked server "PRESTA" could not UPDATE table "[PRESTA].. [prs_customer]". The rowset was using optimistic concurrency and the value of a column has been changed  after the containing row was last fetched or resynchronized. 

我我100%肯定,我試圖把我的客戶表的生日列中的值是不一樣的,因爲這是已經在它的價值:

UPDATE PRESTA...prs_customer 

SET birthday = @birthday 
WHERE id_customer = @id_customer 

此錯誤是隻表示,因爲該值已經在生日欄是:「0000-00-00」,而不是空。當我直接在數據庫中更改爲實際NULL時,我的過程正常工作,並且不會給出任何錯誤。

另外,兩個值都是DATE類型,具有相同的格式,所以這不是問題。

我對此感到莫名其妙,所以如果有人請詳細說明一下?

回答

1

只需閱讀錯誤消息。鏈接服務器正在使用樂觀併發。因此,通過OLE DB層中的遊標讀取記錄。當您嘗試執行更新時,數據已更改。樂觀意味着在更新之前使用鎖定。

您確定這是確切的SQL語句嗎?
在更新過程中是否有其他可能會更改ID的進程?

查看MS Press的ADO書籍。

http://web.archive.org/web/20021222065228/http://www.microsoft.com/mspress/books/sampchap/3445.asp

這說明您所遇到的同樣的錯誤。

除非它是OLE DB提供程序或MySQL中的錯誤,否則它會將我視爲鎖定問題。

你可以增加鎖定水平悲觀嗎?如果你這樣做,你將不得不在你的代碼中處理阻塞。

我也會在MySQL中運行一個跟蹤來查看哪些語句正在觸發數據庫引擎。

真誠

約翰