title: Getting SQL error 1078 Before start of result set in Java program
body: <p>I have a Java method that is supposed to get column values from one MySQL row and create a string with the values.  When run, it generates a SQL error 1078 "Before start of result set."</p>
  
  <p>Here is the the class in which the error is occuring (Problem is in listPosesInSection method:</p>
  
  <pre><code>/** Class used to access the database */
  
  import java.sql.*;
  import java.util.ArrayList;
  
  import javax.swing.JOptionPane;
  
  public class YogaDatabaseAccess {
  String dbUrl = "jdbc:mysql://localhost/yoga";
  private Connection connection;
  private ResultSet rset;
  private ResultSetMetaData rsMetaData;
  private Statement statement;
  private PreparedStatement pStatementAll = null;
  private PreparedStatement pStatementPartial = null;
  
  // Strings for queries and updates
  String strListPosesNotPrimary;
  String strInsertNewClass;
  String strInsertNewSection;
  String strInsertNewPose;
  String strUpdateClass;
  String strUpdateSection;
  String strUpdatePose;
  String strArrangePoseOrder;
  
  private String[] poseArray;
  
  // Constructor
  YogaDatabaseAccess() {
      connectToDatabase();
  }
  
  // Method that connects to database
  private void connectToDatabase() {
      try {
          connection = DriverManager.getConnection(dbUrl, "Kyle", "Kullerstrand@2");
          System.out.println("Database connected");
      }
      catch(SQLException e) {
          System.out.println(e.getMessage());
      }
  }
  
  // Query that returns lists to be used with combo boxes
  public String listForBoxes(String listName) {
      // List to be returned
      String strList = "";
  
      // Determine name of the database table for this list
      String listTableName;
      if (listName == "pose")
          listTableName = listName + "s";
      else if (listName == "class")
          listTableName = listName + "es";
      else
          listTableName = listName;
  
      // Determine the database column name for this list
      String listColumnName = listName + "_name";
  
      // Run the query
      try {
          statement = connection.createStatement();
          rset = statement.executeQuery("SELECT DISTINCT " + listColumnName + " FROM " + listTableName +
                  " ORDER BY " + listColumnName);
          while (rset.next()){
              strList = strList + rset.getString(listColumnName) + ", ";
          }
      } catch (SQLException e) {
          e.printStackTrace();
      }
      return strList;
  }
  
  // Query that returns list of primary poses for a section
  public String listPrimaryPoses(String sectionName) {
      // List to be returned
      String strList = "";
  
      // Run the query
      try {
          statement = connection.createStatement();
          rset = statement.executeQuery("SELECT DISTINCT pose_name FROM poses WHERE primarily_suitable_for = '" + sectionName + 
                  "' OR primarily_suitable_for = 'Anything' ORDER BY pose_name");
          while (rset.next()){
              strList = strList + rset.getString("pose_name") + ", ";
          }
      } catch (SQLException e) {
          e.printStackTrace();
      }
      return strList;
  }
  
  // Query that returns list of secondary poses for a section
  public String listSecondaryPoses(String sectionName) {
      // List to be returned
      String strList = "";
  
      // Run the query
      try {
          statement = connection.createStatement();
          rset = statement.executeQuery("SELECT DISTINCT pose_name FROM poses WHERE sometimes_suitable_for = '" + sectionName + "' ORDER BY pose_name");
          while (rset.next()){
              strList = strList + rset.getString("pose_name") + ", ";
          }
      } catch (SQLException e) {
          e.printStackTrace();
      }
      return strList;
  }
  
  // Query that returns the poses within a specific section
  public String listPosesInSection(String tableName, String sectionName) {
      String strList;
      StringBuilder strBuilderList  = new StringBuilder("");
      // Run the query
      try {
          statement = connection.createStatement();
          // Query will collect all columns from one specific row
          rset = statement.executeQuery("SELECT * FROM " + tableName + " WHERE " + tableName + "_name = '" + sectionName + "'");
          while (rset.next()) {
              for (int i = 2; i &lt;= countColumnsInTable(tableName); i++) // First value (0) is always null, skip section name (1)
                  if (rset.getString(i) != null) // If column has a value
                      strBuilderList.append(rset.getString(i) + "\n");
          } 
      } catch (SQLException e) {
          e.printStackTrace();
      }
      strList = strBuilderList.toString();
      return strList.replaceAll(", $",""); // Strips off the trailing comma
  }
  
  // Insert statement that inserts a new class into the classes table
  public void insertNewClass(String className) {
      /** String insert = "INSERT INTO poses (pose_name, primarily_suitable_for, sometimes_suitable_for) values(?, ?, ?)";
      System.out.println("About to create the prepared statement");
      // Run the insert
      try {
          pStatement = connection.prepareStatement(insert);
          // statement.execute("INSERT IGNORE INTO poses VALUES ('" + poseName + "', '" + suitableFor + "', '" + suitableForSometimes + "')");
          pStatement.setString(1, poseName);
          pStatement.setString(2, suitableFor);
          pStatement.setString(3, suitableForSometimes);
  
          System.out.println("Created the prepared statement");
  
            // execute query, and return number of rows created
          pStatement.executeUpdate();
      } catch (SQLException e) {
          e.printStackTrace();
      } */
  }
  
  // Insert statement that inserts a new pose into poses table
  public void insertNewPose(String poseName, String suitableFor, String suitableForSometimes) {
      String insertAll = "INSERT INTO poses (pose_name, primarily_suitable_for, sometimes_suitable_for) values(?, ?, ?)";
      String insertPartial = "INSERT INTO poses (pose_name, primarily_suitable_for) values(?, ?)";
      // Run the insert
      try {
          if (suitableForSometimes == "NULL") {  // Insert statement contains a null value for sometimes suitable column
              pStatementPartial = connection.prepareStatement(insertPartial);
              pStatementPartial.setString(1, poseName);
              pStatementPartial.setString(2, suitableFor);
              pStatementPartial.executeUpdate();
          } else {  // Insert statement contains values for all three columns
              pStatementAll = connection.prepareStatement(insertAll);
              pStatementAll.setString(1, poseName);
              pStatementAll.setString(2, suitableFor);
              pStatementAll.setString(3, suitableForSometimes);
              pStatementAll.executeUpdate();
          }
      } catch (SQLException e) {
          System.err.println("SQLException: " + e.getMessage() + ":" + e.getSQLState());
          JOptionPane.showMessageDialog(null, "This pose already exists.");
      } finally {
          SQLWarning w;
          try {
              for (w = connection.getWarnings(); w != null; w = w.getNextWarning())
                      System.err.println("WARNING: " + w.getMessage() + ":" + w.getSQLState());
          } catch (SQLException e) {
              e.printStackTrace();
              JOptionPane.showMessageDialog(null, "An unknown error in the yoga design program has occurred.");
          }
      }
  }
  
  // Insert statement that inserts a new section into warmup, work or restore sections 
  public void insertNewSection(String sectionType, String sectionName, ArrayList&lt;String&gt; poses) {
      System.out.println("insertNewSection method was called");
      int maxColumns = countColumnsInTable(sectionType);
      poseArray = new String[poses.size()];
      poseArray = poses.toArray(poseArray);
      if (poseArray.length == 0)
          JOptionPane.showMessageDialog(null, "There are no poses in this section. Please add poses.");
  
      // Create a list of columns of the table for the INSERT statement
      StringBuilder columns = new StringBuilder(sectionType + "_name");
      for (int c = 1; c &lt; maxColumns; c++) 
          columns.append(", pose_" + c);
  
      // Create a string list of poses, separated by commas, from the array
      StringBuilder values = new StringBuilder();
      values.append("'" + poseArray[0] + "'");
      for (int v = 1; v &lt; poseArray.length - 1; v++)
          values.append(", '" + poseArray[v] + "'");
      // make sure query uses correct number of columns by padding the query with NULL
      for (int i = poseArray.length; i &lt; maxColumns; i++) 
          values.append(", NULL");
      String posesToAddToSection = values.toString();
  
      // The string containing the entire insert statement
      String insert = "INSERT INTO " + sectionType + " (" + columns + ") VALUES ('" + sectionName + "', " + posesToAddToSection + ")";
  
      // Run the insert
      try {
          statement = connection.createStatement();
          statement.executeUpdate(insert);
      } catch (SQLException e) {
          System.err.println("SQLException: " + e.getMessage() + ":" + e.getSQLState());
          JOptionPane.showMessageDialog(null, "An error in the yoga design program has occurred. SQLException: " + 
                  e.getMessage() + ":" + e.getSQLState());
      } finally {
          SQLWarning w;
          try {
              for (w = connection.getWarnings(); w != null; w = w.getNextWarning())
                      System.err.println("WARNING: " + w.getMessage() + ":" + w.getSQLState());
          } catch (SQLException e) {
              e.printStackTrace();
              JOptionPane.showMessageDialog(null, "An unknown error in the yoga design program has occurred.");
          }
      }
  }
  
      // Statement that deletes rows from tables
  public void deleteRow(String tableName, String columnName, String rowName) {
  
      String delete = "DELETE FROM " + tableName + " WHERE " + columnName + " = '" + rowName + "'";
      // Run the insert
      try {
          statement = connection.createStatement();
          statement.executeUpdate(delete);
          System.out.println("Delete statement was run on Java's end.");
      } catch (SQLException e) {
          System.err.println("SQLException: " + e.getMessage() + ":" + e.getSQLState());
          JOptionPane.showMessageDialog(null, "Sorry, something went wrong: SQLException: " + 
          e.getMessage() + ":" + e.getSQLState());
      } finally {
          SQLWarning w;
          try {
              for (w = connection.getWarnings(); w != null; w = w.getNextWarning())
                      System.err.println("WARNING: " + w.getMessage() + ":" + w.getSQLState());
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
  }
  
  // Method for getting the number of columns in a table using metadata
  public int countColumnsInTable(String sectionType) {
      int count = 16;
      try {
          // System.out.println(sectionType);
          statement = connection.createStatement();
          rset = statement.executeQuery("SELECT * FROM " + sectionType);
          rsMetaData = rset.getMetaData();
          count = rsMetaData.getColumnCount();
          // System.out.println("Column count is " + count);
      } catch (SQLException e) {
          e.printStackTrace();
      }
      return count;
  }
  
  // Close the database and release resources
  public void closeDatabase() {
      try {
          connection.close();
      } catch (SQLException e) {
          e.printStackTrace();
      }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>And here is the beginning of the error list:</p>
  
  <pre><code>java.sql.SQLException: Before start of result set
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
  at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
  at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855)
  at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5773)
  at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693)
  at YogaDatabaseAccess.listPosesInSection(YogaDatabaseAccess.java:125)
  at YogaSectionDesigner$5.actionPerformed(YogaSectionDesigner.java:229)
  </code></pre>