【问题标题】:Currentdb.Execute with dbFailonError not throwing an errorCurrentdb.Execute 与 dbFailonError 不引发错误
【发布时间】:2020-10-05 22:00:25
【问题描述】:

在 Access 2003-2016 中,我使用 CurrentDb.Execute 和 dbFailonError 来运行 INSERT 语句。 INSERT 语句应该失败(确实如此),因为基于具有“强制引用完整性”的相关表,一个字段的值不正确。但是,它不会引发错误。我已尝试在新数据库中重新创建此问题,并且该错误正常工作。我当前数据库的设置有问题,我不想从头开始重新创建它。除了有问题的部分和我的minimal reproducible example database is at this link 之外,我已经从我的数据库中删除了所有内容。

这是我的代码,但问题是,当我从头开始创建新数据库时,此代码工作正常并且会引发错误。它只是在我当前的数据库中不起作用。

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

【问题讨论】:

  • 你在任何地方使用过DoCmd.SetWarnings = False吗? stackoverflow.com/questions/13943753/…
  • Option Explicit 添加到表单代码模块的声明部分并从VB 编辑器的主菜单运行调试->编译。然后会发生什么?

标签: ms-access sql-insert


【解决方案1】:

使用Option Explicit,就像汉斯说的那样。始终使用Option Explicit

您缺少对 Microsoft Office ##.# Access Database Engine 对象的引用。这是定义dbFailOnError 的地方。因为你没有那个参考,dbFailOnError 没有定义。此引用默认添加到所有 Access 数据库中,我强烈建议添加它。

由于您没有使用Option Explicit,VBA 不介意它是未定义的,只是将未定义的变量强制转换为零。

如果由于某种原因不想添加引用,请使用corresponding value 代替dbFailOnError

.Execute testsql, 128

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多