0

次のスニペットは、データベースから写真の名前を取得します。

        Context context = new InitialContext();
        DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog");
        Connection connection = ds.getConnection();
        String sqlQuery = "select nameofthephoto from photocaptions where useremail='" + email + "'";
        PreparedStatement statement = connection.prepareStatement(sqlQuery);
        set = statement.executeQuery();
        if(set == null) {
            System.out.println("set is null !");
        } else if(set != null) {
            System.out.println("set is not null !");
            System.out.println(set.next());
            System.out.println(set.getString("nameofthephoto")); // last statement
          }

else-if ブロックが実行されます

コードの最後の 2 つのステートメントの結果は次のとおりです。

false

最後のステートメントは例外をスローします。

java.sql.SQLException: 現在のカーソル位置での操作が無効です。

表には、クエリに一致する「データ行」が 1 つしかありませんwhile.next()。では、なぜ上記のスニペットの最後のステートメント (スタックトレースがこれを示している) が例外をスローするのでしょうか?_

4

2 に答える 2

0

ドキュメントから直接、

next メソッドの呼び出しが false を返すと、カーソルは最後の行の後に配置されます。現在の行を必要とする ResultSet メソッドを呼び出すと、SQLException がスローされます。

つまり、行リストを渡したので、レコードをフェッチする次のステートメントはエラーをスローしています。

next は、行がない場合は false を返し、行がある場合は true を返します。データベースに行があるかどうかを確認できますか。

于 2012-05-16T13:58:57.253 に答える
0

set.next() カーソルを現在の位置から 1 行前に移動し、true を返します。しかし、あなたの場合、カーソルを前方に移動するためのデータが結果セットにありません。したがって、ご希望の操作は実行できません。

于 2012-05-16T14:00:36.613 に答える