4
ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
if (zoeken.getRow() == 0){
   System.out.println("hi");
}
while( zoeken.next() ){
   System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
}

我正在使用它来检查结果zoeken是否为空,但它会抛出一个异常,说明这样做是非法的,无论它是否有效。

检查结果是否为空的更好解决方案是什么

4

6 回答 6

10

// 我正在使用它来检查结果“zoeken”是否为空,但它会抛出一个异常,说明这样做是非法的。不管它是否有效

在调用ResultSet.next()之前不要调用ResultSet.getRow()

来自 API:

ResultSet 对象维护一个指向其当前数据行的游标。最初,光标位于第一行之前。next 方法将光标移动到下一行,因为当 ResultSet 对象中没有更多行时它返回 false,所以可以在 while 循环中使用它来遍历结果集。

       ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
       boolean val = zoeken.next(); //next() returns false if there are no-rows retrieved 
        if(val==false){
            System.out.println("zoken is empty"); //prints this message if your resultset is empty
         }
        while(val){// only runs when there are rows in the resultset
           System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
          val=zoeken.next(); //updating val again to check if there are rows in result set
        }

如果您的结果集为 zoeken.next()将返回false在这种情况下您的 while 循环将不会执行。

一个建议

使用PreparedStatement而不是简单的 Statement。简单的语句会导致SQL 注入,也可以减轻编写复杂查询的痛苦。下面是使用 PreparedStatement 的示例代码。

String yourquery ="Select whatever From table where col1= ? and col2 =?"
PreparedStatement stmnt = Conn.preparedStatement(yourquery);
stmnt.setString(1, "val1");
stmnt.setString(2, "val2");
于 2012-12-11T21:58:33.183 回答
2

使用next()方法

boolean hasNext = zoeken.next();
于 2012-12-11T21:56:50.813 回答
2

以下代码将为您工作

if(!zoeken.first() && !zoeken.next())//if fist and next records are empty
{
System.out.println("Result set is empty");
}
else
{
System.out.println("Result set is not empty");
}
于 2014-01-08T03:27:14.587 回答
0

根据next()你必须先使用 next 然后 getRow()

ResultSet zoeken = stat.executeQuery("SELECT * FROM leden WHERE naam = '" + text + "'");
while( zoeken.next() ){
    int rowNum = zoeken.getRow();
    System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
}
于 2012-12-11T22:03:29.570 回答
0

不使用 Result Set next() 您无法检查大小或 resultSet 周期。

ResultSet 游标最初位于第一行之前。

于 2012-12-11T22:27:40.550 回答
0

我知道 OP 可能不再需要这些信息,但如果有人偶然发现这一点,我会同意 @PermGenError 所说的一切,尽管我觉得给定代码的解决方案更优雅,但使用准备好的语句将是:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM leden WHERE naam = ?");
ps.setString(title);
ResultSet rs = ps.executeQuery();

if (rs.next()) {
    do {
        System.out.println(zoeken.getString(1) + zoeken.getString(2) + zoeken.getString(3));
    } while (rs.next());
} else {
    System.out.println("hi");
}

我已经徒手写了这个,所以请原谅任何错误或者如果它没有编译。我只是觉得这更清楚并减少了局部变量的使用。如果至少有一行,请打印该行并继续执行此操作,直到没有更多行,否则说“嗨”。但我想你会想说一些比“嗨”更有用的东西,也许是“没有找到结果”消息或其他东西。

于 2014-04-14T18:24:25.627 回答