学生信息系统优化(二)---实时错误"3021"

背景

当我让师傅给我初次验项目时,师傅就“兴致勃勃”的给我展示了这个错误。当将信息全部删除时,3021就蹦了出来。我一脸懵逼,师傅们说这是他们也遇到过的错误。果然在通往成功的路上,没有捷径,遇到的困难都是一样的

解析

出现实时错误3021时,后面都会有提示——BOF或EOF中有一个是“真“,或者当前的记录已被删除,所需的操作要求一个当前的记录。出现的原因是因为数据库中数据为空。

BOF 是 Begin Of File 的缩写

EOF 是 End Of File 的缩写

如果 recordset 的 BOF 属性为 true,那么代表当前的数据库记录集指针处于第1条记录之前的位置,前面已经没有记录了。简单点说,就是当前处于数据库的

如果 recordset 的 EOF 属性为 true,那么代表当前的数据库记录集指针处于最后1条记录之后的位置,后面已经没有记录。简单点说,就是当前处于数据库的

如果 BOF 和 EOF 同时为 TRUE,代表当前数据集记录数为 0。

如果EOF为FALSE,代表数据集记录数有值。

下面有我找到的两种解决办法

扫描二维码关注公众号,回复: 2521665 查看本文章

解决办法

当它出现错误时,从错误下手,3021有两种情况,根据不同的情况再编辑代码,就可以解决

Private Sub cmdDelete_Click()
    On Error GoTo dateErr
    Dim str1 As String
    myBookmark = mrc.Bookmark '做标记
    str2$ = MsgBox("是否删除当前的记录", vbOKCancel, "删除当前记录")
    
    If str2$ = vbOK Then
            mrc.MoveNext    '指针下移一位            
            If mrc.EOF Then
                mrc.MoveFirst
                myBookmark = mrc.Bookmark
                mrc.MoveLast
                mrc.Delete
                mrc.Bookmark = myBookmark
                Call viewData
            Else
                myBookmark = mrc.Bookmark '做标记
                mrc.MovePrevious
                mrc.Delete
                mrc.Bookmark = myBookmark '游标到下一条记录
                Call viewData
            End If
    Else
        mrc.Bookmark = myBookmark '取消标记
        Call viewData
    End If
dateErr:
    If Err = 3021 Then
        If mrc.BOF And mrc.EOF Then     '无记录的情况
            MsgBox "无可删除的记录"
            Unload Me
        Else                         '只有一条记录的情况
            str1 = MsgBox("最后一条记录,是否删除", vbOKCancel, "删除记录")
            If str1 = vbOK Then
                MsgBox "最后一条记录已删除"
                Unload Me
            Else
                Exit Sub
            End If
        End If
   End If
End Sub

解决方法二

从删除记录这个事件下手,分析一共有3种情况,让后根据不同的情况编辑代码,解决问题

Private Sub cmdDelete_Click()
    Dim str2 As String
    If mrc.RecordCount = 0 Then
       MsgBox "数据为空", vbOKOnly + vbExclamation, "提示"
    Exit Sub
    End If
    
    If mrc.RecordCount = 1 Then
    str2$ = MsgBox("这是最后一条记录", vbOKCancel + vbExclamation, "警告")
        If str2$ = vbOK Then
            mrc.Delete
            MsgBox "最后一条记录已删除"
                Unload Me
            Else
                Exit Sub
        End If
    End If
    
    If mrc.RecordCount > 1 Then
        myBookmark = mrc.Bookmark
        str2$ = MsgBox("是否删除当前记录", vbOKCancel, "删除当前记录")
    If str2$ = vbOK Then
        mrc.MoveNext
        If mrc.EOF Then
            mrc.MoveFirst
            myBookmark = mrc.Bookmark
            mrc.MoveLast
            mrc.Delete
            mrc.Bookmark = myBookmark
            Call viewData
        Else
            myBookmark = mrc.Bookmark
            mrc.MovePrevious
            mrc.Delete
            mrc.Bookmark = myBookmark
            Call viewData
        End If
        Else
            mrc.Bookmark = myBookmark
            Call viewData
        End If
        End If
End Sub

主窗体添加判断

先不要高兴太早,当编辑完删除事件,这个错误并没有结束,还要在主窗体上优化

'问题代码
Private Sub Form_Load()
    Dim txtSQL As String
    Dim MsgText As String
    Dim i As Integer
    txtSQL = "select * from class_Info "
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    If mrc.RecordCount = 0 Then
        MsgBox "数据为空", vbOKOnly + vbExclamation, "提示"
        unload me
    Else
        mrc.MoveFirst
        Call viewData
        mcbookmark = mrc.Bookmark 
        mcclean = True
        For i = 1 To mrc.RecordCount
            comboGrade.AddItem mrc.Fields(1)
            mrc.MoveLast
        Next i
        '功能按钮
        cmdFirst.Enabled = True
        cmdPrevious.Enabled = True
        cmdNext.Enabled = True
        cmdLast.Enabled = True
        txtClass.Enabled = False
        txtDirector.Enabled = False
        comboGrade.Enabled = False
        txtClassroom.Enabled = False
    End If
End Sub

当时我添加的判断是这样的,如果数据为空那么窗口卸载,但是运行出现了错误,显示“实时错误‘364’,对象已卸载。”通过调试我知道了,这的卸载窗体与菜单窗体中的该窗体运行代码发生冲突。于是我尝试将unload me删除,发现能运行,但是只要点击窗体里涉及到提取数据库信息的按钮,还是一样会报错‘3021’。于是我另换了一种思路,既然在遇到数据库没有记录这种情况时,我不能终止该窗体的运行,那么我就将窗体里涉及到提取数据库信息的按钮全部失去功能。这样你点击不了,那就不可能报错了。哈哈!!

代码如下

'正确代码
Private Sub Form_Load()
    Dim txtSQL As String
    Dim MsgText As String
    Dim i As Integer
    txtSQL = "select * from class_Info "
    Set mrc = ExecuteSQL(txtSQL, MsgText)
    If mrc.RecordCount = 0 Then
        MsgBox "数据为空", vbOKOnly + vbExclamation, "提示"
        '功能按钮全部失效
        cmdFirst.Enabled = False
        cmdPrevious.Enabled = False
        cmdNext.Enabled = False
        cmdLast.Enabled = False
        txtClass.Enabled = False
        txtDirector.Enabled = False
        comboGrade.Enabled = False
        txtClassroom.Enabled = False
        cmdEdit.Enabled = False
        cmdUpdate.Enabled = False
        cmdCancel.Enabled = False
        cmdDelete.Enabled = False
    Else
        mrc.MoveFirst
        Call viewData
        mcbookmark = mrc.Bookmark 
        mcclean = True
        For i = 1 To mrc.RecordCount
            comboGrade.AddItem mrc.Fields(1)
            mrc.MoveLast
        Next i
        '功能按钮
        cmdFirst.Enabled = True
        cmdPrevious.Enabled = True
        cmdNext.Enabled = True
        cmdLast.Enabled = True
        txtClass.Enabled = False
        txtDirector.Enabled = False
        comboGrade.Enabled = False
        txtClassroom.Enabled = False
    End If
End Sub

猜你喜欢

转载自blog.csdn.net/liangjiabao5555/article/details/81299193
今日推荐