为什么数据表视图在基于已排序和过滤的adodb记录集时仅显示100条记录

时间:2012-08-15 23:42:09

标签: ms-access adodb

我有一个Access 2003前端数据库,其表单允许用户查看某些数据的已排序和/或过滤视图。数据以子表格形式显示。

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

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

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

当在记录集上设置sort属性和filter属性,然后将该记录集设置为子表单的Recordset属性时,仅显示前100个匹配记录(不正确)。它们按排序顺序显示。基础记录集对象显示已过滤记录的正确记录计数,它们不会全部显示在表单上。

有没有人知道为什么会这样,除了每次使用新的SQL字符串创建记录集之外还有办法解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您在过滤和排序方面看到的是ADO记录集的已知限制。

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

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

仅供参考,我认为MS基本上已经忘记了ADO(经典)。 MDAC的最后一个版本(这是你如何获得ADO)是5/10/2005。

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

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

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关键字必须始终位于顶层。这也记录在我上面发布的链接中,虽然我不确定给出的例子是否准确。