【发布时间】:2022-12-15 13:48:05
【问题描述】:
我正在维护在 Windows 10 和 11 上使用 Access 365 运行时(32 位)的设备上运行的 Access 365 数据库(32 位)。后端使用 Microsoft SQL Server Express(64 位)版本 15.0.4198.2 , 在 AWS RDS 上。对于一个功能,该代码使用 ADODB 2.8(VBA 参考是Microsoft ActiveX Data Objects 2.8 Library)打开一个记录集,连接到一个表,并修改一些字段。
在我包含一行代码将 boolean 字段从 true 切换到 false 之前,代码工作得很好。进行此更改后,代码将抛出错误 #-2147217864,描述为 Row cannot be located for updating. Some values may have been changed since it was last read.。我将代码隔离到单元测试并确保没有其他代码行更改记录集,但代码仍然抛出错误。
这是单元测试,其中显示了一些辅助函数,但未包含在内:
Private Sub TestRelistingDataChangeProcess()
On Error GoTo TestFail
Dim itemSku As String
itemSku = "1234"
Dim verifySql As String
verifySql = StrFormat("SELECT failedImport FROM dbo.myTable WHERE SKU = '{0}'", itemSku)
Dim rsSql As String
rsSql = StrFormat("UPDATE dbo.myTable SET failedImport = 0 WHERE SKU = '{1}'", itemSku)
ExecuteCommandPassThrough rsSql
rsSql = "PARAMETERS SKU Text ( 255 ); SELECT * FROM myTable WHERE SKU=[SKU]"
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
cmd.ActiveConnection = GetCurrentConnection()
cmd.CommandText = rsSql
Dim param As ADODB.Parameter
Set param = cmd.CreateParameter(Name:="[SKU]", Type:=adLongVarChar, Value:=itemSku, Size:=Len(itemSku))
cmd.Parameters.Append param
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open cmd, , adOpenDynamic, adLockOptimistic
With rs
Debug.Print "1. Setting field to TRUE."
.Fields("failedImport") = True
.Update
Assert.IsTrue ExecuteScalarAsPassThrough(verifySql)
Debug.Print "2. Setting field to FALSE."
.Fields("failedImport") = False
.Update
Assert.IsFalse ExecuteScalarAsPassThrough(verifySql)
End With
Assert.Succeed
TestExit:
Exit Sub
TestFail:
Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description
Resume TestExit
End Sub
搜索有关此错误的信息导致许多可能性,并不是所有的都在 VBA 中。我知道带有可为空布尔字段的 Access 和 SQL Server 表存在问题,因此我验证了 SQL Server 表具有该字段的默认值。打开记录集时,我尝试了许多 CursorType 和 LockType 组合。没有工作。
我做错了什么导致抛出这个错误?我该怎么做才能更改代码以使其正常工作?
【问题讨论】:
标签: sql-server vba ms-access adodb