当我尝试更新我在链接服务器上的客户表时,从我在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%确定我试图放入Customer表的birthday列中的值与其中已有的值不同:
UPDATE PRESTA...prs_customer
SET birthday = @birthday
WHERE id_customer = @id_customer
此错误仅显示因为生日列中已有的值为:“0000-00-00”,而不是null。当我直接在数据库中更改为真实NULL时,我的程序可以正常工作,并且不会出现任何错误。
此外,两个值都是DATE类型,具有相同的格式,因此这不是问题。
我对此感到困惑,所以如果有人请详细说明吗?
答案 0 :(得分: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中运行跟踪,以查看哪些语句正在使用数据库引擎。
此致
约翰