为了账号安全,请及时绑定邮箱和手机立即绑定

在 AbstractTableModel 中使用 ResultSet 后关闭 ResultSet

在 AbstractTableModel 中使用 ResultSet 后关闭 ResultSet

婷婷同学_ 2023-03-09 13:55:42
我正在尝试创建一个框架来显示我数据库中的所有电影名称,然后他们在框架中选择一行来执行另一个查询。我有一个 ResultSet (rs),它接收查询执行的结果以选择电影的名称。之后,我在 SQLTableModel 中使用 rs 来创建 JTable 并显示在我的框架中。该表显示了我数据库中所有电影的名称。一切都很好。但是,当我选择一行时,我使用相同的 rs 接收另一个查询,该查询在我的数据库中选择我在 JTable 中选择的电影的所有信息,但我得到了一些错误。首先,我在 JTable 中选择的行丢失了值(电影的名称)。但是在其他行中没有任何反应。其次,我的控制台在函数“getValueAt”中向我显示了一个来自 SQLTableModel 的错误,提示“错误:ResultSet 关闭后不允许进行#0 操作”。我在 stackoverflow 中搜索了一些解决方案,但没有成功。我做了一些测试。如果我的 ResultSet (rs) 在我在 SQLTableModel 中使用它之前收到多个查询,则一切正常。但是在 SQLTableModel 中使用它之后,如果我再次尝试使用它,就会出现我提到的错误。框架客户端.javapublic 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);    }}
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

始终使用 ArrayList 或 Map 等内存结构来缓存从 DB 获取的结果。由于与数据库的连接很昂贵,因此保持此连接也很昂贵。所以尽可能快地调用 DB,尽可能短。一旦你在内存中获得数据,你就可以随意操作。



查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信