Поделиться через


Удаление записей с помощью метода Delete

С помощью метода Delete помечает текущую запись или группу записей в объекте Recordset для удаления. Если объект Recordset не разрешает удаление записи, возникает ошибка. Если вы находитесь в режиме немедленного обновления, удаление происходит в базе данных немедленно. Если запись не может быть успешно удалена (например, из-за нарушений целостности базы данных), она останется в режиме редактирования после вызова update. Это означает, что необходимо отменить обновление с помощью CancelUpdate перед удалением текущей записи (например, с помощью команды Close, Move или NextRecordset).

Если вы находитесь в режиме пакетного обновления, записи помечаются для удаления из кэша, а фактическое удаление происходит при вызове метода UpdateBatch . (Чтобы просмотреть удаленные записи, присвойте свойству Filter значение adFilterAffectedRecords после вызова delete .)

Попытка получить значения полей из удаленной записи приводит к ошибке. После удаления текущей записи удаленная запись остается текущей, пока вы не перейдете к другой записи. После удаления удаленной записи она становится недоступной.

При вложении удалений в транзакцию можно восстановить удаленные записи с помощью метода RollbackTrans . Если вы находитесь в режиме пакетного обновления, вы можете отменить ожидающее удаление или группу ожидающих удалений с помощью метода CancelBatch .

Если попытка удаления записей завершается сбоем из-за конфликта с базовыми данными (например, запись уже была удалена другим пользователем), поставщик возвращает предупреждения в коллекцию Errors , но не останавливает выполнение программы. Ошибка во время выполнения возникает только при наличии конфликтов во всех запрошенных записях.

Если задано динамическое свойство Unique Table и recordset является результатом выполнения операции JOIN для нескольких таблиц, метод Delete удаляет строки только из таблицы, указанной в свойстве Unique Table .

Метод Delete принимает необязательный аргумент, позволяющий указать, какие записи будут затронуты операцией Delete . Единственными допустимыми значениями для этого аргумента являются следующие константы перечисления ADO AffectEnum :

  • adAffectCurrent Влияет только на текущую запись.

  • adAffectGroup Влияет только на записи, удовлетворяющие текущему параметру свойства Filter . Чтобы использовать этот параметр, свойству Filter необходимо задать значение FilterGroupEnum или массив Закладок .

В следующем коде показан пример указания adAffectGroup при вызове метода Delete . Этот пример добавляет некоторые записи в образец Recordset и обновляет базу данных. Затем он фильтрует набор записей с помощью константы перечисления фильтра adFilterAffectedRecords , которая оставляет в наборе записей видимыми только новые записи. Наконец, он вызывает метод 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