使用resultSet.next()进行JDBC导航的问题;

时间:2014-08-30 08:06:42

标签: java

我的下面的代码不起作用,只是将光标指向第一条记录,当我尝试用while或for循环替换if语句时,它只是循环到我的数据表中的最后一条记录,当我点击执行操作的按钮

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

如何解决这个问题并获得第二,第三,第四到第n个记录先后(不是同时)。

2 个答案:

答案 0 :(得分:0)

查看ResultSet.next() doc,将rs.next()作为if条件调用一次只会将光标从其起始位置向前移动一个位置。因此,您只能看到第一条记录。

ifwhile循环替换for语句将导致光标迭代整个结果集。但是,当前循环的每次迭代都会覆盖txtFnametxtLname的值与“当前”记录的值。为了捕获第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循环结束时,这两个列表将包含您的所有记录。

答案 1 :(得分: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())返回false,然后执行else部分,光标移动到此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());
}

还有一件事要检查Nivedita的评论并理清错误