Currentdb.Execute con dbFailonError che non genera un errore

Oct 06 2020

In Access 2003-2016, sto usando CurrentDb.Execute con dbFailonError per eseguire un'istruzione INSERT. L'istruzione INSERT dovrebbe fallire (e lo fa) perché un campo ha un valore errato basato su una tabella correlata con "Integrità referenziale applicata". Tuttavia, non genera un errore. Ho provato a ricreare questo problema in un nuovo database e l'errore funziona correttamente. C'è qualcosa di sbagliato nelle impostazioni con il mio database corrente e non voglio ricrearlo da zero. Ho tolto tutto dal mio database tranne il pezzo problematico, e il mio database di esempio riproducibile minimo si trova a questo collegamento .

Ecco il mio codice, ma il problema è che questo codice funziona bene e genera errori quando creo un nuovo database da zero. Semplicemente non funziona nel mio database attuale.

Private Sub Command34_Click()
    Dim testsql As String

    testsql = "INSERT INTO tblObservations (Site,TotalDepth) VALUES ('SUD-096',5)"
    With CurrentDb
        On Error GoTo Err_Execute
        .Execute testsql, dbFailOnError
        On Error GoTo 0
        MsgBox ("Upload completed.  " & .RecordsAffected & " records added.")
    End With
    Exit Sub
    
Finish:
    Exit Sub
    
Err_Execute:
    If DBEngine.Errors.Count > 0 Then
        For Each errLoop In DBEngine.Errors
            MsgBox ("Error number: " & errLoop.Number & vbCr & errLoop.Description)
        Next errLoop
    End If
    Resume Finish

End Sub

Risposte

1 ErikA Oct 06 2020 at 16:31

Usa Option Explicit, come ha detto Hans. Usa sempre Option Explicit!

Manca un riferimento all'oggetto Motore di database di Microsoft Office ##. # Access. Questo è dove dbFailOnErrorè definito. Perché non hai quel riferimento, dbFailOnErrornon è definito. Questo riferimento viene aggiunto a tutti i database di Access per impostazione predefinita e consiglio vivamente di aggiungerlo.

E poiché non stai utilizzando Option Explicit, VBA non si preoccupa che sia indefinito e lancia quella variabile indefinita a zero.

Se, per qualche motivo, non desideri aggiungere il riferimento, utilizza il valore corrispondente per dbFailOnError:

.Execute testsql, 128