使用 Delete 方法删除记录

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

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

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

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

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

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

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

  • adAffectCurrent 仅影响当前记录。

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

下列代码示例展示在调用 Delete 方法时指定 adAffectGroup。 此示例将一些记录添加到示例 Recordset 并更新数据库。 然后,它会使用 adFilterAffectedRecords 筛选枚举常量来筛选 Recordset,该常量只留下 Recordset 中显示的新添加的记录。 最后,它调用 Delete 方法,并指定应删除满足当前 筛选器 属性设置(新记录)的所有记录。

'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