2016-08-29 29 views
0

我試圖從Access表中獲取數據並在JTable上顯示它。由於Java 8不支持JDBC-ODBC,因此我使用UCanAccess。UCanAccess異常:​​無法從ResultSet中獲取MetaData(無效光標狀態)

我的窗口類調用的收費方式:

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類:

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

然後,CtrlGestionVentas.cargarListaVentas(手鼓)從ResultSet填充的JTable (注: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

非常好!現在它可以工作。非常感謝! –

相關問題