ResultSet关闭错误Netbeans MySQL连接后不允许操作

时间:2013-10-04 12:35:21

标签: java mysql netbeans

我正在创建一个程序来重命名mysql中的数据库。 我已成功完成所有事情并成功实现。但是在我的脚本结束时,它显示一个错误/异常,说“在ResultSet关闭后不允许操作”。我真的不知道为什么即使在研究了这个错误后也会出现这个错误。 虽然完整操作已成功完成,但数据库已重命名。 这是我的代码 - >

String x = (String) jComboBox1.getSelectedItem(); //jComboBox1 contains the name of current database selected
String z = JOptionPane.showInputDialog("Please enter new name for Database"); //Where user enters the name for new database.
new CustComm().setVisible(false);    //Frame that carries the names of tables.
        try{
        Class.forName("java.sql.DriverManager");
        Connection con = (Connection)
        DriverManager.getConnection("jdbc:mysql://localhost:"+GlobalParams.portvar+"/",""+k,""+j);
        Statement stmnt = (Statement) con.createStatement();
        String query = "use "+x;
        stmnt.executeQuery(query);
        String query2 = "show tables";
        ResultSet rs = stmnt.executeQuery(query2);
        while (rs.next()){ 
        String dname = rs.getString("Tables_in_"+x);
        if(CustComm.jTextArea1.getText().equals("")){
        CustComm.jTextArea1.setText(CustComm.jTextArea1.getText()+dname);
        }
        else{
            CustComm.jTextArea1.setText(CustComm.jTextArea1.getText()+"\n"+dname);
        }
        String y = CustComm.jTextArea1.getText();
        Scanner scanner = new Scanner(y);
while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        String query3 = "Create database "+z;
        stmnt.executeUpdate(query3);
        //alter table my_old_db.mytable rename my_new_db.mytable
        String query4 =  "RENAME TABLE "+x+"."+line+" TO "+z+"."+line;
        stmnt.executeUpdate(query4);
        String query5 = "drop database "+x;
        stmnt.executeUpdate(query5);
}}}

    catch(Exception e){
        JOptionPane.showMessageDialog(this,e.getMessage());
    }

请帮忙。

2 个答案:

答案 0 :(得分:0)

当您使用Statement stmnt = (Statement) con.createStatement();时,不应对语句ResultSet执行新查询,因为这会关闭ResultSet

  

默认情况下,每个Statement对象只能打开一个ResultSet对象   同时。因此,如果读取一个ResultSet对象是   与另一个的读取交错,每个必须已经生成   通过不同的Statement对象。 Statement中的所有执行方法   如果是,接口隐式关闭一个statment的当前ResultSet对象   打开一个。

您应该创建两个不同的语句:第一个用于查询2,第二个用于查询3-5。

最好使用PreparedStatement。您可以阅读差异here

答案 1 :(得分:0)

你必须通过代码完成这项工作吗?您是否研究过Liquibase等工具?