我想访问经典ADO记录集中的各个记录,而不使用.MoveNext
枚举整个记录集。我知道使用AbsolutePosition
以及.Filter =
。什么是最好的方式?
我可能会多次访问记录集,提取与特定字段中的记录列表匹配的单个记录。例如,我有一个记录集,其记录的字段值从1到100,我可能有一个单独的数组只包含{34, 64, 72}
,我想只对记录集中包含ID的记录做些什么在阵列中。
答案 0 :(得分:1)
由于新信息,我最终重写了我的答案,所以:
我的建议是将Filter
属性设置为您想要的属性,然后枚举生成的子集,并将子集中每条记录的Bookmark
值分配给您可以轻松匹配的变量使用ID(所以你可能希望按照你提到的ID数组的顺序将它们放在一个数组中。)
答案 1 :(得分:1)
如果您使用的是服务器端游标,那么最佳方法取决于您使用的基础OLE DB提供程序。很有可能每次访问记录都会导致另一次访问服务器以读取数据。
如果你可以使用客户端游标,那么我怀疑AbsolutePosition将是重复移动到每个记录的最佳方法。我相信使用带有客户端游标的过滤器会要求它旋转每个匹配过滤条件的记录。
答案 2 :(得分:0)
使用Recordset对象上的Filter函数。
rs.Filter = "ID = '" & strID & "'"
答案 3 :(得分:0)
我一直在使用这个功能
Public Function InitIndexCollection( _
rs As Recordset, _
sFld As String, _
Optional sFld2 As String, _
Optional sFld3 As String, _
Optional ByVal HasDuplicates As Boolean) As Collection
Const FUNC_NAME As String = "InitIndexCollection"
Dim oFld As ADODB.Field
Dim oFld2 As ADODB.Field
Dim oFld3 As ADODB.Field
On Error GoTo EH
Set InitIndexCollection = New Collection
If Not IsRecordsetEmpty(rs) Then
Set oFld = rs.Fields(sFld)
If LenB(sFld2) <> 0 Then
Set oFld2 = rs.Fields(sFld2)
End If
If LenB(sFld3) <> 0 Then
Set oFld3 = rs.Fields(sFld3)
End If
If HasDuplicates Then
On Error Resume Next
End If
With rs
If oFld2 Is Nothing Then
.MoveFirst
Do While Not .EOF
InitIndexCollection.Add .Bookmark, C_Str(oFld.Value)
.MoveNext
Loop
ElseIf oFld3 Is Nothing Then
.MoveFirst
Do While Not .EOF
InitIndexCollection.Add .Bookmark, C_Str(oFld.Value) & "#" & C_Str(oFld2.Value)
.MoveNext
Loop
Else
.MoveFirst
Do While Not .EOF
InitIndexCollection.Add .Bookmark, C_Str(oFld.Value) & "#" & C_Str(oFld2.Value) & "#" & C_Str(oFld3.Value)
.MoveNext
Loop
End If
End With
End If
Exit Function
EH:
RaiseError FUNC_NAME
Resume Next
End Function