获取运行时错误"3159":拉取 SQL 记录集时不是有效的书签



我正在尝试使用基于frmPackingSlipHeader.JOB.REL控件的记录填充frmPanelUnitEntryHeader.txtJOB_NUMBER.txtRELEASE_NUMBER。当记录在frmPackingSlipHeader上导航时,.JOB.REL被提交到gtxtCurrentJobNumber&gtxtCurrentJobRelease全局变量。我遇到了rs.FindFirst方法,但大约需要一分钟或更长时间才能返回有效记录;找到正确的记录并按预期显示。在抱怨用.FindFirst搜索长时间等待后,我遇到了OpenRecordset方法,并使用strSQL提取记录,但在Me.Bookmark = rs.Bookmark上得到了运行时错误"3159"消息。frmPanelUnitEntryHeader不是子rom。

Private Sub txtJOB_NUMBER_GotFocus()
'Used to bring up existing jobs in SUB table
Dim rs      As Object
Dim strSQL  As String
'    Set rs = Me.RecordsetClone
strSQL = "SELECT * FROM MAIN_SUB WHERE [JOB_NUMBER] = '" & gtxtCurrentJobNumber & "' And RELEASE_NUMBER = '" & gtxtCurrentJobRelease & "';"

Set rs = CurrentDb.OpenRecordset(strSQL)

With rs
If .RecordCount = 0 Then
DoCmd.GoToRecord , , acNewRec
Else
Me.Bookmark = .Bookmark
End If
End With
Set rs = Nothing

'    With rs
'        .FindFirst "JOB_NUMBER='" & gtxtCurrentJobNumber & "' And RELEASE_NUMBER='" & gtxtCurrentJobRelease & "'"
'        If .NoMatch Then
'            DoCmd.GoToRecord , , acNewRec
'        Else
'            Me.Bookmark = .Bookmark
'        End If
'    End With
'
'    Set rs = Nothing
End Sub

评论的行放在一起。

我在搜索错误时注意到,许多网站都会求助于数据库损坏和修复,但我不认为这里是这样。.FindFirst工作正常,但速度较慢。为什么书签在这两种方法之间的工作方式似乎不同?这与我在txtJOB_NUMBER_GotFocus()上这样做有什么关系吗?TIA。

如果你仔细阅读Form.Bookmark上的文档,它会说:

因为Access在打开窗体时会为窗体记录集中的每个记录创建一个唯一的书签,所以即使两个记录集基于相同的表、查询或SQL语句,窗体的书签也不会在另一个记录集上起作用。

因此,每个记录集都有不同的书签,您只能使用同一记录集的书签。

.RecordsetClone是相同的记录集,但却是不同的游标,这就是为什么如果rsMe.Recordset的克隆,则Me.Bookmark = rs.Bookmark会工作(如果与rs = CurrentDb.OpenRecordset(strSQL)不同,则会失败(。

您可以尝试直接使用过滤记录集

Private Sub txtJOB_NUMBER_GotFocus()
With CurrentDb.CreateQueryDef(vbNullString) 'Temporary QueryDef to use parameters
.SQL = "SELECT * FROM MAIN_SUB  WHERE [JOB_NUMBER] = [CurrentJobNumberParameter] And RELEASE_NUMBER = [CurrentJobReleaseParameter];"
.Parameters("CurrentJobNumberParameter") = gtxtCurrentJobNumber
.Parameters("CurrentJobReleaseParameter") = gtxtCurrentJobRelease
With .OpenRecordset
If .RecordCount = 0 Then
Me.Recordset.NewRecord
Else
Set Me.Recordset = .Parent.Recordsets(.Name) ' equvalent to Set Me.Recordset = rs, but without the need of variables declaration
End If
End With
End With
End Sub

这段代码还展示了如何避免在DAO上使用参数进行注入。阅读Bobby Tables及其Microsoft Access部分!

相关内容

  • 没有找到相关文章

最新更新