2013-05-15 3 views
0

Я работаю над проектом, в котором пользователь может собрать компоненты класса йоги. Он распространяется по нескольким файлам и, следовательно, слишком велик, чтобы все это здесь. Проблема, с которой я столкнулся, заключается в одном методе, когда мне нужно перебирать горизонтальные столбцы результирующего набора, возвращающего только ОДИН ROW из базы данных MySQL.MySQL - Итерирование по столбцам в результирующем наборе

Я понимаю, что мне нужно поместить курсор в первую строку набора результатов (что, я считаю, я делаю). Поскольку у меня есть только одна строка в результирующем наборе (моя переменная является rset), я должен использовать rset.next() только один раз, правильно? И тогда я должен был бы использовать простой цикл для итерации по каждому столбцу и добавления значения к моему String Builder. Я хочу пропустить первый столбец и добавить каждое последующее значение, пока цикл не достигнет столбцов с нулевыми значениями. Я не могу найти, почему мой код продолжает возвращать исключение «Перед началом набора результатов».

Может ли кто-нибудь заметить что-то не так?

Я выведу метод, а также метод, вызываемый этим методом. (Я отправил это другой вопрос, но я считаю, что характер мой вопрос изменилось, поэтому я повторно отправляю это с другим названием.)

// 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 + "'"); 
     rset.next(); 
     System.out.println("Column count is " + countColumnsInTable(tableName)); 
     for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1) 
      System.out.println("test"); 
      strBuilderList.append(rset.getString(i) + "\n"); // This is line 126 as indicated in the exception message 
      } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    strList = strBuilderList.toString(); 
    return strList.replaceAll(", $",""); // Strips off the trailing comma 
} 

// Method for getting the number of columns in a table using metadata 
public int countColumnsInTable(String sectionType) { 
    int count = 16; 
    try { 
     statement = connection.createStatement(); 
     rset = statement.executeQuery("SELECT * FROM " + sectionType); 
     rsMetaData = rset.getMetaData(); 
     count = rsMetaData.getColumnCount(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return count; 
} 

А вот первая часть, за исключением сообщение:

Column count is 26 
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:126) 
at YogaSectionDesigner$5.actionPerformed(YogaSectionDesigner.java:231) 

ответ

4

кажется мне, как вы повторно используя rset между вашими двумя способами. Поэтому, когда countColumnsInTable завершено, переменная rset указывает на другой набор результатов, который был ранее, в listPosesInSection. И этот набор результатов не был расширен с помощью next, поэтому сообщение об ошибке, которое вы получаете. Вероятно, вы захотите назначить его локальному ResultSet в этом методе.

public int countColumnsInTable(String sectionType) { 
    int count = 16; 
    try { 
     Statement statement = connection.createStatement(); 
     ResultSet rset = statement.executeQuery("SELECT * FROM " + sectionType); 
     ResultSetMetaData rsMetaData = rset.getMetaData(); 
     count = rsMetaData.getColumnCount(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    // Remember to clean up 
    return count; 
} 
+0

Это сделало это! Спасибо! –

1

попробовать это

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()){ 
      System.out.println("Column count is " + countColumnsInTable(tableName)); 
      for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1) 
       System.out.println("test"); 
       strBuilderList.append(rset.getString(i) + "\n"); 
       } 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     strList = strBuilderList.toString(); 
     return strList.replaceAll(", $",""); // Strips off the trailing comma 
    } 
+0

Спасибо за помощь! –

1

RSET является объектом ResultSet

я думаю, что вы используете один и тот же объект ResultSet в listPosesInSection, а также в countColumnsInTable

так, что здесь происходит, в listPosesInSection rset содержится результат, и вы также перемещаете курсор, но снова в countColumnsInTable вы используете тот же самый набор, чтобы он был перезаписан, т. е. он удерживает новый результат теперь, вы получаете количество столбцов, но поскольку он содержит новый результат, теперь курсор будет перед первой записью, поэтому используйте другой объект Resultset в countColumnsInTable

+0

Спасибо! Вы здоровы! –

Смежные вопросы