JDBC - 无效的游标状态

Posted

技术标签:

【中文标题】JDBC - 无效的游标状态【英文标题】:JDBC - Invalid Cursor State 【发布时间】:2013-09-01 12:59:51 【问题描述】:

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

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

感谢任何帮助或建议。

【问题讨论】:

尝试使用while rs.next() 而不是if 阅读 SQL injection 并不再这样做:String sql = "SELECT * FROM Students WHERE StudentID = '"+data+"'" @mustaccio omg,我现在了解 SQL 注入。谢谢你的提示。 @Polppan 但该方法仅返回 1 行结果,因为 StudentID 是唯一键,不适合使用 while rs.next() 【参考方案1】:

我不太明白您的代码应该做什么。但我怀疑您并不完全了解 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表明您正在尝试访问当前行的数据,而实际上结果集位于结果集开始之前或结束之后。

【讨论】:

是的,我仍然是一个刚接触编程 3 个月的初学者,并且我自己在网上学习了 JDBC 语句。因此,我将在这里尝试解释和澄清一些事情:1。 StudentID是唯一键,搜索方法只会返回单行2。我之所以调用next() 是因为当我尝试对显示的结果执行某些操作(更新/删除)时,它会显示错误Invalid Cursor State。但是,当我执行displayNextRecord 方法时,它会返回相同的结果再排一次,只有我能用它做点什么。

以上是关于JDBC - 无效的游标状态的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致了这个“无效的游标状态”错误?

SQLException: 游标状态无效

ucanaccess SQL 异常:游标状态无效:已识别游标未打开

无效游标状态错误 C# DB2

[Microsoft][ODBC Driver Manager] 游标状态无效

关于resultset 的deleteRow方法报无效的游标位置的错误