2016-08-29 3 views
0

Я пытаюсь получить данные из таблицы Access и показать их на JTable. Я использую UCanAccess, поскольку Java 8 не поддерживает JDBC-ODBC.UCanAccess Exception: не удается getMetaData из ResultSet (недопустимое состояние курсора)

Мой класс окна вызывает методы зарядки:

ctrlGestionVentas= new CtrlGestionVentas(); 
ctrlGestionVentas.cargarListaVentas(tblListaVentas); 

Затем CtrlGestionVentas.cargarListaVentas (табла) заполняет JTable из ResultSet:

public class CtrlGestionVentas { 

public void cargarListaVentas(JTable tabla) { 

    ResultSet rs; 
    DataVentas dv = new DataVentas(); 
    rs = dv.getListaVentas(); 
    try { 
      tabla.setModel(buildTableModel(rs)); 
      RowSorter sorter = new TableRowSorter(buildTableModel(rs)); 
      tabla.setRowSorter(sorter); 
      tabla.getTableHeader().setDefaultRenderer(new MultiSortTableCellHeaderRenderer()); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 


public static DefaultTableModel buildTableModel(ResultSet rs) 
     throws SQLException { 

    ResultSetMetaData metaData = rs.getMetaData(); /*THIS IS THE LINE WHICH APPARENTLY PROVOKES THE ERROR*/ 

    // names of columns 

    Vector<String> columnNames = new Vector<String>(); 
    int columnCount = metaData.getColumnCount(); 
    for (int column = 1; column <= columnCount; column++) { 
     columnNames.add(metaData.getColumnName(column)); 
    } 

    // data of the table 

    <Vector<Object>> data = new Vector<Vector<Object>>(); 
    while (rs.next()) { 
     Vector<Object> vector = new Vector<Object>(); 
     for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
      vector.add(rs.getObject(columnIndex)); 
     } 
     data.add(vector); 
    } 

    return new DefaultTableModel(data, columnNames); 

} 

} 

Вот метод ResultSet геттер, в классе DataVentas (примечание: FactoryConexion имеет ConnectionString, пропущенный в этом сообщении):

public class DataVentas { 
    public ResultSet getListaVentas() { 
     PreparedStatement stmt=null; 
     ResultSet rs=null; 
     try { 

      stmt = FactoryConexion.getInstancia().getConn().prepareStatement("select * from ventasfinal"); 
      rs = stmt.executeQuery(); 
     } catch (SQLException ex) { 

       System.out.println("SQLException: " + ex.getMessage()); 

     } 
     finally{ 
      try { 
       if (rs!=null) 
        rs.close(); 
       if (stmt!=null)stmt.close();     
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
     return rs; 
    } 

} 

Когда я исполняю, я получаю следующее:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 estado del cursor incorrecto: cursor indicado no está abierto 
    at net.ucanaccess.jdbc.UcanaccessResultSet.getMetaData(UcanaccessResultSet.java:480) 
    at negocio.CtrlGestionVentas.buildTableModel(CtrlGestionVentas.java:37) 
    at negocio.CtrlGestionVentas.cargarListaVentas(CtrlGestionVentas.java:22) 
    at ui.GestionVentas.<init>(GestionVentas.java:85) 
    at ui.GestionVentas$1.run(GestionVentas.java:63) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Caused by: java.sql.SQLException: estado del cursor incorrecto: cursor indicado no está abierto 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCResultSet.checkClosed(Unknown Source) 
    at org.hsqldb.jdbc.JDBCResultSet.getMetaData(Unknown Source) 
    at net.ucanaccess.jdbc.UcanaccessResultSet.getMetaData(UcanaccessResultSet.java:478) 
    ... 18 more 

Caused by: org.hsqldb.HsqlException: estado del cursor incorrecto: cursor indicado no está abierto 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    ... 22 more 

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.6 estado del cursor incorrecto: cursor indicado no está abierto 
    at net.ucanaccess.jdbc.UcanaccessResultSet.getMetaData(UcanaccessResultSet.java:480) 
    at negocio.CtrlVendedores.buildTableModel(CtrlVendedores.java:38) 
    at negocio.CtrlVendedores.cargarListaVendedores(CtrlVendedores.java:23) 
    at ui.GestionVentas.<init>(GestionVentas.java:95) 
    at ui.GestionVentas$1.run(GestionVentas.java:63) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$500(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Caused by: java.sql.SQLException: estado del cursor incorrecto: cursor indicado no está abierto 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCResultSet.checkClosed(Unknown Source) 
    at org.hsqldb.jdbc.JDBCResultSet.getMetaData(Unknown Source) 
    at 
net.ucanaccess.jdbc.UcanaccessResultSet.getMetaData(UcanaccessResultSet.java:478) 
    ... 18 more 

Caused by: org.hsqldb.HsqlException: estado del cursor incorrecto: cursor indicado no está abierto 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    ... 22 more 

Обратите внимание, что последняя строка с пометкой в ​​отладчике является один в методе buildTableModel (rs.getMetaData()). Что тут происходит?

Спасибо за ваше время!

ответ

1

Это метод, который получает ResultSet, затем закрывает его в блоке finally. Таким образом, вы не можете использовать этот ResultSet вообще. Вы должны повторно организовать свой код.

+0

Отлично! Теперь это работает. Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^