java no resultset_jdbc - Java ResultSet如何检查是否有任何结果

jdbc - Java ResultSet如何检查是否有任何结果

结果集没有hasNext的方法。 我想检查resultSet是否有任何值

这是正确的方法

if (!resultSet.next() ) {

System.out.println("no data");

}

kal asked 2019-02-19T19:16:57Z

21个解决方案

472 votes

假设您正在使用新返回的ResultSet,其光标指向第一行之前,更简单的方法是只调用isBeforeFirst()。这样可以避免在需要读取数据时进行回溯。

如文档中所述,如果游标不在第一个记录之前或者ResultSet中没有行,则返回false。

if (!resultSet.isBeforeFirst() ) {

System.out.println("No data");

}

Seifer answered 2019-02-19T19:17:54Z

209 votes

这是正确的,最初beforeFirst()的光标指向第一行之前,如果第一次调用next()返回false那么ResultSet中没有数据。

如果您使用此方法,则可能必须在重置之后立即调用beforeFirst(),因为它现在已经将自己定位在第一行之外。

但应该注意的是,Seifer的答案是对这个问题更优雅的解决方案。

ninesided answered 2019-02-19T19:17:21Z

44 votes

你可以随时做前一个,然后做一个后循环检查

if (!resultSet.next() ) {

System.out.println("no data");

} else {

do {

//statement(s)

} while (resultSet.next());

}

Maslow answered 2019-02-19T19:18:19Z

19 votes

你通常会这样做:

while ( resultSet.next() ) {

// Read the next item

resultSet.getString("columnName");

}

如果要报告空集,请添加一个计算读取项的变量。 如果您只需要阅读单个项目,那么您的代码就足够了。

kgiannakakis answered 2019-02-19T19:18:52Z

8 votes

根据最可行的答案,建议是使用“isBeforeFirst()”。 如果你没有“前进型”,这不是最好的解决方案。

有一种叫做“.first()”的方法。 获得完全相同的结果并不是一件坏事。 您检查“结果集”中是否有某些内容并且不要使光标前进。

文档说明:“(...)如果结果集中没有行,则为false”。

if(rs.first()){

//do stuff

}

您也可以调用isBeforeFirst()来测试是否在没有前进光标的情况下返回任何行,然后正常进行。 - SnakeDoc 2014年9月2日19:00

但是,“isBeforeFirst()”和“first()”之间存在差异。 如果在“仅向前”类型的结果集上完成,则首先生成异常。

比较两个投掷部分:[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()]

好吧,基本上这意味着你应该使用“isBeforeFirst”,只要你有“仅向前”类型。 否则使用“first()”就不那么过分了。

OddDev answered 2019-02-19T19:19:57Z

7 votes

最好使用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());

}

Dermot Doherty answered 2019-02-19T19:20:36Z

6 votes

无论光标位置如何,要完全确定结果集是否为空,我会做这样的事情:

public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {

return (!rs.isBeforeFirst() && rs.getRow() == 0);

}

如果ResultSet为空,则此函数将返回true,否则返回false;如果ResultSet已关闭/未初始化,则返回SQLException。

Felype answered 2019-02-19T19:21:09Z

5 votes

如果您想查看结果集中是否有任何行,那将会有效。

请注意,next()始终移动到下一行,因此如果您计划从结果集中进行任何读取,则需要将其考虑在内。

ResultSet的常用用法(简单阅读时)是:

while (resultSet.next())

{

... read from the row here ...

}

如果您已经调用next()检查结果集是否为空,那么显然无法正常工作,请注意这一点。 尽管存在“备份”的方法,但并不支持所有类型的结果集。

Nuoji answered 2019-02-19T19:21:56Z

4 votes

我相信这是一本实用且易读的作品。

if (res.next()) {

do {

// successfully in. do the right things.

} while (res.next());

} else {

// no results back. warn the user.

}

JSBach answered 2019-02-19T19:22:21Z

2 votes

if (!resultSet.isAfterLast() ) {

System.out.println("No data");

}

isAfterLast()也为空结果集返回false,但由于光标无论如何都在第一行之前,这个方法似乎更清楚。

Nick Warke answered 2019-02-19T19:22:47Z

1 votes

要做的最好的事情是检查第一行,这样当您打算获取数据时,可以避免跳过一行的错误。 类似于:if(!resultSet.first()){System.out.println(“no data”);}

Anthony Oyovwe answered 2019-02-19T19:23:15Z

1 votes

通过使用resultSet.next(),您可以轻松获得结果,无论resultSet是否包含任何值

ResultSet resultSet = preparedStatement.executeQuery();

if(resultSet.next())

//resultSet contain some values

else

// empty resultSet

Ram72119 answered 2019-02-19T19:23:42Z

1 votes

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()){....}时,第一行ResultSet将被执行,而在while(rs.next()){....}之后,我们将从下一行获得结果。 所以我认为重新执行if内部的查询是更好的选择。

Arpit Trivedi answered 2019-02-19T19:24:09Z

1 votes

ResultSet result = stmt.executeQuery(sqlQuery);

if (!result.next())

status = "ERROR";

else

status = "SUCCESS";

Deepu Surendran answered 2019-02-19T19:24:29Z

1 votes

我创建了以下方法来检查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);

Cristian answered 2019-02-19T19:25:22Z

1 votes

if(resultSet.first) {

} else {

system.out.println("No raw or resultSet is empty");

}

因为如果ResultSet没有raw,则resultSet.first返回false。

user868927 answered 2019-02-19T19:25:49Z

0 votes

你可以做这样的事情

boolean found = false;

while ( resultSet.next() )

{

found = true;

resultSet.getString("column_name");

}

if (!found)

System.out.println("No Data");

Mohamed EL-Shabrawy answered 2019-02-19T19:26:16Z

0 votes

我一直在尝试将当前行设置为第一个索引(处理主键)。 我会建议

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

}

Andrew answered 2019-02-19T19:26:58Z

0 votes

我认为检查结果集的最简单方法是通过包org.apache.commons.collections.CollectionUtils下的CollectionUtils。

if(CollectionUtils.isNotEmpty(resultList)){

/**

* do some stuff

*/

}

这将检查null和空结果集条件。

有关更多详细信息,请参阅以下文档。CollectionUtils

Mitul Maheshwari answered 2019-02-19T19:27:38Z

0 votes

为什么不使用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)”似乎工作正常。

stiebrs answered 2019-02-19T19:28:12Z

-2 votes

最初,结果集对象(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())。

Shiva answered 2019-02-19T19:28:46Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值