为什么“恢复”修复了Access 3197错误

时间:2014-02-18 15:42:00

标签: vba ms-access ms-access-2010

我遇到了绑定Access splitform的一个非常令人困惑的情况。我的表单绑定到查询链接到SQL数据库。

我有一个方法,它的“点击”事件上的某些表单控件调用如下:

Private Function UpdateCheckBoxCaption(ByRef p_label As Label, p_fieldName As String, Optional p_newStatus As String = "") As Boolean

    UpdateCheckBoxCaption = False

    Dim errCount As Integer
    errCount = 0

    'check if value already exists, it can't be overwritten then
    If DoesFieldContainData(Me.Recordset, p_fieldName) = False Then
        Select Case MsgBox("Are you sure you want to set this date?" _
                        & vbCrLf & "" _
                        & vbCrLf & "Only the manager can undo this change." _
                        , vbYesNo Or vbExclamation Or vbDefaultButton1, "Please confirm")

        Case vbYes
            On Error GoTo errHandler
            With Me.Recordset
                .Edit
                .Fields(p_fieldName) = Now
                .Update
            End With

            UpdateCheckBoxCaption = True

        Case vbNo

        End Select

    Else
        MsgBox "This date was already set to " & Me.Recordset.Fields(p_fieldName)
    End If

    Exit Function

errHandler:
    errCount = errCount + 1
    If Err.Number = 3197 Then
        Debug.Print "error number "; CStr(errCount)
        If errCount < 10 Then
            Resume
        End If
    End If

    MsgBox "Error in UpdateCheckBoxCaption"

End Function

这很令人困惑,因为我可以简单地添加基本的“错误处理”(松散地使用这个术语,因为它不是真正正确的错误处理)并通过调用Resume.导致问题消失我还可以设置断点在.Edit行,并在没有错误的情况下跳过代码。

经过多次挖掘后,似乎DoFieldContainData函数实际上是在这里导致问题。如果我删除该调用,该方法可以正常工作。

这让我相信这里的方法不会“释放”Recordset。关于做Resume的事情会导致它发生。

这是我的DoesFieldContainData方法(在不同的模块中):

Public Function DoesFieldContainData(ByRef p_rs As DAO.Recordset, p_fieldName As String) As Boolean

    'returns "true" if field is valid data
    'returns "false" if field is either null or ""

    On Error GoTo errHandler
    DoesFieldContainData = True

    If IsNull(p_rs.Fields(p_fieldName)) = True Then
        DoesFieldContainData = False
    End If

    If p_rs.Fields(p_fieldName) = "" Then
        DoesFieldContainData = False
    End If

    Exit Function
errHandler:
    DoesFieldContainData = False

End Function

onClick事件如下所示:

Private Sub lbl_chk_concept2Review_Click()
    UpdateCheckBoxCaption Me.Controls("lbl_chk_concept2Review"), "DateConceptReviewHeld2"
End Sub

我不明白为什么这甚至会导致3197记录锁定问题 - 我错过了什么?


事件的顺序是:

  1. 将记录移至SplitForm视图中的新记录
  2. 单击标签以执行以下方法
    • “On_Click”
    • 立即使用
    • 调用UpdateCheckBoxCaption
    • 这只是代码执行
    • 执行时没有“错误”调试打印
  3. 在另一个标签上重复上述步骤
    • 在所有后续步骤中,调试语句至少触发一次(有时两次)
  4. 我可以告诉你,在所有方法上都设置了断点,除了第一次移动记录和连续两次以上的On_Current方法之外,没有其他代码触发。

1 个答案:

答案 0 :(得分:0)

这似乎不在循环中,所以看起来你只是通过该函数一次。 “恢复”不会修复问题,它只会移动到下一行并继续前进。

问题可能正在发生,因为您没有关闭p_rs。确保在退出之前关闭该记录集。

相关问题