最近在调试学生的时候,好几次出现了这个错误,尤其是在修改信息的时候,那么我们先来回顾一下EOF和BOF。
使用ADO连接数据库进行查询的时候,数据库将查询结果返回查询端,在查询端的内存里面就会有一个列表,这个列表存放的就是查询的结果。这个内存中的列表就是数据集。在你的程序里面rs就是表示这个数据集。BOF指示当前记录位置位于 Recordset 对象的第一个记录之前,EOF指示当前记录位置位于 Recordset 对象的最后一个记录之后。比如数据集里面有编号为1,2,3,4的4条记录,但是rs指向的编号是-1,这样就会符合了BOF的情况。同理,当rs的指针指向5,而第五条记录并不存在,这样就会产生了EOF的情况。
如果同时产生了BOF和EOF的情况,就是说rs的指针既在上界之外也在下界之外,这样只有一种情况,就是rs所代表的数据集是空的,这样rs的指针无论是指到什么地方都是同时具有BOF和EOF的属性。
数据集是空的,SQL语句查询出来的值是空的,在读取rs数据集里面的值的时候就会报这个错误。
解决方法:
①使用 If mrc.BOF And mrc.EOF Then 这个判断可以判别rs里面是否有数据集,如果符合这个条件,说明数据集是空的,在程序中就要绕开对rs里字段的访问。
Private Sub Form_Load()
Dim txtSQL As String
Dim MsgText As String
txtSQL = "select * from student_Info " 'SQL语句
Set mrc = ExecuteSQL(txtSQL, MsgText) '执行查询操作
If mrc.EOF And mrc.BOF Then
MsgBox "无记录!"
frmModifyclassinfo.Show
Else
mrc.MoveFirst '移到第一条记录
Call viewData '显示数据
mcbookmark = mrc.Bookmark '记下当前记录的位置
mcclean = True '给标志赋初值
End If
End Sub
之后就会出现如下弹出框,点击确定即可显示本窗体。
②错误处理的本质就是当遇到错误时,可以跳过该错误,直接进行下一步,以便于程序顺利进行!那么我们根据这个原理在代码中添加错误处理,问题便可迎刃而解!代码如下:
Private Sub Form_Load()
Dim txtSQL As String
Dim MsgText As String
txtSQL = "select * from student_Info " 'SQL语句
Set mrc = ExecuteSQL(txtSQL, MsgText) '执行查询操作
On Error GoTo 1:
mrc.MoveFirst '移到第一条记录
Call viewData '显示数据
mcbookmark = mrc.Bookmark '记下当前记录的位置
mcclean = True '给标志赋初值
1:
If Err = 3021 Then
MsgBox "无记录!"
End If
End Sub