MySQL在结果集开始之前

时间:2014-01-14 16:00:01

标签: java mysql

我正在尝试从一个表中获取personID并在第二个表中使用它,并打印每个列的值 第二个表,但我收到错误column index out of range, 3 < 1。订单表由3列组成。

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());
    }
}

3 个答案:

答案 0 :(得分:1)

rs1中只返回了一列,因此您应该使用rs1.getInt(1)

另一方面,使用连接可以很容易地解决这个问题:

SELECT o.* FROM order o
LEFT JOIN person p
ON p.personID = o.personID

答案 1 :(得分:0)

ResultSet rs1 = s.executeQuery("select personID from person where first_name = "+"'"+firstName+"'"+";"); 

上面的代码将产生一个只包含一列的结果。使用它可以使它没有错误。

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));
 }

答案 2 :(得分:0)

我想提及的几个问题是为了帮助编写更好的代码:

1:如果firstName包含单引号,则您的sql语句将失败(您将在firstrName中有一个引号,它本身是单引号)。您需要将firstName中出现的任何单引号转换为两个单引号,或者使用preparedStatements 2:最好使用诸如getInt(“personID”)之类的术语而不是getInt(1),以便更容易阅读。
3:我们通常使用if(rs1.next()){}(期望一个结果)或while(rs1.next()){}(期望多个结果)而不是rs1.next()。
4:我们按照它们在try / catch / finally块的finally块中声明的相反顺序关闭连接,preparedStatement和resultSet(在关闭它们之前检查它们是否为null)。