2014-08-30 4 views
-1

Мои слайки кода не работают, просто продолжайте указывать курсор на первую запись, а когда я пытаюсь заменить оператор if на какое-то время или цикл, он просто петли к последней записи в моей таблице данных, когда я нажимаю кнопку что выполняет действиеПроблемы с навигацией JDBC с resultSet.next();

Try { 
    string host="jdbc:derby://localhost:1527/Employees"; 
    string uName="admin1"; 
    string uPass="admin" 
    string SQL="SELECT * FROM Workers"; 

    Connection con= DriverManager.getConnection(host, uName, uPass); 
    Statement stmt=Con.createStatement(); 
    ResultSet=stmt.executeQuery(SQL); 
    if (rs.next()) 
    {  
     string fname=rs.getString(first_name); 
     string lname=rs.getString(last_name):  
     txtFname.setText(fname);  
     txtLname.setText(lname); 
    } 
    else{ 
     rs.previous(); 
     //throw some sql error here} 
    } 
    catch(SQLException err) { 
     system.out.println(err.getMessage); 
    } 

как я обойти эту проблему и добраться до второй, третий, четвертый по п-й записи последовательно (не одновременно).

+0

удалить 'rs.previous()' от другого. Удалите все, что вам не нужно. –

+0

Не должен быть 'ResultSet rs = stmt.executeQuery (SQL);' вместо 'ResultSet = stmt.executeQuery (SQL);' и 'String' вместо' string' и 'try' вместо' Try' и 'System' вместо' system' и точка с запятой после 'string uPass =" admin "' ?? – Nivedita

ответ

0

Глядя на ResultSet.next()doc, называя rs.next() раз как if условие будет двигаться только курсор на одну позицию вперед от его исходного положения. Следовательно, вы видите только первую запись.

Замена вашего оператора if либо циклом while, либо for вызовет курсор для итерации по всему набору результатов. Тем не менее, каждая итерация вашего текущего цикла продолжает перезаписывать значение txtFname и txtLname с указанием «текущей» записи. Чтобы зафиксировать значение 2-й, 3-й, 4-й записей и т. Д., Вам нужно будет создать новый объект TextComponent на каждой итерации. Например,

// use some lists to capture intermediate records (for illustration only) 
List<JTextComponent> allFnames = new ArrayList<JTextComponent>(); 
List<JTextComponent> allLnames = new ArrayList<JTextComponent>(); 
while(rs.next()) { 
    string fname=rs.getString(first_name); 
    string lname=rs.getString(last_name): 

    JTextComponent txtFname = new JTextComponent(); // new object 
    txtFname.setText(fname); 
    allFnames.add(txtFname); 

    JTextComponent txtLname = new JTextComponent(); // new object 
    txtLname.setText(lname); 
    allLnames.add(txtFname); 
} 

Теперь в конце цикла while, два списка будет содержать все ваши записи.

0

javadoc говорит -

ResultSet#previous() -Moves the cursor to the previous row in this ResultSet 
object.When a call to the previous method returns false, the cursor is positioned 
before the first row. Any invocation of a ResultSet method which requires a 
current row will result in a SQLException being thrown. 

Таким образом, в определенный момент времени ваши if(rs.next()) возвращает ложные то остальное часть выполняется, и курсор перемещается к предыдущей строке в этом ResultSet. Затем, когда вызов предыдущего метода возвращает значение false, курсор располагается перед первой строкой. и тогда он будет бросать исключение

сделать это таким образом

if (!resultSet.next()) { 
    System.out.println("resultset does not data"); 
} else { 

    do { 
    string fname=rs.getString(first_name); 
    string lname=rs.getString(last_name):  
    txtFname.setText(fname);  
    txtLname.setText(lname); 
    } while (resultSet.next()); 
} 

еще одно проверить замечание Ниведита и рассортировать ошибки

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