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
        }

結果セットが空の場合、 falsezoeken.next()が返されます。その場合、while ループは実行されません。

アドバイス

単純なステートメントの代わりにPreparedStatementを使用します。単純なステートメントは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 に答える
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

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");
}

私はこれをフリーハンドで書いたので、間違いやコンパイルできない場合はご容赦ください。これはより明確であり、ローカル変数の使用を削減していると感じています。少なくとも 1 行ある場合は、その行を印刷し、行がなくなるまでこれを続けます。それ以外の場合は、「こんにちは」と言ってください。しかし、おそらく「結果が見つかりませんでした」というメッセージなど、「こんにちは」よりも便利なことを言いたいと思うでしょう。

于 2014-04-14T18:24:25.627 に答える
0

結果セット next() を使用しないと、サイズまたは結果セットの期間を確認できません。

ResultSet カーソルは、最初は最初の行の前に配置されます。

于 2012-12-11T22:27:40.550 に答える