学生信息管理系统错误总结之3021

在这些天敲写和调试学生信息管理系统的时候,经常会用到EOF(End of File)和BOF(Before of File),稍加不注意查询我们的数据库就会出错,那么这两个究竟是个什么鬼?

一、认识

      BOF:指当前记录位置位于Recordset对象的第一个记录之前
      EOF:指当前记录位置位于Recordset对象的最后一个记录之后 
   这两个的属性值均返回布尔型:True和False,使用BOF
和 EOF 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。 下表即是各自的使用说明及查询结果:

 

EOF

BOF

True

当前行的位置是在最后一行的后面,无记录

当前行的位置是在第一行之前,无记录

False

当前行的位置是在最后一行或其前面,有记录

当前位置是在第一行或其后,有记录

说明:
  1. 如果当前记录位于第一个记录之前,BOF属性将返回 True(-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。
  2. 如果当前记录位于Recordset 对象的最后一个记录之后 EOF 属性将返回True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回 False。 
  3. 如果BOF 或 EOF 属性为 True,则没有当前记录。
  4. 如果打开没有记录的Recordset 对象,BOF 和 EOF 属性将设置为True,而 Recordset 对象的 RecordCount 属性设置为零。打开至少包含一条记录的 Recordset 对象时,第一条记录为当前记录,而BOF 和 EOF 属性为 False。
  5. 如果删除Recordset 对象中保留的最后记录,BOF 和 EOF属性将保持 False,直到重新安排当前记录。
      而在我们的学生信息管理系统中,会涉及到对指针进行的MoveFirst、MoveLast、MovePrevious与MoveNext四种方法。一般来说,当需要对记录集Recordset中的所有行进行操作时,代码可以使用MoveNext,循环遍历各行,直到EOF属性被置为True
如果当 EOF 被置为 True 时再使用 MoveNext ,或当 BOF被置为 True 时再使用 MovePrevious ,都将产生一个提示代号为‘3021’的错误。
    需要注意的是:允许一个Move 方法并非意味着,该方法能成功地定位某行。它仅表示执行这个指定的 Move 方法是允许的,并且不产生一个错误。 BOF 和 EOF属性的状态可以随着该移动的结果而改变。 


二、用法(因为在学生信息系统中定义mrc为记录集对象)

If mrc.BOF Then
表示:当前指针的位置是在第一行记录之前,则...
If mrc.EOF Then
表示:当前指针的位置是在最后一行记录之后,则...
If Not mrc.EOF Then
表示:当前指针的位置没有到达最后一条记录
If Not mrc.BOF then

表示:当前指针的位置没有到达第一条记录

推荐使用下面两条
If Not (mrc.BOF AND mrc.EOF) Then
表示:指针位于RecordSet 的当中(并非是最后一条和第一条) ,说明一定有记录。
If mrc.BOF AND mrc.EOF Then
表示:没有任何记录

三、具体使用

说完了EOF和BOF之后就要说说我们的3021错误了。错误定位在更改学籍信息中。
Private Sub cmdPrevious_Click()
    '数据集向前移动
    mrc.MovePrevious
    '判断是否到起始位置
    If mrc.BOF Then
        mrc.MoveLast
    End If
    Call viewData
End Sub
自己错把BOF达成了EOF。这一点就是自己的粗心的问题了。
第二个错误就是关于记录查询问题了,在查询信息页面如果没有向数据库中添加记录的情况下,会出现错误3021,因为搜索不到记录集,而指针依然要求移到第一条记录这时就会出现查询错误。
错误处理方法:一、进行错误处理
Private Sub Form_Load()
  Dim txtSQL As String
  Dim MsgText As String
  txtSQL = "SELECT * FROM student_Info "
  Set mrc = ExecuteSQL(txtSQL, MsgText) '得到临时表
  On Error GoTo 1:
  mrc.MoveFirst
  Call viewData
  myBookmark = mrc.Bookmark '对当前记录进行标记
  mcclean = True '可编辑状态
  1:
  If Err = 3021 Then
  MsgBox "无记录!"
  End If
  End sub
错误处理方法二:用if条件将错误显示出来
Private Sub Form_Load()
    Dim txtSQL As String
    Dim MsgText As String
    txtSQL = "SELECT * FROM student_Info "
    Set mrc = ExecuteSQL(txtSQL, MsgText) '得到临时表
’考虑无记录情况
    If mrc.EOF And mrc.BOF Then  ’一条IF语句充当错误处理,当无记录时,mrc.eof=true
                                  ’和mrc.bof=true两个条件同时满足!
        MsgBox "无记录!请先添加记录。"
        frmAddsinfo.Show ’直接进行下一步,显示窗体
    Else
        mrc.MoveFirst
        Call viewData
        myBookmark = mrc.Bookmark '对当前记录进行标记
        mcclean = True '可编辑状态  
 End If
总结:3021错误是一个很常见的问题,这个问题会让我们不断加深我们对于EOF和BOF的理解,每次的错误都会让我们成长的更快。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值