结果集没有hasNext方法。我想检查resultSet是否有任何值
这条路对吗
if (!resultSet.next() ) {
System.out.println("no data");
}
结果集没有hasNext方法。我想检查resultSet是否有任何值
这条路对吗
if (!resultSet.next() ) {
System.out.println("no data");
}
当前回答
我创建了以下方法来检查ResultSet是否为空。
public static boolean resultSetIsEmpty(ResultSet rs){
try {
// We point the last row
rs.last();
int rsRows=rs.getRow(); // get last row number
if (rsRows == 0) {
return true;
}
// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();
return false;
}catch(SQLException ex){
return true;
}
}
有以下几点考虑是非常重要的:
CallableStatement对象必须设置为让to ResultSet对象走在末尾并返回到顶部。
TYPE_SCROLL_SENSITIVE: ResultSet对象可以移到末尾并返回顶部。进一步可以捕捉最后的变化。
CONCUR_READ_ONLY:可以读取ResultSet对象数据,但不能更新。
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
其他回答
你总是可以在前面做下一个,只做一个后循环检查
if (!resultSet.next() ) {
System.out.println("no data");
} else {
do {
//statement(s)
} while (resultSet.next());
}
最初,结果集对象(rs)指向BFR(在第一条记录之前)。使用rs.next()后,光标指向第一条记录,rs值为“true”。使用while循环可以打印表中的所有记录。在检索到所有记录后,光标移动到ALR(在最后一条记录之后),它将被设置为null。让我们假设表中有2条记录。
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
简而言之,我们也可以将条件写成while (rs.next())。
如果您想查看结果集中是否有任何行,这将起作用。
请注意,next()总是移动到下一行,因此如果您计划从结果集中进行任何读取操作,则需要考虑到这一点。
通常使用ResultSet(当简单读取时)是:
while (resultSet.next())
{
... read from the row here ...
}
如果已经调用next()一次来检查结果集是否为空,那么显然不能正确工作,所以要注意这一点。尽管存在用于“备份”的方法,但并非所有类型的结果集都支持这些方法。
假设您正在使用一个新返回的ResultSet,其游标指向第一行之前,一个更简单的检查方法是调用isBeforeFirst()。这避免了在读取数据时必须回溯。
正如文档中解释的那样,如果游标不在第一条记录之前,或者结果集中没有行,则返回false。
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
根据最可行的答案,建议使用“isBeforeFirst()”。如果你没有“只转发类型”,这不是最好的解决方案。
有一个叫做".first()"的方法。要得到完全相同的结果,这就不那么过分了。您检查“结果集”中是否有内容,但没有移动光标。
文档声明:“(…)如果结果集中没有行则为false”。
if(rs.first()){
//do stuff
}
您也可以只调用isBeforeFirst()来测试是否有任何行返回而不移动游标,然后正常进行。- SnakeDoc 14年9月2日19:00
但是,"isBeforeFirst()"和"first()"是有区别的。首先,如果对“仅向前”类型的结果集执行操作,则会生成异常。
比较这两个throw部分: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html isBeforeFirst () http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html第()
好的,基本上这意味着你应该使用“isBeforeFirst”,只要你有一个“仅转发”类型。否则,使用“first()”就不会那么夸张了。