以上错误是在使用ResultSet接口的get方法获取相应SQL类型的值时出现的错误,都是因为指针位置导致的错误。
原因:
After end of result set (结果集结束后)
顾名思义,根据这句话的意思我们很容易理解,也就是现在指针的位置是在结果集最后一行之后,没有指向任何数据,所以调用get方法时报错。
Before start of result set (结果集开始前)
和上面的错误是类似的,也就是现在指针的位置在结果集的第一行之前,没有指向任何数据,所以报错。
举两个例子:
1.报错:After end of result set
try {
PreparedStatement stm = conn.prepareStatement("select * from info where name=? and password=? ");
stm.setString(1, username);
stm.setString(2, password);
sul = stm.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
while(sul.next()) {
System.out.println(sul.getString("name"));
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
sul.getString("name");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
当我执行此代码的时候,倒数第5行是会报错After end of result set的,因为在我执行此语句之前,我前面执行了while循环,当循环完成之后,此时我的指针是在结果集末尾的,也就是结果集最后一行之后,没有指向任何数据所以报错。
2.报错:Before start of result set
try {
PreparedStatement stm = conn.prepareStatement("select * from info where name=? and password=? ");
stm.setString(1, username);
stm.setString(2, password);
sul = stm.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sul.getString("name");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
执行此代码倒数第5行会报错Before start of result set,因为指针最初位于第一行之前,没有指向任何数据,所以调用get方法报错。
try {
PreparedStatement stm = conn.prepareStatement("select * from info where name=? and password=? ");
stm.setString(1, username);
stm.setString(2, password);
sul = stm.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
sul.next();
sul.getString("name");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
如果在倒数第5行之前加上语句:sul.next(),程序会完美执行,因为此语句将指针移到下一行,也就是第一行,指针指向数据,所以调用get方法不会报错。
结语:
这两个错误都是因为指针位置的问题导致的错误,所以当出现这两个错误时,调整一下指针的位置就可以了。理解的不够深入,有问题的地方还请指出。如果有帮助还请支持一下。