使用 Delete 方法删除记录

使用 Delete 方法标记当前记录或 Recordset 对象中的一组记录,以便删除。 如果 Recordset 对象不允许删除记录,则会发生错误。 如果处于立即更新模式,则会立即在数据库中进行删除操作。 如果(由于数据库完整性冲突)而无法成功删除记录,则记录将在调用 Update 后保持编辑模式。这意味着,将当前记录移除前,必须使用 CancelUpdate 取消更新(例如,使用 CloseMoveNextRecordset)。

如果处于批量更新模式,则记录会被标记为要从缓存中删除,并在调用 UpdateBatch 方法时发生实际删除。 (若要查看已删除的记录,在调用 Delete 后,请将 Filter 属性设置为 adFilterAffectedRecords。)

尝试从已删除的记录中检索字段值会生成错误。 删除当前记录后,已删除的记录将保持当前状态,直到移动到其他记录。 从已删除的记录移开后,它将不再可访问。

如果将删除嵌套在事务中,则可以使用 RollbackTrans 方法恢复已删除的记录。 如果处于批量更新模式,可以使用 CancelBatch 方法取消一个或一组挂起的删除。

例如,如果由于与基础数据发生冲突(例如其他用户已删除记录),尝试删除记录失败,提供程序会向 Errors 集合返回警告,但不会停止程序执行。 仅当所有请求的记录发生冲突时,才会发生运行时错误。

如果设置了 Unique Table 动态属性,而 Recordset 是对多个表执行 JOIN 操作的结果,则 Delete 方法将仅从 Unique Table 属性中命名的表中删除行。

Delete 方法采用可选参数,用于指定哪些记录受 Delete 操作影响。 此参数的唯一有效值是以下 ADO AffectEnum 枚举常量之一:

  • adAffectCurrent 仅影响当前记录。

  • adAffectGroup 仅影响满足当前 Filter 属性设置的记录。 必须把 Filter 属性设置为 FilterGroupEnum 值或 Bookmarks 数组才能使用此选项。

以下代码演示了在调用 Delete 方法时指定 adAffectGroup 的示例。 本示例将一些记录添加到示例 Recordset 并更新数据库。 然后使用 adFilterAffectedRecords 筛选器枚举常量筛选 Recordset,该常量只保留 Recordset 可见的新添加记录。最后,它调用 Delete 方法,并删除所有满足当前 Filter 属性设置(新记录)的记录。

'BeginDeleteGroup  
    'add some bogus records  
    With objRs  
        For i = 0 To 8  
            .AddNew  
            .Fields("CompanyName") = "Shipper Number " & i + 1  
            .Fields("Phone") = "(425) 555-000" & (i + 1)  
            .Update  
        Next i  
  
        ' update  
        .UpdateBatch  
  
        'filter on newly added records  
        .Filter = adFilterAffectedRecords  
        Debug.Print "Deleting the " & .RecordCount & _  
                    " records you just added."  
  
        'delete the newly added bogus records  
        .Delete adAffectGroup  
        .Filter = adFilterNone  
        Debug.Print .RecordCount & " records remain."  
    End With  
'EndDeleteGroup