' getRow()'方法仅允许滚动游标SQLException错误

时间:2017-03-07 13:58:55

标签: java sql jdbc derby embedded-database

我正在尝试从我在Netbeans中设置的嵌入式数据库中填充JTable。

我的数据库包含3行和3列,我想插入JTable,并使我的GUI应用程序中的表可见。

但是,我收到一个java.sql.SQLException错误,因为上面的标题说明我的表格在我的GUI应用程序中不会显示。

这是我的代码:

public void FillTable(JTable table, String Query)
{
    try
    {
        Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
        Connection conn = DriverManager.getConnection("jdbc:derby:STOCK_CONTROL");
        Statement stat = conn.createStatement();
        ResultSet rs = stat.executeQuery(Query);

        //Remove previously added rows
        while (table.getRowCount() > 0)
        {
            ((DefaultTableModel) table.getModel()).removeRow(0);
        }

        int columns = rs.getMetaData().getColumnCount();

        while (rs.next())
        {
            Object[] row = new Object[columns];

            for (int i = 1; i <= columns; i++)
            {
                row[i - 1] = rs.getObject(i);
            }
            //The error is being generated here at 'rs.getRow()'
            ((DefaultTableModel) table.getModel()).insertRow(rs.getRow() - 1, row);
        }

        rs.close();
        stat.close();
        conn.close();         
    }
    catch (InstantiationException |
            IllegalAccessException |
            ClassNotFoundException |
            SQLException e)
    {
        System.out.println(e);
        e.printStackTrace();
    }
}

然后我创建我的表并调用上面的方法:

JTable tigerTable = new JTable();

FillTable(tigerTable, "SELECT * FROM TIGER_INFO");

我试图找到导致此错误原因的信息,但无济于事。

我的问题是,如何从我的嵌入式数据库中正确填充JTable,同时也避免了我所遇到的这个未知错误?

这个错误究竟意味着什么?我不确定什么是滚动光标&#39;是

1 个答案:

答案 0 :(得分:4)

ResultSet.getRow()中所述:

  

注意:结果集类型为getRow的{​​{1}}对ResultSet方法的支持是可选的   [..]

     

抛出:
  [..]
  TYPE_FORWARD_ONLY - 如果JDBC驱动程序不支持此方法

您需要使用

请求可滚动游标
SQLFeatureNotSupportedException

或者 - 可能更好 - 自己跟踪行号,而不是使用conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 。例如:

ResultSet.getRow()

已经有一段时间了,因为我已经使用swing做了任何事情,但是从表模型中删除现有行并调用int rowIdx = 0; while (rs.next()) { Object[] row = new Object[columns]; // ... ((DefaultTableModel) table.getModel()).insertRow(rowIdx++, row); } 甚至可能更简单。