您所看到的过滤和排序是 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 关键字必须始终位于顶层。尽管我不确定给出的示例是否准确,但我在上面发布的链接中也记录了这一点。