我遇到了绑定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记录锁定问题 - 我错过了什么?
事件的顺序是:
UpdateCheckBoxCaption
我可以告诉你,在所有方法上都设置了断点,除了第一次移动记录和连续两次以上的On_Current
方法之外,没有其他代码触发。
答案 0 :(得分:0)
这似乎不在循环中,所以看起来你只是通过该函数一次。 “恢复”不会修复问题,它只会移动到下一行并继续前进。
问题可能正在发生,因为您没有关闭p_rs。确保在退出之前关闭该记录集。