0

我正在创建一个程序来重命名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());
    }

请帮忙。

4

2 回答 2

0

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

默认情况下,每个 Statement 对象只能同时打开一个 ResultSet 对象。因此,如果一个 ResultSet 对象的读取与另一个 ResultSet 对象的读取交错,则每个对象都必须由不同的 Statement 对象生成。Statement 接口中的所有执行方法都会隐式关闭语句的当前 ResultSet 对象(如果存在打开的对象)。

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

另外最好使用 PreparedStatement。您可以在此处了解不同之处。

于 2013-10-04T12:55:15.227 回答
0

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

于 2013-10-04T15:28:46.140 回答