SQL Server 错误:找不到要更新的行,自上次读取以来,某些值可能已更改,将提供程序从SQLOLEDB更改为MSOLEDBSQL时

qgelzfjb  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(179)

在ADODB连接字符串中将提供程序从SQLOLEDB更改为MSOLEDBSQL时,我们会收到错误:
-2147217864找不到要更新的行。自上次读取后,某些值可能已更改。
连接字符串为:

Provider=MSOLEDBSQL;SERVER=servername;APP=Applicationname;DATABASE=databasename;WSID=id;Trusted_Connection=yes;MARS Connection=True;DataTypeCompatibility=80

代码如下所示:

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient 
rs.Open("SELECT * FROM tableName WHERE 1 = 2", Adoconnection, adOpenStatic, adLockBatchOptimistic, CommandTypeEnum.adCmdText) 
rs.AddNew
'Add the fields
...
...
rs.UpdateBatch ''this line throws error

现在,当provider的连接字符串更改为SQLOLEDB时,使用相同的代码,它可以正常工作,没有任何问题。

cotxawn7

cotxawn71#

尝试添加一个时间戳,或者所谓的“rowversion”列到表中。(使用类型timestamp -它的值为零,表示时间)。
此外,如果该表中有任何位列,则确保它们不为空,并确保为该位列设置了默认值(0)。
如果应用程序有链接的表,那么在服务器端进行上述更改后重新链接表。

ee7vknir

ee7vknir2#

我发现了这个问题,它是在SQL触发器。
相应的表在触发器上有一些更新语句。在触发器中的更新语句之前添加SET NOCOUNT ON帮助我避免了这个错误。

yduiuuwa

yduiuuwa3#

我找到了这个主题,因为我遇到了类似的错误。我在Windows 10上使用Access 365 VBA 32位。下面是我的代码片段(省略了一些细节):

Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = GetCurrentConnection()
cmd.CommandText = sql

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenDynamic, adLockOptimistic

With rs
    .Fields("FailedImport") = True
    .Fields("ImportErrors") = ReadErrorsFromResponse(xmlDoc)
    .Update
End With

我也遇到了与OP中相同的错误。在我的例子中,直到我包含了对名为FailedImport的布尔字段的更新,我才得到这个错误。我找到了从2008年到this forum post的方法,其中包含以下注解(格式化我的注解):
有同样的错误,但有它的记录集,而不是数据控制。从另一个论坛,我了解到,如果你是使用静态光标的记录集,使用adLockBatchOptimistic而不是adLockOptimistic解决了这个问题。
所以,我改了这句台词:rs.Open cmd, , adOpenDynamic, adLockOptimistic
转换为:rs.Open cmd, , adOpenDynamic, adLockBatchOptimistic
而且我的代码又起作用了!希望这对以后的其他人有帮助!

相关问题