2017-05-20 3 views
0

これはデータベースからいくつかの行を出力する簡単なコードです。しかし、私がこれを実行すると何も画面に表示されません。私は問題がrs.next()メソッドが行をスキップしていると考えました。だから私はそれを回避するか、またはrs.next()メソッドの位置をリセットすることはできますか?行をスキップすることを避ける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

可能な重複http://stackoverflow.com/questions/867194/java-resultset-how-to-check-if-there-are -any-results) –

答えて

3

まず、そのようにSQLを構築停止 - パラメータ化されたSQLとPreparedStatementを使用しています。あなたの現在のコードはSQLインジェクション攻撃に対して脆弱です。

基本的には、(whileに最初ifに)2回続けてrs.next()を呼び出すことはありません...あなたは簡単にdo/whileループにあなたの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()); 
} 

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"); 
} 
:または ちょうどあなたは、いくつかの 結果を見てきたことを検出するために、別の変数で、 whileループを持っています

(また、あなたのResultSetなどを閉じるようにして、リソース-してみてください、とだけstdoutにスタックトレースを印刷するには、例外を処理するための適切な方法はほとんど決して使用する必要があります...)を使用する

+0

あなたの答えをありがとう。まあ、私は将来のコードでパラメータ化されたSQLとPreparedStatementを使用します。 'rs.relative(-1)'も私のために働いています!私はそれをチェックしました – Nazeer

+2

@Nazeer:いいえ、あなたの現在の*コードを修正してください。あなたにはセキュリティ上の脆弱性があります。 「次回はすぐにやるよ」と言ってもそれは十分ではありません。 SQLインジェクションから自分自身を守る習慣に入ることは本当に本当に重要なことです。今よりも始めるのが時間がありません。 –

+0

まあありがとう。私はパラメータ化されたSQLとPreparedStatementの知識があまりない。私は今それを学ぶつもりです。 – Nazeer

0

ありません必要はありません:

if (rs.next()) { 

これで結果は2回になります。 代わりにあなたが使用することができます。

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

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

をあなたは任意のSQLインジェクションや構文エラーを回避するために、代わりにPreparedStatementを使用する必要があります。

+0

'if'ステートメントがなければ、' else'をどのように扱いますか?そこにはオプションがあります(私の答えによると)、あなたはあなたの答えで扱われるものとしてそれを認識しません。 –

+0

OPはwhileの中でブール値を使用して結果があるかどうかを知ることができます。 –

+0

そうです。答えにそのことを示してください。私の指摘は、あなたの答えが暗示しているように、 'if'ステートメントを単に*削除することはできないということです。 –

-2

if節でrs.next()を実行してからもう一度whileを実行すると、行がスキップされています。最初の繰り返しは実際には2番目の行です。最良のオプションは、(rs.first())

+0

転送専用の 'ResultSet'では失敗し、成功した場合は' first() 'への呼び出しの後に最初の行をスキップします'next()' 'next'が正しい回数だけ呼ばれていることを確認する方が簡単です - 私の答えは2つのオプションがあります。 –

0

rs.next()は、結果セットは、クエリによって返された一列のみを持っている場合、その後whileは再びカーソルを移動すると、データが印刷を取得しませんのでifにカーソルをインクリメントする場合uが書くべきif節になります代わりに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") + " ."); 
     } 
} 
([いずれかの結果があるかどうかを確認する方法のJavaのResultSet]の
+1

'relative(-1)'は常に動作するとは限りません。例えば、通常はデフォルトの 'TYPE_FORWARD_ONLY'結果セットでは動作しません。 –

+0

はい私はそれを考え出した!ありがとう兄貴 – Nazeer

関連する問題