结果集的错误未关闭,同一代码中的游标状态无效

时间:2014-03-15 06:53:11

标签: java database swing applet

我们在java swing中完成了这段代码。我们有一个数据库表节点和该表nodecopy的副本。我们的动机是从特定节点到另一个目的地画一​​条线。 这里+ tablename +是指每次点击屏幕时创建的表格(单击时也会创建一个节点)。

此代码显示错误为invalid cursor stateresult state not closed 请指导

public void paint(Graphics g)
{

   int stX,stY,endX,endY;
    try
    {

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection con = DriverManager.getConnection("jdbc:odbc:router");
    Statement sta = con.createStatement();
    ResultSet rs=sta.executeQuery("Select * from nodecopy;");

                String tablename;
                ResultSet rs1;

                while(rs.next())
                {
                    tablename=rs.getString("1");
                    tablename=tablename.trim();
                    System.out.println("select * from "+tablename+";");
                    try
                    {
                        rs1=sta.executeQuery("select * from "+tablename+";");
                        String name,val;

                        if(rs1.next())
                        {

                            name=rs1.getString(1);
                            val=rs1.getString(2);
                            System.out.println(name+":"+val);
                        }

                        a=search(node_name,tablename);
                        stX=node_x_coordinate[a];
                        stY=node_y_coordinate[a];

                        String dest=rs1.getString(1);
                        b=search(node_name,dest);

                        endX=node_x_coordinate[b];
                        endY=node_y_coordinate[b];

                        System.out.println(tablename+"\t"+dest+"\t"+stX+"\t"+stY+"\t"+endX+"\t"+endY);

                        Color clr=new Color((int)(Math.random()*999999999));
                        g.setColor(clr);
                        g.drawLine(stX,stY,endX,endY);

                        JLabel vall;
                        add(vall=new JLabel(rs1.getString(2).trim()));
                        vall.setForeground(clr);
                        vall.setBounds((stX+endX)/2,(stY+endY)/2,40,40);
                        System.out.println(tablename+"\t"+dest+"\t"+stX+"\t"+stY+"\t"+endX+"\t"+endY);


                    }
                    catch(Exception e)
                    {
                           System.out.println(e);
                           sta.execute("delete from nodecopy where node='"+tablename+"';");
                           sta = con.createStatement();
                           rs=sta.executeQuery("Select * from nodecopy;");

                    }

                }//end of while
                sta.close();
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
}

2 个答案:

答案 0 :(得分:1)

  1. “结果状态未关闭”可能是由于您的sta.close()语句与finally块未加入
  2. 的另一个例外原因造成的
  3. 不知道“无效的游标状态”异常。但是如果要打印整个堆栈跟踪(e.printStackTrace()而不是System.out.println(e)),可能更容易找到。
  4. 您真的,真的不想在paint方法中执行数据库查询。它将阻止Event Dispatch线程。您应该在后台线程上执行查询,并为JComponent
  5. 提供必要的信息
  6. 您通常会覆盖JComponent#paintComponent( Graphics )而不是JComponent#paint( Graphics )方法
  7. 当您覆盖paintComponent方法时,请不要忘记致电super.paintComponent

答案 1 :(得分:0)

在finally块中尝试按此顺序关闭所有resultSet,语句,连接。