簡體   English   中英

如何從Java ResultSet確定列計數?

[英]How to determine Column Count from a Java ResultSet?

我想在jtable中顯示jtable 第一步是創建一個tablemodel

public DefaultTableModel createTableModel(String sqlStatement) {
    int rowCount       = 0;
    int colCount       = 0;
    Vector data        = new Vector();
    Vector columnnames = new Vector();
    String sql = sqlStatement;
    try {
        open();

        ResultSet rs = befehl.executeQuery(sql);
        ResultSetMetaData metaData = rs.getMetaData();
        for(int i = 1; i<=metaData.getColumnCount();i++)
            columnnames.add(metaData.getColumnName(i));
        DefaultTableModel model = new DefaultTableModel(null,columnnames);
        close();
        return model;
    } catch (SQLException e) {
        e.printStackTrace();
        close();
        return null;
    }
}

如果我的SQL語句選擇整個表,這可以正常工作: SELECT* FROM test; ,但如果我只想顯示前兩列,請Select ColumnName1, ColumName2 from test; ,我得到一個ArrayIndexOutOfBoundsException 我一直認為columncount取決於resultSet ,它依賴於sql語句。 我如何獲得正確的columncount

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 >= 2
at java.util.Vector.elementAt(Vector.java:470)
at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java‌​:294)
at sun.swing.SwingUtilities2.convertColumnIndexToModel(SwingUtilities2.java:1841)
at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2585)
at javax.swing.JTable.getValueAt(JTable.java:2720) at Main.KassePanel.<init>(KassePanel.java:186)
at Main.Main.<init>(Main.java:36) at Main.Main.main(Main.java:20)

您應該使用DatabaseMetaData而不是ResultSetMetaData 我已經完成了一個名為dbproxy的java項目,它旨在操作和訪問關系數據庫的結構(元數據)。 我很快就會把它變成一個開源項目。 看我的代碼:

@Override
public List<ColumnDetail> getColumns(String table) throws SQLException {
    List<ColumnDetail> columnList = new ArrayList<ColumnDetail>();
    ResultSet resultSet = null;
    String catalog = getCatalog();
    String schema = getSchema();

    try {
        DatabaseMetaData databaseMetaData = connection.getMetaData();
        if(databaseMetaData == null) {
            return columnList;
        }
        resultSet = databaseMetaData.getColumns(catalog, schema, table, null);
        if(resultSet == null) {
            return columnList;
        }
        while(resultSet.next()) {
            columnList.add(extractColumnDetail(resultSet));
        }
    }
    catch (SQLException e) {
        throw new SQLException("Could not get columns: " + e.toString());
    }
    catch (Exception e) {
        throw new SQLException("Could not get columns: " + e.toString());
    }
    finally {
        DatabaseUtil.close(resultSet);
    }
    return columnList;
}  

參考Apress.JDBC.Metadata.MySQL.and.Oracle.Recipes.A.Problem.Solution.Approach.Mar.2006

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM