2013-05-09 77 views
1

我有一個Java方法,它應該從一個MySQL行獲取列值並創建一個帶有值的字符串。運行時,它會生成SQL錯誤1078「結果集啓動之前」。獲取SQL錯誤1078在Java程序中啓動結果集之前

這裏是班級中的錯誤是發生(問題是listPosesInSection方法:

/** 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", "[email protected]"); 
     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 <= 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<String> 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 < 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 < 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 < 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(); 
    } 
} 

}

這裏是錯誤列表的開頭:

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) 
+0

請把代碼段 – Stephan 2013-05-09 12:32:44

+0

的洞代碼塊我認爲問題不在於這個方法,你可以發佈'countColumnsInTable'方法嗎? – 2013-05-09 12:53:28

+0

編輯爲包含整個代碼塊。 – 2013-05-10 11:32:35

回答

0

可能你可以看看這個:

ResultSet exception - before start of result set

有同樣的問題。解決這個問題。

+0

我看到你的問題的解決方案是確保從具有.next()將光標移動到第一行的循環開始,但我已經在我的代碼中執行了該操作。似乎它應該工作。 – 2013-05-10 11:35:31

相關問題