0

我需要在 Jtable 中显示从 SQL SERVER 存储过程返回的数据,但我无法做到这一点,因为它给了我以下错误:仅转发结果集不支持请求的操作。

这是我实现的代码:

try 
        {

            CallableStatement mostararPacientesAusentes = conexionBBDD.getConexionBBDD()
            .prepareCall("{call mostararPacientesAusentes()}");

            ResultSet tabla = mostararPacientesAusentes.executeQuery();
            
             
            
            AbstractTableModel mTN=new ModeloTabla(tabla);
            
            ventanaNotificacion.getTabla().setModel(mTN);
            ventanaNotificacion.getTabla().validate();
             

        } catch (SQLException e1) {

            JOptionPane.showMessageDialog(null, e1.getMessage(), "BBDD", 2, null);
             
        }

这是继承 AbstractTableModel 的类

public class ModeloTabla extends AbstractTableModel {

    private ResultSet tabla;
    private ResultSetMetaData datosBBDD;
    
    
    public ModeloTabla(ResultSet unResulset)
    {
        tabla=unResulset;
        
        try
        {
            datosBBDD=tabla.getMetaData();
        }
        catch (SQLException e)
        {
             
            e.printStackTrace();
        }
    } 
    
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
         
        try
        {
            tabla.absolute(rowIndex+1);
            return tabla.getObject(columnIndex+1);
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return null;
        } 
    }
    
    public String getColumnName(int c)
    {
         
        try 
        {
            return  datosBBDD.getColumnName(c+1);
        } 
        catch (SQLException e) {
             
            e.printStackTrace();
            return null;
        }
        
        
        
    }
    
    @Override
    public int getRowCount() {
     
        try {
         
             tabla.last();
             
             
            return tabla.getRow();
            
        } 
        catch (SQLException e) {
            
            e.printStackTrace();
            return 0;
        }
    
        
    }
     

    @Override
    public int getColumnCount() 
    {
         
        try
        {
            return datosBBDD.getColumnCount();
        } 
        catch (SQLException e) 
        {
            e.printStackTrace();
        }
        return 0;
    }

}

表列的标题在 JTable 中显示,但数据没有。我已经搜索了解决问题的信息,但没有成功。非常感谢。

4

1 回答 1

1

文档ResultSet:_

... 默认的 ResultSet 对象是不可更新的,并且有一个只能向前移动的光标。因此,您只能遍历它一次,并且只能从第一行到最后一行。可以生成可滚动和/或可更新的 ResultSet 对象。...

有一个版本的prepareCall()接受额外的参数来做到这一点,比如:

...prepareCall("{call mostararPacientesAusentes()}",
               ResultSet.TYPE_SCROLL_INSENSITIVE,
               ResultSet.CONCUR_READ_ONLY);

请查看其他常量/类型的文档


我不确定使用 aResultSet来维护数据是否是一个好主意 - 它可能拥有大量资源(连接、语句......) - 恕我直言,最好读取一次数据并将其保存在列表或类似结构中; 尽快释放数据库资源。

于 2021-02-05T15:24:49.630 回答