0

我有一个 access 2003 前端数据库,其表单允许用户查看某些数据的排序和/或过滤视图。数据显示在子窗体中。

将基本数据(在打开表单时加载)检索到断开连接的 ADODB.Recordset 对象(静态客户端光标)中。子窗体的 Recordset 属性设置为断开连接的记录集并显示所有记录。

仅对记录集对象应用排序(在代码中),然后将子表单设置为使用排序的记录集,以显示应用了正确排序的数据。filter 属性设置为 adFilterNone 以使其正常工作。显示所有记录(正确)。

仅将过滤器(在代码中)应用于记录集对象,然后将子表单设置为使用过滤后的记录集,从而显示应用了正确过滤器的数据。sort 属性设置为空字符串以使其正常工作。显示匹配过滤器的所有记录(正确)。

当排序属性和过滤器属性都设置在记录集上,然后该记录集设置为子窗体的记录集属性时,仅显示前 100 条匹配记录(不正确)。它们按排序顺序显示。底层记录集对象显示过滤记录的正确记录计数,它们只是不会全部显示在表单上。

有谁知道为什么会发生这种情况,除了每次使用新的 SQL 字符串创建记录集之外,是否还有其他方法可以解决这个问题?

提前致谢。

4

1 回答 1

1

您所看到的过滤和排序是 ADO 记录集的一个已知限制。

查看此页面上列出的 ADO Cons 列表。注意底部的那个: http ://www.utteraccess.com/wiki/index.php/Choosing_between_DAO_and_ADO

我在 MS 的支持网站上找不到任何关于此的文档,所以我不知道这是一个错误还是仅仅是一个限制。我假设是后者。

仅供参考,我认为 MS 基本上已经忘记了 ADO(经典)。MDAC 的最后一个版本(这是您获取 ADO 的方式)是 2005 年 5 月 10 日。

至于此问题的解决方法,您可以尝试使用此功能。它返回一个新的、过滤和排序的记录集。只需在手边保留一个完整的大记录集,并在每次进行排序/过滤时使用此功能获取一个新记录集。这确实会增加您的整体资源使用量,尤其是内存。

我已经使用了这个功能,但它还没有经过全面测试,以确保它在各个方面都是防弹的。您可能会很快发现它的一些错误或限制。实际上我有一个注释,它需要某种工作,但我的注释不清楚,我现在没有时间测试它,我确实发现我在我的生产代码中使用了这个函数,所以我认为它正在工作。

Public Function GetFilteredRecordset(ByRef rsSource As ADODb.Recordset, _
                                        ByVal sWhere As String, _
                                        Optional ByVal sOrderBy As String, _
                                        Optional ByVal LockType As ADODb.LockTypeEnum = adLockUnspecified) As ADODb.Recordset

    Dim sOriginalOrderBy As String
    sOriginalOrderBy = rsSource.Sort
    Dim F As ADODb.Field
    For Each F In rsSource.Fields
        'Debug.Print F.Name
    Next F

    rsSource.Filter = sWhere
    If sOrderBy <> "" Then
        If Left(LCase(sOrderBy), 8) = "order by" Then sOrderBy = Trim(Right(sOrderBy, Len(sOrderBy) - 8))
        rsSource.Sort = sOrderBy
    End If
    Dim rsF As ADODb.Recordset

    Dim objStream As ADODb.Stream
    'Create a New ADO 2.5 Stream object
    Set objStream = New ADODb.Stream
    'Save the Recordset to the Stream object in XML format
    rsSource.Save objStream, adPersistXML
    'Create an exact copy of the saved Recordset from the Stream Object
    Set rsF = New ADODb.Recordset
    rsF.Open objStream, , , LockType

    rsSource.Filter = ""
    rsSource.Sort = sOriginalOrderBy
    'Close and de-reference the Stream object
    objStream.Close
    Set objStream = Nothing
    Set GetFilteredRecordset = rsF
End Function

过滤 ADO 记录集的另一个奇怪限制是您的 OR 关键字必须始终位于顶层。尽管我不确定给出的示例是否准确,但我在上面发布的链接中也记录了这一点。

于 2012-08-17T20:03:14.700 回答