Filter 属性

指示 记录集中的数据筛选器。

设置和返回值

设置或返回一个 Variant 值,该值可以包含以下项之一:

  • 条件字符串: 由与 ANDOR 运算符串联的一个或多个单独子句组成的字符串。

  • 书签数组: 指向 记录集 对象中记录的唯一书签值的数组。

  • FilterGroupEnum 值。

言论

使用 Filter 属性有选择地筛选出 Recordset 对象中的记录。 筛选 记录集 将成为当前游标。 返回基于当前 游标 的值的其他属性会受到影响,例如 AbsolutePosition 属性(ADO)AbsolutePage 属性(ADO)RecordCount 属性(ADO)PageCount 属性(ADO)。 将 Filter 属性设置为特定的新值会将当前记录移动到满足新值的第一条记录。

条件字符串由 fieldName-Operator-Value 形式的子句组成(例如,"LastName = 'Smith'")。 可以通过将单个子句与 AND(例如,"LastName = 'Smith' AND FirstName = 'John'")或 OR(例如,"LastName = 'Smith' OR LastName = 'Jones'")连接在一起来创建复合子句。 对于条件字符串,请使用以下准则:

  • FieldName 必须是来自 Recordset的有效字段名称。 如果字段名称包含空格,则必须将名称括在方括号中。

  • 运算符必须是下列项之一:<、>、<=、>=、<>、=或 LIKE

  • 值是用于比较字段值的值(例如,“Smith”、#8/24/95#、12.345 或 $50.00)。 将单引号与字符串和磅号(#)与日期一起使用。 对于数字,可以使用小数点、美元符号和科学表示法。 如果运算符 LIKE,则值可以使用通配符。 只允许星号和百分比符号(%)通配符,并且它们必须是字符串中的最后一个字符。 值不能为 null。

注意

若要在筛选器值中包含单引号('),请使用两个单引号来表示一个引号。 例如,若要筛选 O'Malley,条件字符串应 "col1 = 'O''Malley'"。 若要在筛选器值的开头和末尾包含单引号,请将字符串用磅号(#)括起来。 例如,若要筛选“1”,条件字符串应 "col1 = #'1'#"

  • AND 和 OR 之间没有优先级。 子句可以在括号内分组。 但是,不能将 OR 联接的子句分组,然后使用 AND 将组联接到另一个子句,如以下代码片段所示:
    (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

  • 而是将此筛选器构造为
    (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

  • LIKE 子句中,可以在模式的开头和结尾使用通配符。 例如,可以使用 LastName Like '*mit*'。 或者,如果 LIKE,则只能在模式末尾使用通配符。 例如,LastName Like 'Smit*'

筛选器常量使在批处理更新模式下更轻松地解决单个记录冲突,例如,仅查看在上次 UpdateBatch 方法 方法调用期间受影响的记录。

设置 Filter 属性本身可能会因与基础数据冲突而失败。 例如,当记录已被其他用户删除时,可能会发生此失败。 在这种情况下,提供程序向 Errors 集合(ADO) 集合返回警告,但不会停止程序执行。 仅当所有请求的记录发生冲突时,运行时才会发生错误。 使用 Status 属性 (ADO Recordset) 属性查找有冲突的记录。

Filter 属性设置为零长度字符串 (“”) 的效果与使用 adFilterNone 常量的效果相同。

每当设置 Filter 属性时,当前记录位置将移动到 Recordset中筛选的记录子集中的第一条记录。 同样,当清除 Filter 属性时,当前记录位置将移动到 Recordset中的第一条记录。

假设 记录集 根据某些变体类型的字段进行筛选,例如类型sql_variant。 条件字符串中使用的字段和筛选值的子类型不匹配时,将发生错误(DISP_E_TYPEMISMATCH或80020005)。 例如,假设:

  • Recordset 对象(rs)包含sql_variant类型的列(C)。
  • 此列的字段已分配 I4 类型的值 1。 条件字符串设置为字段上的 rs.Filter = "C='A'"

此配置在运行时生成错误。 但是,应用于同一字段的 rs.Filter = "C=2" 不会产生任何错误。 字段被筛选出当前记录集。

有关书签值的说明,请参阅 Bookmark 属性(ADO) 属性,以便从中生成要与 Filter 属性一起使用的数组。

只有条件字符串形式的筛选器会影响持久化 记录集的内容。 条件字符串的示例是 OrderDate > '12/31/1999'。 使用书签数组创建的筛选器,或使用来自 FilterGroupEnum的值,不会影响持久化 Recordset的内容。 这些规则适用于使用客户端或服务器端游标创建的记录集。

注意

在批处理更新模式下将 adFilterPendingRecords 标志应用于筛选和修改的 Recordset 时,如果筛选基于单键表的键字段,并且对键字段值进行了修改,则结果 Recordset 为空。 如果下列语句之一为 true,则结果 Recordset 将为非空:

  • 筛选基于单键表中的非键字段。

  • 筛选基于多键表中的任何字段。

  • 对单键表中的非键字段进行了修改。

  • 对多键表中的任何字段进行了修改。

下表汇总了 adFilterPendingRecords 筛选和修改的不同组合的效果。 左列显示可能的修改。 可以在任何非键式字段、单键表中的键字段或多键表的任何键字段上进行修改。 顶部行显示筛选条件。 筛选可以基于任何非键化字段、单键表中的键字段或多键表中的任何键字段。 相交单元格显示结果。 + 加号意味着 应用 adFilterPendingRecords 会导致非空 Recordset- 减号表示空 Recordset

组合 非键 单个键 多个密钥
非密钥 + + +
单键 + -
多个密钥 + +

适用于

Recordset 对象 (ADO)

另请参阅

Filter 和 RecordCount 属性示例 (VB)Filter 和 RecordCount 属性示例 (VC++)Clear 方法 (ADO)Optimize Property-Dynamic (ADO)