2014-01-14 2 views
0

Я пытаюсь получить идентификатор personID из одной таблицы и использовать его во второй таблице, и напечатать каждое значение столбца от второй таблицы, однако я получаю сообщение об ошибке column index out of range, 3 < 1. Таблица заказов состоит из 3 столбцов.MySQL перед началом набора результатов

public void getPersonsOrders(String firstName){ 
    Connection con = connect();                        
    try{ 
     Statement s = con.createStatement(); 
     s.executeUpdate("use stl;"); 
     ResultSet rs1 = s.executeQuery("select personID from person where first_name = " +"'"+firstName+"'"+";");  //get persons ID no. 
     rs1.next(); 
     ResultSet rs2 = s.executeQuery("select * from orderr where personID = "+rs1.getInt(3)+";");    //use ID no. to   
     for(int i = 1; i < 4; i++){                    //retrive order 
      System.out.println(rs2.getInt(i)); 
     } 
    } 
    catch(SQLException e){ 
     System.out.println("3" +e.getMessage()); 
    } 
} 
+1

'rs1.getInt (3)' - есть только один столбец в 'rs1' (с индексом 1) –

+0

Взгляните на SQL JOINs – everton

ответ

1

Существует только один столбец вернулся в rs1, поэтому вы должны использовать rs1.getInt(1).

С другой стороны, это должно быть легко решена с помощью объединения:

SELECT o.* FROM order o 
LEFT JOIN person p 
ON p.personID = o.personID 
0
ResultSet rs1 = s.executeQuery("select personID from person where first_name = "+"'"+firstName+"'"+";"); 

Приведенный выше код будет давать результат, содержащий только один column.Use это, чтобы сделать его без ошибок.

ResultSet rs2 = s.executeQuery("select * from orderr where personID = "+rs1.getInt(3)+";");   //use ID no. to   
for(int i = 1; i <= 1; i++){ //retrive order 
    System.out.println(rs2.getInt(i)); 
} 
0

Несколько вопросов, я хотел бы упомянуть, чтобы помочь в написании лучшего кода:

1: если ПгвЬЫате содержит апостроф, ваш SQL заявление потерпит неудачу (Вы будете иметь одну цитату в firstrName, которое само по себе относится к одинарным кавычкам). Вам нужно либо преобразовать любые вхождения одинарной кавычки в firstName в две одинарные кавычки, либо использовать подготовленныеStatements.
2: Лучше использовать такие термины, как getInt («personID»), а не getInt (1), поэтому его легче читать.
3: Обычно мы используем if (rs1.next()) {} (ожидая один результат) или while (rs1.next()) {} (ожидая более одного результата) вместо rs1.next().
4: Мы обычно закрываем соединение, подготовилиСтатью и resultSet в обратном порядке, они объявляются в блоке finally блока try/catch/finally (проверяя, являются ли они нулевыми до их закрытия).

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