ResultSet exception - before start of result set

JavaJdbc

Java Problem Overview


I'm having trouble getting data from a ResultSet object. Here is my 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));
	}

The error trace:

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)

What am I doing wrong here?

Java Solutions


Solution 1 - Java

Basically you are positioning the cursor before the first row and then requesting data. You need to move the cursor to the first row.

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

It is common to do this in an if statement or loop.

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

Solution 2 - Java

Every answer uses .next() or uses .beforeFirst() and then .next(). But why not this:

result.first();

So You just set the pointer to the first record and go from there. It's available since java 1.2 and I just wanted to mention this for anyone whose ResultSet exists of one specific record.

Solution 3 - Java

You have to do a result.next() before you can access the result. It's a very common idiom to do

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

Solution 4 - Java

You have to call next() before you can start reading values from the first row. beforeFirst puts the cursor before the first row, so there's no data to read.

Solution 5 - Java

It's better if you create a class that has all the query methods, inclusively, in a different package, so instead of typing all the process in every class, you just call the method from that class.

Solution 6 - Java

You need to move the pointer to the first row, before asking for data:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNick HeinerView Question on Stackoverflow
Solution 1 - JavaVincent RamdhanieView Answer on Stackoverflow
Solution 2 - JavaMmynameStackflowView Answer on Stackoverflow
Solution 3 - JavaPaul TomblinView Answer on Stackoverflow
Solution 4 - JavaDanView Answer on Stackoverflow
Solution 5 - JavaPedroView Answer on Stackoverflow
Solution 6 - JavaryanprayogoView Answer on Stackoverflow