2014-09-06 3 views
1

Это одно из моих поведения кнопок. моя проблема - resultset.first(); не возвращает курсор в первую строку. это мой кодresultset.first(); не возвращает его в первую строку

public void Menu3_next(JTextField jTextField1, JTextField jTextField2, JComboBox jComboBox1, JComboBox jComboBox2){ 
    Connect();  
    try{ 
     statement = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
     resultset = statement.executeQuery("select * from Menu3"); 
     resultset.first(); 
     while(resultset.next()){ 
      jTextField1.setText(String.format("%s", resultset.getString("idMenu3"))); 
      jTextField2.setText(String.format("%s", resultset.getString("Name"))); 
     } 
     String query1 = String.format("select * from Menu1");// where idMenu1 = '%s'",strBrand); 
     resultset = statement.executeQuery(query1); 
     resultset.first(); 
     while(resultset.next()){ 
      jComboBox1.addItem(String.format("%s", resultset.getString("Brand"))); 
     } 
     String query2 = String.format("select * from Menu2");// where idMenu= '%s'",strPart); 
     resultset = statement.executeQuery(query2); 
     resultset.first(); 
     while(resultset.next()){ 
      jComboBox2.addItem(String.format("%s", resultset.getString("Part"))); 
     } 
    } 
    catch(SQLException ex){ 
     System.out.println(ex); 
    } 
} 

TIA Ребята. когда я нажимаю кнопку, она должна показывать следующую, следующую и следующую, до последней строки. но это не так. он просто показывает последнюю строку.

+0

Есть ли причина пропустить первый ряд? Вы вызываете 'resultset.first()', а затем 'resultset.next()', поэтому первым доступным результатом является вторая строка. – Tom

ответ

0

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

Если вы не указали явный ORDER BY, порядок строк в возвращаемом наборе будет произвольным. Решение вашей проблемы, скорее всего, чтобы указать порядок в запросе:

SELECT * FROM Menu3 ORDER BY ...

Кроме того, использование select * считается плохой практикой, см Bad habits to kick : using SELECT */omitting the column list причины, почему (также Why is SELECT * considered harmful).

+0

Итак, решение для пропущенных записей набора результатов - это инструкция 'ORDER BY'? Звучит интересно. Вы можете это объяснить? – Tom

+0

@Tom Нет, конечно, это не так, и я никогда не утверждал этого, не так ли? Мой ответ должен был указывать на то, что строки могут не отображаться в определенном порядке, и поэтому их можно воспринимать как пропущенные строки, если ожидается, что первая строка в наборе будет отображаться позже. После повторного чтения вопроса кажется, что проблема здесь заключается в использовании 'first()' и 'next()'. По-моему, «ЗАКАЗАТЬ» все еще имеет значение. – jpw

+0

im используя заказ не используя первый() но все тот же: 3 –

1

while (resultset.next()) { ... } Идиома ожидает, что курсор до первый ряд. Когда вы вызываете resultset.first(), курсор перемещается в первую строку, а затем resultset.next() снова перемещает курсор вперед, эффективно пропуская первую строку.

закомментируйте все resultset.first() заявления исправить, например:

resultset = statement.executeQuery("select * from Menu3"); 
//resultset.first(); 
while (resultset.next()) { 
    jTextField1.setText(String.format("%s", resultset.getString("idMenu3"))); 
    jTextField2.setText(String.format("%s", resultset.getString("Name"))); 
} 
+0

все тот же. он по-прежнему получает последнюю строку и отображает это. btw Спасибо: 3 –

0

Там нет необходимости вызывать first() здесь. После выполнения запроса ResultSet расположен до первая строка. Последующие вызовы next() перемещают его вперед, пока не будет больше строк.

Ваш текущий код имеет следующие этапы:

  1. Продукция ResultSet (позиционируется перед тем первая строка)
  2. Вызов first() (расположен на первом ряду)
  3. Вызов next() в петле (расположенных на втором , третий и т. д.)
    • Вы делаете что-то с этой строкой (вторая, третья и т. д., но не первый)

Позвонив first() и последующих вызовах next(), вы пропуская первую строку.

Вы, кажется, есть идея, что ResultSet тот же объект в течение всего метода: это не так, каждый вызов executeQuery производит новыхResultSet.И как вопрос правильного закрытия ресурсов, вы должны начать использовать try-with-resources с ресурсами JDBC, чтобы убедиться, что ResultSet, Statement и Connection закрыты правильно после того, как вы закончите с ними.


Что касается второго вопроса: вы используете setText, setText заменить все содержимое поля. Поэтому, конечно, он будет показывать только последнюю строку.

PS При использовании stackoverflow вы должны придерживаться одной проблемы на каждый вопрос.

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