背景
当我让师傅给我初次验项目时,师傅就“兴致勃勃”的给我展示了这个错误。当将信息全部删除时,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,代表数据集记录数有值。
下面有我找到的两种解决办法
解决办法一
当它出现错误时,从错误下手,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