Java无效的游标类型访问

时间:2014-08-30 17:01:06

标签: java

public static void insertData() {
        String insertFirstName;
        String insertLastName;
        int id;
        Scanner in = new Scanner(System.in);

        System.out.println("insert First Name: ");
        insertFirstName = in.nextLine();
        System.out.println("insert Last Name: ");
        insertLastName = in.nextLine();

        System.out.println("First name " + insertFirstName + " Last Name "
                + insertLastName);

        try {
            Statement statement = null;
            Class.forName(JDBC_DRIVER);
            Connection con = DriverManager.getConnection(DB_URL, "", "");
            System.out.println("Connection Successfull");
            statement = con.createStatement();
            String sql = "Select id, FirstName, LastName FROM PhoneBook";
            ResultSet rs = statement.executeQuery(sql);

            rs.moveToInsertRow();
            rs.next();
            while (rs.next()) {

                rs.updateString("FirstName", insertFirstName);
                rs.updateString("LastName", insertLastName);
                rs.insertRow();
            }
            statement.close();
            rs.close();

        } catch (Exception e) {
            System.out
                    .println("********************ERROR*********************");
            System.out.println(e.getMessage());
        }

    }

我保持得到 的 ****************** ERROR ******************* 无效的光标类型:1003

我不明白为什么。我有RS.next(),然后我通过While(rs.next())。我究竟做错了什么?请帮忙谢谢

2 个答案:

答案 0 :(得分:0)

javadoc of moveToInsertRow()说:

  

插入行是与可更新结果集

关联的特殊行

(强调我的)

javadoc of ResultSet说:

  

默认的ResultSet对象是不可更新,并且只有一个向前移动的光标。因此,您只能迭代一次,并且只能从第一行到最后一行。可以生成可滚动和/或可更新的ResultSet对象。以下代码片段(其中con是有效的Connection对象)说明了如何使结果集可滚动且对其他人的更新不敏感,且可更新。有关其他选项,请参阅ResultSet字段。

答案 1 :(得分:0)

您需要打开一个可更新的ResultSet:

statement = con.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_UPDATABLE
);

有关详细信息,请参阅documentation for ResultSet

除此之外,看起来rs.next()rs.moveToInsertRow();次呼叫可能会移动太远。文档中的示例显示了您应该如何执行此操作:

rs.moveToInsertRow(); // moves cursor to the insert row
rs.updateString("FirstName", insertFirstName);
rs.updateString("LastName",  insertLastName);
rs.insertRow();