Какой самый эффективный способ доступа к отдельной записи в наборе записей ADO? - PullRequest
2 голосов
/ 25 июня 2010

Я хочу получить доступ к отдельным записям в классическом наборе записей ADO без перечисления по всему набору записей, используя .MoveNext.Я знаю об использовании AbsolutePosition, а также .Filter =.Какой лучший способ?

Я, вероятно, собираюсь получить доступ к набору записей несколько раз, извлекая отдельные записи, которые соответствуют списку записей в определенном поле.Например, у меня есть набор записей с записями, значения полей которых находятся в диапазоне от 1 до 100, у меня может быть отдельный массив, содержащий всего {34, 64, 72}, и я хочу сделать что-то только для записей в наборе записей, идентификаторы которых содержатся вмассив.

Ответы [ 4 ]

1 голос
/ 25 июня 2010

Если вы используете серверные курсоры, то лучший метод зависит от используемого вами поставщика OLE DB. Вполне возможно, что каждый доступ к записи может привести к очередной поездке на сервер для чтения данных.

Если вы можете использовать курсор на стороне клиента, то я подозреваю, что AbsolutePosition будет лучшим методом для повторного перехода к каждой записи. Я считаю, что использование фильтра с курсором на стороне клиента потребует, чтобы он вращался через каждую запись, соответствующую условию фильтра.

1 голос
/ 25 июня 2010

Я переписал свой ответ из-за новой информации, поэтому:

Мое предложение состоит в том, чтобы установить для свойства Filter то, что вам нужно, затем выполнить перечисление в результирующем подмножестве и присвоить значение Bookmark каждой записи в подмножестве переменной, которую можно легко сопоставить с идентификаторами ( поэтому вы можете поместить их в массив в том порядке, в котором их идентификаторы находятся в указанном вами массиве идентификаторов.

0 голосов
/ 26 июня 2010

Я пользуюсь этой функцией все время

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
0 голосов
/ 26 июня 2010

Используйте функцию Filter для объекта Recordset.

rs.Filter = "ID = '" & strID & "'"
...