【问题标题】:Most efficient way to find record in ADO Recordset with multiple criteria? (VB6)在具有多个条件的 ADO 记录集中查找记录的最有效方法? (VB6)
【发布时间】:2018-02-07 22:52:06
【问题描述】:

我正在为我们的旧程序将一些旧的旧 Access 代码转换为 SQL,在该程序中,我们根据数千条记录的数据创建报告。我们使用多个记录集来访问不同的记录/表格。以前(在访问中),我们使用 Recordset.Seek 函数在记录集中找到了所需的记录。这样做可以在几秒钟内获得我们想要的数据。

在使用 ADO 记录集而不是 DAO 将其转换为使用 SQL 时,我发现大多数人建议使用将返回所需记录的查询简单地将记录集设置为等于新记录集。到目前为止,这是最有效的方法,但这仍然需要长达 2 分钟才能获得与访问需要几秒钟的相同数据。

我看到 ADO 记录集也有一个 .seek 函数,但是我在尝试实现它来比较速度/准确性时遇到了麻烦。如果这是更好的方法,我如何创建/设置记录集的索引,以及如何知道索引的名称?

谢谢!

【问题讨论】:

  • “数千条记录的数据”并不可怕。
  • 为什么不使用where子句而不是拉取所有数据然后过滤呢?
  • @sean-lange,我正在使用 where 子句。我遇到的问题是,我必须根据“主要”记录集中的记录在三个不同的记录集中获取特定记录,其中包含我用来查找这些其他记录的数据。现在,我必须使用 where 子句打开一个新记录集,该子句在我正在使用的示例中为 7k+ 条记录指定我要查找 3 次的记录,这需要相当多的时间。 Recordset.Find 和 Filter 更慢。
  • 灯泡亮了!你说SQL,但你的意思是SQL Server——两个完全不同的东西。
  • 没有具体细节很难说,但我感觉您需要的是一个涉及JOIN 或其他内容的更复杂的查询。

标签: sql-server vb6


【解决方案1】:

您只能将Seek 与来自 JET OLEDB 提供程序的服务器端记录集一起使用。您可以测试Seek 是否在具有rs.Supports(adSeek) 之类的记录集上可用。

我通常对客户端记录集所做的是使用如下函数“手动”构建内存索引:

Public Function InitIndexCollection( _
            rs As Recordset, _
            sFld As String, _
            Optional Fld2 As String, _
            Optional Fld3 As String, _
            Optional ByVal HasDuplicates As Boolean, _
            Optional RetVal As Collection) As Collection
    Const FUNC_NAME     As String = "InitIndexCollection"
    Dim oFld            As ADODB.Field
    Dim oFld2           As ADODB.Field
    Dim oFld3           As ADODB.Field
    Dim vBmk            As Variant
    Dim pCol            As Collection '-- IVbCollection that doesn't raise duplicate error on Add

    Set RetVal = New Collection
    With rs
        If .RecordCount > 0 Then
            On Error Resume Next
            vBmk = rs.Bookmark
            On Error GoTo 0
            .MoveFirst
            Set oFld = .Fields(sFld)
            If LenB(Fld2) <> 0 Then
                Set oFld2 = .Fields(Fld2)
            End If
            If LenB(Fld3) <> 0 Then
                Set oFld3 = .Fields(Fld3)
            End If
            If HasDuplicates Then
                On Error Resume Next
                Set pCol = RetVal
                If oFld2 Is Nothing Then
                    Do
                        pCol.Add .Bookmark, CStr(oFld.Value)
                        .MoveNext
                    Loop While Not .EOF
                ElseIf oFld3 Is Nothing Then
                    Do
                        pCol.Add .Bookmark, CStr(oFld.Value) & "#" & CStr(oFld2.Value)
                        .MoveNext
                    Loop While Not .EOF
                Else
                    Do
                        pCol.Add .Bookmark, CStr(oFld.Value) & "#" & CStr(oFld2.Value) & "#" & CStr(oFld3.Value)
                        .MoveNext
                    Loop While Not .EOF
                End If
                On Error GoTo 0
            Else
                If oFld2 Is Nothing Then
                    Do
                        RetVal.Add .Bookmark, CStr(oFld.Value)
                        .MoveNext
                    Loop While Not .EOF
                ElseIf oFld3 Is Nothing Then
                    Do
                        RetVal.Add .Bookmark, CStr(oFld.Value) & "#" & CStr(oFld2.Value)
                        .MoveNext
                    Loop While Not .EOF
                Else
                    Do
                        RetVal.Add .Bookmark, CStr(oFld.Value) & "#" & CStr(oFld2.Value) & "#" & CStr(oFld3.Value)
                        .MoveNext
                    Loop While Not .EOF
                End If
            End If
            If Not IsEmpty(vBmk) Then
                .Bookmark = vBmk
            End If
        End If
    End With
    Set InitIndexCollection = RetVal
End Function

然后你可以像这样快速搜索Bookmark属性

Dim rsItems         As Recordset
Dim cIndex          As Collection

Set cIndex = InitIndexCollection(rsItems, "Code")
...
'--- loop on other rs'
Do While Not rs.EOF
    ...
    rsItems.Bookmark = cIndex(rs!ItemCode.Value) '--- this is seek'
    ...
    rs.MoveNext
Loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多