Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet

Posted

技术标签:

【中文标题】Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet【英文标题】:Mysql Java Derby Netbeans: 'deleteRow' not allowed because the ResultSet is not an updatable ResultSet 【发布时间】:2015-08-09 06:27:37 【问题描述】:

我正在尝试删除一行,但它不允许我,它说“'deleteRow' 不允许,因为 ResultSet 不是可更新的 ResultSet”。这是我的代码:

public void addUserName() throws SQLException 
    rs = st.executeQuery("select NAME, prize from usernames");
    try 
        while (rs.next()) 
            String attribute2 = rs.getString("name");

            if (attribute2.equals(getName()))
                String toPrint = rs.getString(2);
                System.out.println("Welcome back " + getName());
                System.out.println("You previously won " + toPrint);
                System.out.println("Let's see if you can do any better this time :)");
                rs.deleteRow();

            
        

     catch (SQLException ex) 
        Logger.getLogger(Millionaire.class.getName()).log(Level.SEVERE, null, ex);
    


我在这里做错了什么?任何建议将不胜感激。提前致谢。

这就是我创建表的方式,并添加了给出的建议,但仍然出现相同的错误:

public void createTable(String tableName) 
    try 
        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                              ResultSet.CONCUR_UPDATABLE);
        //String newTable = "millionair";

        //statement.executeUpdate("drop table if exists "+newTable);
        String sqlCreateTable = "CREATE TABLE " + tableName + " (NAME VARCHAR(50), PRIZE INT)";

        stmt.executeUpdate(sqlCreateTable);
     catch (SQLException ex) 

        System.err.println("SQLException: " + ex.getMessage());
    

【问题讨论】:

【参考方案1】:

来自docs

默认的 ResultSet 对象是不可更新的,并且有一个光标 只向前移动。因此,您只能遍历它一次并且 仅从第一行到最后一行。可以生产 可滚动和/或可更新的 ResultSet 对象。下列 代码片段,其中 con 是一个有效的 Connection 对象,说明 如何制作可滚动且对更新不敏感的结果集 由其他人,这是可更新的。有关其他信息,请参见 ResultSet 字段 选项。

   Statement stmt = con.createStatement(
                                  ResultSet.TYPE_SCROLL_INSENSITIVE,
                                  ResultSet.CONCUR_UPDATABLE);
   ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
   // rs will be scrollable, will not show changes made by others,
   // and will be updatable

所以你必须在创建语句时设置ResultSet.CONCUR_UPDATABLE属性。

【讨论】:

我尝试了您的建议,但得到了同样的错误,也许问题出在我创建表的方式上?请检查我的编辑。 @almostabeginner st 变量在哪里初始化,您在 addUserName() 中使用您必须将 ResultSet.CONCUR_UPDATABLE 放在 st 变量上,而不是在 stmt 变量初始化中 我在我的数据库类的构造函数中初始化了st,我在建立mysql连接之后就这样做了。哦,这很有意义,哈哈,我认为这应该可行,请等一下。 非常感谢,效果很好,感谢阅读材料,它对理解部分内容很有帮助。

以上是关于Mysql Java Derby Netbeans:不允许“deleteRow”,因为 ResultSet 不是可更新的 ResultSet的主要内容,如果未能解决你的问题,请参考以下文章

使用 derby 数据库和 netbeans ide 创建触发器

Apache Derby - java.sql.SQLException:无法启动数据库

netbeans java 数据库应用程序

Derby 在 Java 应用程序中自动启动服务器并连接到数据库

SQLException: 找不到适合 jdbc:derby://localhost:1527 的驱动程序

mysql的java derby的current_timestamp