当错误再次出现时错误处理不起作用

当错误再次出现时错误处理不起作用

本文介绍了当错误再次出现时错误处理不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

逻辑:

  • 用户.按下按钮;
  • 代码.创建一个记录集"rstStud"(学生)和rstGroupStud"(学生组);
  • 代码.循环.枚举rstStud";
    • 代码.添加条目到rstGroupStud";
    • 代码.如果该记录存​​在,则转到循环中的下一条记录;
    • 代码.如果条目是新条目,则在rstGroupStud"中添加条目;
      本质:一键点击 - 添加一个独特的条目.

    问题.
    当循环过去!StudentName = "Student Name 2" 在.Update"行中出现错误.
    错误:
    "由于重复值导致更改失败索引、主键或关系.一改数据或包含重复值的多个字段删除索引或通过允许覆盖它重复值并重试.

    换句话说,错误处理程序第一次正常工作,当我重新触发时,我得到一个错误.

    In other words, the first time the error handler works normally, and when I re-fire, I get an error.

    问题.
    如何让代码按照描述的逻辑运行?

    Question.
    How to make the code work according to the described logic?

    Private Sub btnAddRecord_Click()
        Dim nameStud As String
    
        Dim rstStud As DAO.Recordset   '
        Dim rstGroupStud As DAO.Recordset '
    
        Set rstStud = CurrentDb.OpenRecordset("tbl_02_Students", dbOpenSnapshot)  '
        Set rstGroupStud = CurrentDb.OpenRecordset("tbl_03_GruopsStudents", dbOpenDynaset)  '
    
        ' *** rstStud
        With rstStud
            Do Until .EOF = True
                nameStud = !nameStud
    
                On Error GoTo errend
                ' *** rstGroupStud
                With rstGroupStud
                    .AddNew
    
                    !idGroup = Me.id_GroupFrm
                    !nameStud = nameStud
                    ' nameStud
                    .Update
                End With
                rstGroupStud.Close
                Me.frm_03_GruopsStudents_tbl.Requery
    
                Exit Sub
    errend:
                .MoveNext
            Loop
        End With
    
        On Error Resume Next
        rstStud.Close
        Set rstStud = Nothing
    End Sub
    

    更新_1
    文件 - 链接

    推荐答案

    你需要解开执行路径;正常和错误执行状态是交织在一起的,这就是为什么不能处理超出第一个错误的任何错误.

    You need to de-tangle the execution paths; normal and error execution states are intertwined, that's why any error beyond the first one can't be handled.

    Private Sub btnAddRecord_Click()
        Dim nameStud As String
    
        Dim rstStud As DAO.Recordset   '
        Dim rstGroupStud As DAO.Recordset '
    
        Set rstStud = CurrentDb.OpenRecordset("tbl_02_Students", dbOpenSnapshot)  '
        Set rstGroupStud = CurrentDb.OpenRecordset("tbl_03_GruopsStudents", dbOpenDynaset)  '
    
        ' *** rstStud
        With rstStud
            Do Until .EOF = True
                On Error GoTo ErrHandler
                nameStud = !nameStud
    
                ' *** rstGroupStud
                With rstGroupStud
                    .AddNew
    
                    !idGroup = Me.id_GroupFrm
                    !nameStud = nameStud
                    ' nameStud
                    .Update
                End With
                rstGroupStud.Close
                Me.frm_03_GruopsStudents_tbl.Requery
    
                Exit Do
    TryNext:
                On Error Resume Next
                .MoveNext
                If Err.Number <> 0 Then Exit Do
                On Error GoTo 0
            Loop
        End With
    
        On Error Resume Next
        rstStud.Close
        Set rstStud = Nothing
        On Error GoTo 0
        Exit Sub
    
    ErrHandler:
        Resume TryNext
    End Sub
    

    那样 ErrHandler 只会在错误状态下运行;TryNext 在happy path"中运行,Exit Do 跳出循环(但不跳出程序),这样无论结果如何,清理代码都可以运行.

    That way ErrHandler only ever runs in an error state; TryNext runs in the "happy path", and Exit Do breaks out of the loop (but not out of the procedure) so that the cleanup code can run whatever the outcome is.

    这篇关于当错误再次出现时错误处理不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-01 14:39