program tip

ResultSet 예외-결과 세트 시작 전

radiobox 2020. 11. 7. 09:11
반응형

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)

내가 여기서 뭘 잘못하고 있니?


기본적으로 첫 번째 행 앞에 커서를 놓고 데이터를 요청합니다. 커서를 첫 번째 행으로 이동해야합니다.

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

if 문이나 루프에서이 작업을 수행하는 것이 일반적입니다.

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

모든 대답은 .next ()를 사용하거나 .beforeFirst ()와 .next ()를 사용합니다. 하지만 이건 왜 안돼?

result.first();

따라서 포인터를 첫 번째 레코드로 설정하고 거기에서 이동합니다. Java 1.2부터 사용할 수 있으며 ResultSet이 하나의 특정 레코드에 존재하는 모든 사람에게 이것을 언급하고 싶었습니다.


결과에 액세스하기 전에 result.next ()를 수행해야합니다. 하는 것은 매우 일반적인 관용구입니다.

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

next()첫 번째 행에서 값을 읽기 시작하기 전에 호출 해야합니다. beforeFirst커서 첫 번째 행 앞에 놓으 므로 읽을 데이터가 없습니다.


다른 패키지에 모든 쿼리 메서드를 포함하는 클래스를 만드는 것이 더 낫기 때문에 모든 클래스에 모든 프로세스를 입력하는 대신 해당 클래스에서 메서드를 호출하기 만하면됩니다.


데이터를 요청하기 전에 포인터를 첫 번째 행으로 이동해야합니다.

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

참고 URL : https://stackoverflow.com/questions/2120255/resultset-exception-before-start-of-result-set

반응형