当我试图在两个记录集之间交换值时,遇到了一个奇怪的错误。问题的根源似乎来自这样一个事实:我交换的字段也是我最初查询的字段。
以下是更清楚地理解它的逻辑步骤:
-
将PhaseID等于X的所有记录存储到记录集A中
-
将PhaseID等于Y的所有记录存储到记录集B中
-
将记录集A中的所有记录设置为PhaseID等于Y
-
将记录集B中的所有记录设置为PhaseID等于X
以下是我的实际代码:
Private Sub swapReferences(firstRec() As Variant, secondRec() As Variant)
...
Set rstFirst = CurrentDb.OpenRecordset("Select * From Scenarios Where PhaseID = " & firstRec(0))
Set rstSecond = CurrentDb.OpenRecordset("Select * From Scenarios Where PhaseID = " & secondRec(0))
updateRecords rstFirst, "PhaseID", secondRec(0)
updateRecords rstSecond, "PhaseID", firstRec(0)
End Sub
Private Sub updateRecords(rst As Recordset, fieldName As String, newVal As Variant)
While Not rst.EOF
rst.Edit
rst(fieldName) = newVal
rst.update
rst.MoveNext
Wend
End Sub
奇怪的是,这段代码可能第一次就可以工作(因为值实际上是交换的)。但第二次,它几乎肯定会失败。所发生的情况是,不是交换行,而是其中一个记录集获得所有记录,而另一个记录集一个也没有。这就好像rstFirst更新其记录时,rstSecond会动态地变大,以获得rstSecond查询时使用的值。
更奇怪的是,我似乎找到了一个毫无意义的解决办法。我修改了第一个函数,如图所示:
Private Sub swapReferences(firstRec() As Variant, secondRec() As Variant)
Set rstFirst = CurrentDb.OpenRecordset("Select * From Scenarios Where PhaseID = " & firstRec(0))
Set rstSecond = CurrentDb.OpenRecordset("Select * From Scenarios Where PhaseID = " & secondRec(0))
'Debug
If Not rstSecond.EOF Then
'For whatever reason .RecordCount isn't accurate unless the last record has been accessed
rstSecond.MoveLast
Debug.Print rstSecond.RecordCount
rstSecond.MoveFirst
End If
updateRecords rstFirst, "PhaseID", secondRec(0)
'Debug
If Not rstSecond.EOF Then
rstSecond.MoveLast
Debug.Print rstSecond.RecordCount
rstSecond.MoveFirst
End If
updateRecords rstSecond, "PhaseID", firstRec(0)
End Sub
在rstFirst更新其记录后,这些if块被用来查看rstSecond是否在神奇地改变其大小。当我用这些调试块运行代码时,我发现不仅rstSecond保持不变,而且我的代码也按预期工作。
所以我的问题有两个:为什么添加这些调试块会修复我的代码?有没有更合适的方法来做我想做的事情,这样我的代码就不会显得那么荒谬了?