web-dev-qa-db-ja.com

ResultSet例外-結果セットの開始前

ResultSetオブジェクトからデータを取得できません。ここに私のコードがあります:

    String sql = "SELECT type FROM node WHERE nid = ?";
    PreparedStatement prep = conn.prepareStatement(sql);
    int meetNID = Integer.parseInt(node.get(BoutField.field_meet_nid));
    prep.setInt(1, meetNID);

    ResultSet result = prep.executeQuery();
    result.beforeFirst();
    String foundType = result.getString(1);

    if (! foundType.equals("meet")) {
        throw new IllegalArgumentException(String.format("Node %d must be of type 'meet', but was %s", meetNID, foundType));
    }

エラートレース:

Exception in thread "main" Java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:1072)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:986)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:981)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:926)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.Java:841)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.Java:5656)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.Java:5576)
    at nth.cumf3.nodeImport.Validator.validate(Validator.Java:43)
    at nth.cumf3.nodeImport.Main.main(Main.Java:38)

ここで何が間違っていますか?

65
Nick Heiner

基本的に、最初の行の前にカーソルを配置し、データを要求します。カーソルを最初の行に移動する必要があります。

 result.next();
 String foundType = result.getString(1);

Ifステートメントまたはループでこれを行うのが一般的です。

if(result.next()){
   foundType = result.getString(1);
}
142

すべての答えは、.next()を使用するか、.beforeFirst()を使用してから.next()を使用します。しかし、なぜこれは:

result.first();

ポインタを最初のレコードに設定し、そこから先に進みます。 Java 1.2以降で利用可能であり、特定のレコードのResultSetが存在するすべての人にこのことを言及したかっただけです。

9

結果にアクセスするには、result.next()を実行する必要があります。それは非常に一般的なイディオムです

ResultSet rs = stmt.executeQuery();
while (rs.next())
{
   int foo = rs.getInt(1);
   ...
}
6
Paul Tomblin

最初の行から値の読み取りを開始する前に、next()を呼び出す必要があります。 beforeFirstはカーソルを置きますbefore最初の行なので、読み込むデータはありません。

2
Dan

別のパッケージにすべてのクエリメソッドを含むクラスを作成すると、すべてのクラスのすべてのプロセスを入力するのではなく、そのクラスからメソッドを呼び出す方が良いでしょう。

2
Pedro

データを要求する前に、ポインターを最初の行に移動する必要があります。

result.beforeFirst();
result.next();
String foundType = result.getString(1);
1
ryanprayogo