2017-05-20 49 views
0

这是一个简单的代码打印数据库中的一些行。但是当我执行此操作时,屏幕上没有任何内容。我认为问题是rs.next()方法正在跳过一行。那么我该如何避免或重置rs.next()方法的位置?避免跳过一行通过下一步()结果集的方法

String searchword = Searchtf.getText(); 
try { 
     Class.forName("com.mysql.jdbc.Driver"); 

     java.sql.Connection con = DriverManager.getConnection(url, db_username, db_password); 

     java.sql.Statement stat = con.createStatement(); 

     String searchQuery = "SELECT * FROM user WHERE Name LIKE '" + searchword + "' "; 

java.sql.ResultSet rs = stat.executeQuery(searchQuery); 

     if (rs.next()) { 
      while (rs.next()) { 
       System.out.print(rs.getString("idUser") + " ,"); 
       System.out.print(rs.getString("Name") + " ,"); 
       System.out.print(rs.getString("Email") + " ,"); 
       System.out.println(rs.getString("country") + " ."); 
      } 
     } else { 
      JOptionPane.showMessageDialog(null, "Not Found"); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
+0

的可能的复制[Java的ResultSet中如何检查是否有任何结果(http://stackoverflow.com/questions/867194/java-resultset-how-to-check-if-there-are任何结果) –

回答

3

首先,停止构建像这样的SQL - 使用参数化SQL和PreparedStatement。您当前的代码容易受到SQL注入攻击。

基本上,在一排(第一次在if然后在while)不叫rs.next()两次......你可以很容易地做到这一点你while循环转换成do/while循环:

if (rs.next()) { 
    do { 
     System.out.print(rs.getString("idUser") + " ,"); 
     System.out.print(rs.getString("Name") + " ,"); 
     System.out.print(rs.getString("Email") + " ,"); 
     System.out.println(rs.getString("country") + " ."); 
    } while (rs.next()); 
} 

或者只是while环路,一个独立的变量来检测你见过一些结果:

bool anyResults = false; 
while (rs.next()) { 
    anyResults = true; 
    System.out.print(rs.getString("idUser") + " ,"); 
    System.out.print(rs.getString("Name") + " ,"); 
    System.out.print(rs.getString("Email") + " ,"); 
    System.out.println(rs.getString("country") + " ."); 
} 
if (!anyResults) { 
    JOptionPane.showMessageDialog(null, "Not Found"); 
} 

(另外,你应该使用try-与资源关闭您的ResultSet等,只是打印堆栈跟踪stdout是几乎从来没有来处理异常恰当的方式...)

+0

谢谢你的答案..好吧,我将在我的未来代码中使用参数化SQL和PreparedStatement。 rs.relative(-1)'也适用于我!我检查了它 – Nazeer

+2

@Nazeer:不,请修正*当前*代码。您有一个安全漏洞。说“我下次会这样做”并不够好。确实非常重要的一点是要保护自己免受SQL注入的困扰,现在没有比现在更好的开始了。 –

+0

嗯,谢谢..我对参数化SQL和PreparedStatement没有很好的了解。我现在要去学习它。 – Nazeer

0

没有没有必要使用:

if (rs.next()) { 

这段时间就够了,这个结果是两次。 相反,您可以使用:

boolean b = false; 
while (rs.next()) { 
    b = true; 
    ... 
} 

if(!b) { 
    JOptionPane.showMessageDialog(null, "Not Found"); 
} 

你必须在使用PreparedStatement代替,以避免任何SQL注入或语法错误。

+0

没有'if'语句,你将如何处理'else'?那里有选项(按照我的答案),但你不认为它是你的答案中要处理的东西。 –

+0

OP可以使用一个布尔值来判断是否有结果@JonSkeet –

+0

正确,所以在答案中指出。我的观点是他们不能*只是*删除if语句,正如你的答案所暗示的那样。 –

-2

嘿它跳过行,因为你在if子句中做rs.next(),然后再次在while。所以第一次迭代的时候实际上是第二次。最好的选择将是if语句ü应该写如果(rs.first())

+0

这对于只向前的'ResultSet'将会失败,如果成功,它将*仍然*跳过第一行,因为对first()的调用会跟着一个调用'下()'。确保'next'只被称为正确的次数更简单 - 请参阅我的答案以获得两个选项。 –

0

rs.next()将增加光标if因此,如果结果集只有一个通过查询返回然后while将再次移动光标一行,没有数据会得到打印改为使用do..while循环。

if (rs.next()) { 
      do { 
       System.out.print(rs.getString("idUser") + " ,"); 
       System.out.print(rs.getString("Name") + " ,"); 
       System.out.print(rs.getString("Email") + " ,"); 
       System.out.println(rs.getString("country") + " ."); 
      }while (rs.next()); 
     } 
0

感谢您的每一个答案。我发现把rs.relative(-1)也做这项工作。但上面的答案是很好的编码,比我的更好。谢谢大家。我是编程的新手,我会在编码中考虑所有的建议。由于

if (rs.next()) { 
    rs.relative(-1); 
     while (rs.next()) { 
      System.out.print(rs.getString("idUser") + " ,"); 
      System.out.print(rs.getString("Name") + " ,"); 
      System.out.print(rs.getString("Email") + " ,"); 
      System.out.println(rs.getString("country") + " ."); 
     } 
} 
+1

'relative(-1)'不会总是起作用,例如它不会与'TYPE_FORWARD_ONLY'结果集一起工作,这通常是默认设置。 –

+0

是的,我明白了!多谢兄弟 – Nazeer