【问题标题】:Run-time error '3021': Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record运行时错误“3021”:BOF 或 EOF 为 True,或者当前记录已被删除。请求的操作需要当前记录
【发布时间】:2022-02-22 19:04:55
【问题描述】:

从我收到更新的旧 VB6 应用程序中获取此错误。因此,我启动并运行了 XP Mode,并在其上安装和更新了 VB6,并添加了我要求的菜单选项,但现在我收到此错误。

这里有几个关于此错误或类似错误的示例,我查看了其中的一些示例,但情况并不完全相同,我仍然是一个相当新手的开发人员,我只需要帮助。我测试了我在开发服务器上编写的查询及其周围的 VB 语法,这部分工作正常。我认为这与接近结尾的结果集逻辑有关:

Private Sub FillDoor()

    Dim m_rsDoor As ADODB.Recordset

    cboDoorStyle.Clear

    Set m_rsDoor = conSQL.Execute("SELECT bpm.[Description] " & _
                                    "FROM tblBrandProductMaster bpm " & _
                                    "INNER JOIN tblDoorStyles ds " & _
                                        "ON ds.DoorStyleCode = bpm.Code " & _
                                    "INNER JOIN tblFamilyDoorStyles fds " & _
                                        "ON bpm.Code = fds.DoorStyleCode " & _
                                    "INNER JOIN tblFamilyLines fl " & _
                                        "ON fds.FamilyLineCode = fl.FamilyLineCode " & _
                                    "WHERE fl.FamilyLineCode = '" & strFamID & "' " & _
                                        "AND ds.DFFactive = 1 " & _
                                    "ORDER BY bpm.[Description] ASC")
    Do While Not m_rsDoor.EOF
        cboDoorStyle.AddItem m_rsDoor!Description
        m_rsDoor.MoveNext
    Loop
    Set m_rsDoor = Nothing

End Sub

****编辑:我正在使用该查询来填充应用程序中的特定下拉列表,它在 SQL serverin the app 上都有效。

这里的一些示例使用 If 循环而不是 Do While Not,但它们都完成了相同的事情,我认为这不是问题所在。我也不认为这是问题所在,因为我从应用程序的另一个菜单选项中复制并粘贴了该部分,当我单击它时该选项有效。当我选择我添加的选项时,它只会引发错误。

谢谢,感谢任何人提供的任何帮助。

【问题讨论】:

  • strFamID 分配在哪里,看起来您需要在“ORDER BY ...”之前或“... = 1”和_之后有一个空格
  • I looked through a bunch of them, but the circumstances aren't exactly the same - 情况完全一样,在错误信息中列出:BOF或EOF为True,或者当前记录已被删除。因为您没有删除记录,所以它必须是 BOF 或 EOF。您正在检查 EOF,您还应该检查 BOF。如果它们都是 True 你没有数据。如果只有 BOF 为真,您需要致电 MoveFirst
  • @BillHileman 很好地抓住了缺失的空间,我添加了它

标签: vb6


【解决方案1】:

修改如下代码:

Private Sub FillDoor()

    Dim m_rsDoor As ADODB.Recordset
    Set m_rsDoor = New Recordset

    Dim ActiveConnection as String
    ActiveConnection = "XXXXXXXXXXX"

    Dim strSQL as String
    strSQL = "SELECT bpm.[Description] " & _
                                "FROM tblBrandProductMaster bpm " & _
                                "INNER JOIN tblDoorStyles ds " & _
                                    "ON ds.DoorStyleCode = bpm.Code " & _
                                "INNER JOIN tblFamilyDoorStyles fds " & _
                                    "ON bpm.Code = fds.DoorStyleCode " & _
                                "INNER JOIN tblFamilyLines fl " & _
                                    "ON fds.FamilyLineCode = fl.FamilyLineCode " & _
                                "WHERE fl.FamilyLineCode = '" & strFamID & "' " & _
                                    "AND ds.DFFactive = 1" & _
                                "ORDER BY bpm.[Description] ASC"

    m_rsDoor.open strSQL, ActiveConnection, adOpenStatic, adLockOptimistic

    Do While Not m_rsDoor.EOF
        cboDoorStyle.AddItem m_rsDoor!Description
        m_rsDoor.MoveNext
    Loop
    Set m_rsDoor = Nothing

End Sub

【讨论】:

    【解决方案2】:

    当记录集中没有记录时会出现此错误。请检查您的查询是否正确并提供记录。

    【讨论】:

    • 添加了正在运行的查询的屏幕截图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    相关资源
    最近更新 更多