Currentdb.Execute z dbFailonError nie zgłasza błędu

Oct 06 2020

W programie Access 2003-2016 używam CurrentDb.Execute z dbFailonError do uruchomienia instrukcji INSERT. Instrukcja INSERT powinna zakończyć się niepowodzeniem (i tak się dzieje), ponieważ jedno pole ma niepoprawną wartość opartą na powiązanej tabeli z wymuszoną integralnością referencyjną. Jednak nie zgłasza błędu. Próbowałem odtworzyć ten problem w nowej bazie danych i błąd działa poprawnie. Coś jest nie tak w ustawieniach mojej aktualnej bazy danych i nie chcę tworzyć jej od nowa. Usunąłem wszystko z mojej bazy danych z wyjątkiem problematycznego fragmentu, a moja minimalna powtarzalna przykładowa baza danych znajduje się pod tym linkiem .

Oto mój kod, ale problem polega na tym, że ten kod działa dobrze i generuje błędy, gdy tworzę nową bazę danych od podstaw. Po prostu nie działa w mojej obecnej bazie danych.

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

Odpowiedzi

1 ErikA Oct 06 2020 at 16:31

Użyj Option Explicit, jak powiedział Hans. Zawsze używaj Option Explicit!

Brakuje odniesienia do obiektu Microsoft Office ##. # Access Database Engine. To jest, gdzie dbFailOnErrorjest zdefiniowane. Ponieważ nie masz tego odniesienia, dbFailOnErrornie jest zdefiniowane. To odwołanie jest domyślnie dodawane do wszystkich baz danych programu Access i zdecydowanie zalecam dodanie go.

A ponieważ nie używasz Option Explicit, VBA nie ma nic przeciwko temu, że jest niezdefiniowana i po prostu rzutuje tę niezdefiniowaną zmienną na zero.

Jeśli z jakiegoś powodu nie chcesz dodawać odwołania, użyj odpowiedniej wartości dla dbFailOnError:

.Execute testsql, 128