Eliminazione di record con il metodo Delete

L'uso del metodo Delete contrassegna il record corrente o un gruppo di record in un oggetto Recordset per l'eliminazione. Se l'oggetto Recordset non consente l'eliminazione di record, si verifica un errore. Se si è in modalità di aggiornamento immediato, le eliminazioni vengono eseguite immediatamente nel database. Se un record non può essere eliminato correttamente, ad esempio a causa di violazioni di integrità del database, il record rimarrà in modalità di modifica dopo la chiamata a Update. Ciò significa che è necessario annullare l'aggiornamento usando CancelUpdate prima di uscire dal record corrente, ad esempio usando Close, Moveo NextRecordset.

Se si è in modalità di aggiornamento batch, i record vengono contrassegnati per l'eliminazione dalla cache e l'eliminazione effettiva avviene quando si chiama il metodo UpdateBatch. Per visualizzare i record eliminati, impostare la proprietà Filter su adFilterAffectedRecords dopo la chiamata a Delete.

Il tentativo di recuperare i valori dei campi dal record eliminato genera un errore. Dopo l'eliminazione del record corrente, il record eliminato rimane corrente fino a quando non si passa a un record diverso. Una volta eliminato, il record eliminato non sarà più accessibile.

Se si annidare le eliminazioni in una transazione, è possibile recuperare i record eliminati usando il metodo RollbackTrans. Se si è in modalità di aggiornamento batch, è possibile annullare un'eliminazione in sospeso o un gruppo di eliminazioni in sospeso usando il metodo CancelBatch.

Se il tentativo di eliminazione dei record ha esito negativo a causa di un conflitto con i dati sottostanti (ad esempio, un record è già stato eliminato da un altro utente), il provider restituisce avvisi alla raccolta Errors, ma non interrompe l'esecuzione del programma. Si verifica un errore di run-time solo in caso di conflitti in tutti i record richiesti.

Se la proprietà dinamica Unique Table è impostata e il recordset è il risultato dell'esecuzione di un'operazione JOIN su più tabelle, il metodo Delete eliminerà le righe solo dalla tabella denominata nella proprietà Unique Table.

Il metodo Delete accetta un argomento facoltativo che consente di specificare quali record sono interessati dall'operazione Delete. Gli unici valori validi per questo argomento sono una delle costanti enumerate ADO AffectEnum seguenti:

  • adAffectCurrent Influisce solo sul record corrente.

  • adAffectGroup Influisce solo sui record che soddisfano l'impostazione corrente della proprietà Filter. Per usare questa opzione, la proprietà Filter deve essere impostata su un valore FilterGroupEnum o su una matrice di segnalibri.

Il codice seguente illustra un esempio di specifica di adAffectGroup quando si chiama il metodo Delete. In questo esempio vengono aggiunti alcuni record al recordset di esempio e viene aggiornato il database . Filtra quindi il recordset usando la costante enumerata del filtro adFilterAffectedRecords, che lascia visibili solo i record appena aggiunti nel recordset. Infine, chiama il metodo Delete e specifica che tutti i record che soddisfano l'impostazione corrente della proprietà Filter (i nuovi record) devono essere eliminati.

'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