访问ADO记录集中的单个记录的最有效方法是什么?

时间:2010-06-25 17:52:56

标签: performance vb6 ado recordset

我想访问经典ADO记录集中的各个记录,而不使用.MoveNext枚举整个记录集。我知道使用AbsolutePosition以及.Filter =。什么是最好的方式?

我可能会多次访问记录集,提取与特定字段中的记录列表匹配的单个记录。例如,我有一个记录集,其记录的字段值从1到100,我可能有一个单独的数组只包含{34, 64, 72},我想只对记录集中包含ID的记录做些什么在阵列中。

4 个答案:

答案 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