2014-10-08 78 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中运行一个跟踪来查看哪些语句正在触发数据库引擎。

真诚

约翰