Currentdb.Execute с dbFailonError не выдает ошибку

Oct 06 2020

В Access 2003-2016 я использую CurrentDb.Execute с dbFailonError для выполнения инструкции INSERT. Оператор INSERT должен завершиться ошибкой (и это произойдет), потому что одно поле имеет неправильное значение на основе связанной таблицы с «принудительной ссылочной целостностью». Однако это не вызывает ошибки. Я попытался воссоздать эту проблему в новой базе данных, и ошибка работает правильно. Что-то не так в настройках моей текущей базы данных, и я не хочу воссоздавать ее с нуля. Я взял все из своей базы данных, кроме проблемной части, и моя минимальная воспроизводимая база данных примеров находится по этой ссылке .

Вот мой код, но проблема в том, что этот код работает нормально и выдает ошибки, когда я создаю новую базу данных с нуля. Это просто не работает в моей текущей базе данных.

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

Ответы

1 ErikA Oct 06 2020 at 16:31

Используйте Option Explicit, как сказал Ганс. Всегда используйте Option Explicit!

Вам не хватает ссылки на объект Microsoft Office ##. # Access Database Engine. Вот где dbFailOnErrorопределяется. Поскольку у вас нет этой ссылки, dbFailOnErrorне определено. Эта ссылка добавляется ко всем базам данных Access по умолчанию, и я настоятельно рекомендую добавить ее.

И поскольку вы не используете его Option Explicit, VBA не возражает против того, что он не определен, и просто приводит эту неопределенную переменную к нулю.

Если по какой-то причине вы не хотите добавлять ссылку, используйте соответствующее значение для dbFailOnError:

.Execute testsql, 128