0

我是编写程序的初学者,我为我的作业创建了一个搜索记录功能。

public void searchRecord(){
             for(int ct = 0; ct< 1; ct++){
             System.out.println("Please insert student ID");
             System.out.print("Student ID: ");//prompt for student ID to search
             String data = k.nextLine().trim();
             String sql = "SELECT * FROM Students WHERE StudentID = '"+data+"'";
             try{
                 rs = st.executeQuery(sql);                 
             if(rs.next()){    
                 displayRecord();
                 rs.next();
                 showMenu();
             }
             else{
                 System.out.print("No record found. ");
                 ct--;
             }
             }catch (Exception ex){
                 System.out.println("Problem searching.");
             } 
             }

但是,在我尝试从结果中获取数据后,它显示Invalid Cursor State. 如果我想检索数据,我将不得不执行以下Display next record方法:

try{
    if(rs.next()){
    displayRecord();
    }
else{
    rs.previous();
    System.out.println("No more records!");
}
}catch (Exception ex){
System.out.println("There is problem showing next data.");
}

我尝试在“displayRecord”之后的搜索记录方法中添加“rs.next”,但这并不能解决问题。有没有办法解决这个问题?

顺便说一下我的显示记录方法:

public void displayRecord(){//get and display data from current row of record
        try{
                    String ID = rs.getString(1);
                    String fname = rs.getString(2);
                    String lname = rs.getString(3);
                    String conNo = rs.getString(4);
                    String mail = rs.getString(5);
                    String plate = rs.getString(6);
                    Date date = rs.getDate(7);
                    System.out.print("Student ID: "+ID+"\nName: "+fname+" "+lname+"\nCar Number: "+plate+"\nContact Number: 0"+conNo+"\nE-Mail Address: "+mail+"\nDate Registered: "+date);

        }catch (Exception ex){
            System.out.println(ex);
        }
}

任何帮助或建议表示赞赏。

4

1 回答 1

0

我不太明白你的代码应该做什么。但我怀疑您并不完全了解 JDBC 语句和结果集是如何工作的。

如果你执行一个返回很多行的查询,你会这样写:

ResultSet rs = stmt.executeQuery(sqlQuery);
while (rs.next()) {
    String id = rs.getString(1);
    String name = rs.getString(2);
    // do something with the current row
}

请注意,ResultSet实例允许您访问当前结果行中的数据。next()两者都前进到下一个结果行并告诉您是否有下一行(或者您是否已经超过了最后一行)。最初,它位于第一个结果行之前。所以next()需要在访问第一行的数据之前调用。但这都是在单行中完成的while (rs.next())

在您的情况下,我希望查询仅返回单个结果行,因为StudendID很可能是唯一键。所以代码看起来像这样:

ResultSet rs = stmt.executeQuery(sqlQuery);
if (rs.next()) {
    String id = rs.getString(1);
    String name = rs.getString(2);
    // do something with the current row
} else {
    // no student with specified ID found
}

但是,您的代码包含两个对 的调用next()和另一个对 的调用previous(),这令人困惑。

出现错误消息Invalid Cursor State表明您正在尝试访问当前行的数据,而实际上结果集位于结果集开始之前或结束之后。

于 2013-09-01T13:55:11.783 回答