2013-09-01 85 views
0

我是一名初级写作程序,我为我的任务创建了一个搜索记录功能。JDBC - 无效光标状态

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

我尝试添加“rs.next”在“displayRecord后”的搜索记录的方法,但它不会解决问题。无论如何要解决这个问题吗?

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

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

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

+0

尝试使用'while rs.next()'而不是'if' – user75ponic

+0

阅读[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)并且永远不要再这样做:'String sql = “SELECT * FROM Student WHERE StudentID ='”+ data +“'”' – mustaccio

+0

@mustaccio omg,我现在了解SQL注入。谢谢你的提示。 @Polppan,但该方法只返回1行的结果,因为** StudentID **是一个唯一的键,并不适合使用'而rs.next()' –

回答

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()另有1 previous(),这是令人困惑的。

出现错误消息无效的光标状态表示您试图访问当前行的数据,而实际上结果集位于结果集的开始位置之前或结束位置之后。

+0

是的,我仍然是一个刚刚触及的总新手编程了3个月,我在线学习了JDBC语句。所以我会尝试在这里解释和澄清一些事情:
1.'StudentID'是一个唯一的键,搜索方法将只返回单行
2.我之所以称为next()是因为当我尝试做一些显示结果(更新/删除)它显示错误'无效的游标状态'。但是,当我执行我的'displayNextRecord'方法时,它返回来自同一行的结果,只有我能够做一些事情用它。 –

相关问题