【问题标题】:Message reason why Execute method failedExecute 方法失败的消息原因
【发布时间】:2010-06-09 08:59:12
【问题描述】:

我使用 DAO 方法 Execute 删除一些记录。如果失败,请通过检查 RecordsAffected(它将为 0)来明确这一点。但是是否有可能获得错误消息(例如,记录或显示给用户)?我尝试在表格网格中手动删除记录我得到一个清晰的对话框消息,例如"该记录无法删除或更改,因为表 x 包含相关记录"。

【问题讨论】:

    标签: ms-access ms-access-2007 dao


    【解决方案1】:

    在 Execute 方法中包含 dbFailOnError 选项以捕获您的 DELETE 错误。如果没有 dbFailOnError,您的 DELETE 可能会静默失败。

    依赖 RecordsAffected 来指示 DELETE 失败可能会产生误导。例如,如果您的 DELETE 包含“WHERE Sample=5”,并且没有 Sample 值为 5 的行,则 RecordsAffected 将为 0。这不是数据库引擎的错误。

    在以下示例中,DELETE 失败是因为在 tblParent 和 tblChild 之间存在强制引用完整性的关系。因此消息框显示“无法删除或更改记录,因为表'tblChild'包含相关记录”。

    Public Sub DeleteFailure()
        Dim strSql As String
        Dim strMsg As String
        Dim db As DAO.Database
    
    On Error GoTo ErrorHandler
    
        strSql = "DELETE FROM tblParent WHERE id = 1;"
        Set db = CurrentDb
        db.Execute strSql, dbFailOnError
    
    ExitHere:
        On Error GoTo 0
        Debug.Print "RecordsAffected: " & db.RecordsAffected
        Set db = Nothing
        Exit Sub
    
    ErrorHandler:
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure DeleteFailure"
        MsgBox strMsg
        GoTo ExitHere
    End Sub
    

    更新:这是一个经过修订的 ErrorHandler,以适应由 DAO 操作触发的多个错误。

    ErrorHandler:
        Dim errLoop As Error
        Debug.Print "Errors.Count: " & Errors.Count
        For Each errLoop In Errors
            With errLoop
                strMsg = "Error " & Err.Number & " (" & _
                    Err.Description & _
                    ") in procedure DeleteFailure"
            End With
            MsgBox strMsg
        Next
        Set errLoop = Nothing
        GoTo ExitHere
    

    【讨论】:

    • DBEngine 的错误收集可能有点复杂,如我发布的链接中所述。您可能需要遍历集合才能获得完整的消息。
    • 我对此有点困惑:“如果使用 dbFailOnError 执行的语句的一部分失败,则整个语句将回滚。为了提高性能,从 3.5 版本开始删除了这些隐式事务。如果您正在更新旧的 DAO 代码,请务必考虑在 Execute 语句周围使用显式事务。” (msdn.microsoft.com/en-us/library/bb243015%28v=office.12%29.aspx) 但它是关于交易的。我仍然可以使用 dbFailOnError,但自己做事务(BeginTrans/Commit)
    • HansUp> 谢谢。如果不需要删除记录,Sure RecordsAffected 返回 0。为此,我首先检查是否需要删除记录,否则我不调用 Execute 方法
    • Remou> HansUp 示例中的 Err.Description 对我来说效果很好,我收到与 Table datagrid 删除操作相同的消息
    • @waanders 如果在事务正在进行时使用 Execute 和 dbFailOnError 捕获错误,则可以回滚事务。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 2020-06-10
      相关资源
      最近更新 更多