ResultSet-uitzondering – vóór start van resultatenset

Ik heb problemen met het ophalen van gegevens van een ResultSet-object. Hier is mijn code:

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

Het foutspoor:

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)

Wat doe ik hier verkeerd?


Antwoord 1, autoriteit 100%

In principe plaatst u de cursor voor de eerste rij en vraagt u vervolgens om gegevens. U moet de cursor naar de eerste rij verplaatsen.

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

Het is gebruikelijk om dit in een if-statement of lus te doen.

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

Antwoord 2, autoriteit 6%

Elk antwoord gebruikt .next()of gebruikt .beforeFirst()en dan .next(). Maar waarom niet dit:

result.first();

Dus je zet gewoon de aanwijzer op de eerste record en ga vanaf daar. Het is beschikbaar sinds java 1.2 en ik wilde dit even vermelden voor iedereen wiens ResultSetuit één specifiek record bestaat.


Antwoord 3, autoriteit 6%

Je moet een result.next() doen voordat je toegang hebt tot het resultaat. Het is een veelvoorkomend idioom om te doen

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

Antwoord 4, autoriteit 2%

Je moet next()aanroepen voordat je waarden vanaf de eerste rij kunt lezen. beforeFirstplaatst de cursor vóórde eerste rij, dus er zijn geen gegevens om te lezen.


Antwoord 5

Het is beter als u een klasse maakt die alle querymethoden, inclusief, in een ander pakket heeft, dus in plaats van het hele proces in elke klasse te typen, roept u gewoon de methode van die klasse aan.

Other episodes