在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时,使用相同的代码,它可以正常工作,没有任何问题。
3条答案
按热度按时间cotxawn71#
尝试添加一个时间戳,或者所谓的“rowversion”列到表中。(使用类型timestamp -它的值为零,表示时间)。
此外,如果该表中有任何位列,则确保它们不为空,并确保为该位列设置了默认值(0)。
如果应用程序有链接的表,那么在服务器端进行上述更改后重新链接表。
ee7vknir2#
我发现了这个问题,它是在SQL触发器。
相应的表在触发器上有一些更新语句。在触发器中的更新语句之前添加
SET NOCOUNT ON
帮助我避免了这个错误。yduiuuwa3#
我找到了这个主题,因为我遇到了类似的错误。我在Windows 10上使用Access 365 VBA 32位。下面是我的代码片段(省略了一些细节):
我也遇到了与OP中相同的错误。在我的例子中,直到我包含了对名为
FailedImport
的布尔字段的更新,我才得到这个错误。我找到了从2008年到this forum post的方法,其中包含以下注解(格式化我的注解):有同样的错误,但有它的记录集,而不是数据控制。从另一个论坛,我了解到,如果你是使用静态光标的记录集,使用
adLockBatchOptimistic
而不是adLockOptimistic
解决了这个问题。所以,我改了这句台词:
rs.Open cmd, , adOpenDynamic, adLockOptimistic
转换为:
rs.Open cmd, , adOpenDynamic, adLockBatchOptimistic
而且我的代码又起作用了!希望这对以后的其他人有帮助!