在 AbstractTableModel 中使用 ResultSet 后关闭 ResultSet

我正在尝试创建一个框架来显示我数据库中的所有电影名称,然后他们在框架中选择一行来执行另一个查询。

我有一个 ResultSet (rs),它接收查询执行的结果以选择电影的名称。之后,我在 SQLTableModel 中使用 rs 来创建 JTable 并显示在我的框架中。该表显示了我数据库中所有电影的名称。一切都很好。

但是,当我选择一行时,我使用相同的 rs 接收另一个查询,该查询在我的数据库中选择我在 JTable 中选择的电影的所有信息,但我得到了一些错误。

首先,我在 JTable 中选择的行丢失了值(电影的名称)。但是在其他行中没有任何反应。其次,我的控制台在函数“getValueAt”中向我显示了一个来自 SQLTableModel 的错误,提示“错误:ResultSet 关闭后不允许进行#0 操作”。

我在 stackoverflow 中搜索了一些解决方案,但没有成功。

我做了一些测试。如果我的 ResultSet (rs) 在我在 SQLTableModel 中使用它之前收到多个查询,则一切正常。但是在 SQLTableModel 中使用它之后,如果我再次尝试使用它,就会出现我提到的错误。

框架客户端.java

public class FrameCliente {


    JFrame frameCliente;

    JTable table;


    BancoDeDados bd;

    ResultSet rs;


    public FrameCliente() {

        bd = new BancoDeDados();

        frameCliente = new JFrame();

        table = new JTable();

        rs = bd.listar("SELECT fil_nome Nome FROM filme");

        table.setModel(new SQLTableModel(rs));


        table.addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent e) {

                if(table.getSelectedRowCount() > 0) {

                    rs = bd.listar(" SELECT * FROM filme WHERE fil_nome = '" + table.getValueAt(table.getSelectedRow(), 0) + "'");  

                }

            }

        });


        frameCliente.add(new JScrollPane(table));

        frameCliente.setTitle("Filmes");

        frameCliente.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frameCliente.setSize(800, 300);

        frameCliente.setLocationRelativeTo(null);

        frameCliente.setVisible(true);

    }


}


婷婷同学_
浏览 108回答 1
1回答

千巷猫影

始终使用 ArrayList 或 Map 等内存结构来缓存从 DB 获取的结果。由于与数据库的连接很昂贵,因此保持此连接也很昂贵。所以尽可能快地调用 DB,尽可能短。一旦你在内存中获得数据,你就可以随意操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java