Java ResultSet如何检查是否有任何结果
结果集 hasNext没有方法。 我想检查结果集是否有任何值
这是正确的方法
if (!resultSet.next() ) { System.out.println("no data"); }
这是正确的,最初ResultSet
的光标指向第一行之前,如果第一次调用next()
返回false
那么在ResultSet
没有数据。
如果你使用这个方法,你可能不得不立即调用beforeFirst()
来重置它,因为它已经把自己定位在第一行之后了。
但是,应该指出的是, Seifer的答案是对这个问题更为优雅的解决scheme。
假设你正在处理一个新返回的ResultSet
它的游标指向第一行之前,更简单的方法是调用isBeforeFirst()
。 这避免了如果要读取数据就必须回溯。
如文档中所述,如果游标不在第一个logging之前,或者ResultSet中没有行,则返回false。
if (!resultSet.isBeforeFirst() ) { System.out.println("No data"); }
你总是可以做的下一个前面,只是做一个后循环检查
if (!resultSet.next() ) { System.out.println("no data"); } else { do { //statement(s) } while (resultSet.next()); }
你通常会做这样的事情:
while ( resultSet.next() ) { // Read the next item resultSet.getString("columnName"); }
如果你想报告一个空集,添加一个variables计数读取的项目。 如果您只需要阅读单个项目,那么您的代码就足够了。
最好使用ResultSet.next()以及do {…} while()语法。
“检查任何结果”调用ResultSet.next()将光标移动到第一行,所以使用do {…} while()语法来处理该行,同时继续处理循环返回的剩余行。
这样你可以检查任何结果,同时也处理返回的结果。
if(resultSet.next()) { // Checks for any results and moves cursor to first row, do { // Use 'do...while' to process the first row, while continuing to process remaining rows } while (resultSet.next()); }
根据最可行的答案,build议使用“isBeforeFirst()”。 如果您没有“仅前向型”,那不是最好的解决scheme 。
有一个叫“ .first() ”的方法。 获得完全相同的结果不那么矫枉过正。 你检查你的“结果集”中是否有东西,并且不要提前你的光标。
该文档指出:“(…)如果结果集中没有行,则为false”。
if(rs.first()){ //do stuff }
你也可以直接调用isBeforeFirst()来testing是否有任何返回的行没有前进光标,然后正常进行。 – SnakeDoc 9年9月2日在19:00
但是,“isBeforeFirst()”和“first()”是有区别的。 如果在types为“forward only”的结果集上完成,则首先会生成一个exception。
比较两个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#first()
好的,基本上这意味着只要你有一个“只有前进”的types,你应该使用“isBeforeFirst”。 否则,使用“first()”就不那么矫枉过正了。
如果你想查看结果集中是否有任何行是的,这将工作。
请注意, next()
总是移动到下一行,因此如果您计划从结果集中读取数据,则需要考虑这一点。
ResultSet的常用用法(简单阅读时)是:
while (resultSet.next()) { ... read from the row here ... }
如果你调用next()
一次已经检查结果集是否为空,那么显然不能正确工作,所以要小心。 虽然有“备份”方法,但不支持所有types的结果集。
要完全确定结果集是空的还是不pipe光标位置,我会做这样的事情:
public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException { return (!rs.isBeforeFirst() && rs.getRow() == 0); }
如果ResultSet为空,则此函数将返回true,否则返回false,如果该ResultSet已closures/未初始化,则返回SQLException。
if (!resultSet.isAfterLast() ) { System.out.println("No data"); }
isAfterLast()
对于空的结果集也返回false,但是由于光标位于第一行之前,所以这个方法似乎更清晰。
我相信这是一个实用而易读的作品。
if (res.next()) { do { // successfully in. do the right things. } while (res.next()); } else { // no results back. warn the user. }
if(reset.first) { } else { system.out.println("No raw or reset is empty"); }
因为如果ResultSet没有raw,那么reset.first
返回false。
最好的办法是检查第一行,以便当你打算获取数据时,可以避免跳过一行的错误。 就像:if(!resultSet.first()){System.out.println(“no data”); }
通过使用resultSet.next(),你可以很容易地得到结果,无论resultSet是否包含任何值
ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()) //resultSet contain some values else // empty resultSet
ResultSet rs = rs.executeQuery(); if(rs.next()) { rs = rs.executeQuery(); while(rs.next()) { //do code part } } else { //else if no result set }
因为当我们调用if(rs.next()){....}
第一行将被执行,并且在它后面while(rs.next()){....}
我们会从下一行得到结果。 所以我认为if
是更好的select,重新执行查询里面。
ResultSet result = stmt.executeQuery(sqlQuery); if (!result.next()) status = "ERROR"; else status = "SUCCESS";
我创build了以下方法来检查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对象必须设置为让ResultSet对象在最后走到顶部。
TYPE_SCROLL_SENSITIVE :ResultSet对象可以在最后移动并返回顶部。 进一步可以赶上最后的变化
CONCUR_READ_ONLY :我们可以读取ResultSet对象的数据,但不能更新。
CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
你可以做这样的事情
boolean found = false; while ( resultSet.next() ) { found = true; resultSet.getString("column_name"); } if (!found) System.out.println("No Data");
我一直在试图设置当前行到第一个索引(处理主键)。 我会build议
if(rs.absolute(1)){ System.out.println("We have data"); } else { System.out.println("No data"); }
当填充ResultSet时,它指向第一行之前。 将其设置为第一行(由rs.absolute(1)
指示)时,将返回true表示已成功放置在第1行,如果该行不存在,则返回false。 我们可以推断这一点
for(int i=1; rs.absolute(i); i++){ //Code }
将当前行设置为位置i,如果该行不存在,将会失败。 这只是一个替代方法
while(rs.next()){ //Code }
我认为检查结果集最简单的方法是通过CollectionUtils包org.apache.commons.collections.CollectionUtils
if(CollectionUtils.isNotEmpty(resultList)){ /** * do some stuff */ }
这将检查null以及空的结果集条件。
有关更多详细信息,请参阅以下文档。 CollectionUtils
为什么不使用rs.getRow()?
int getRow() throws SQLException Retrieves the current row number. The first row is number 1, the second number 2, and so on. Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY Returns: the current row number; 0 if there is no current row Throws: SQLException - if a database access error occurs or this method is called on a closed result set SQLFeatureNotSupportedException - if the JDBC driver does not support this method Since: 1.2
对我来说,检查“if(rs.getRow()!= 0)”似乎工作得很好。
最初,结果集对象(rs)指向BFR(在第一条logging之前)。 一旦我们使用rs.next(),光标指向第一个logging,rs持有“true”。 使用while循环可以打印表格的所有logging。 在所有的logging被检索后,光标移动到ALR(最后一个logging之后),它将被设置为空。 让我们考虑一下表中有两条logging。
if(rs.next()==false){ // there are no records found } while (rs.next()==true){ // print all the records of the table }
简而言之,我们也可以把这个条件写成while(rs.next())。