'getRow()' 方法只允许用于滚动游标 SQLException 错误

jui*_*0xk 3 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

JTable tigerTable = new JTable();

FillTable(tigerTable, "SELECT * FROM TIGER_INFO");
Run Code Online (Sandbox Code Playgroud)

我试图找到有关为什么会导致此错误的信息,但无济于事。

我的问题是,如何从我的嵌入式数据库正确填充 JTable,同时也远离我出现的这个未知错误?

这个错误究竟是什么意思?我不确定“滚动光标”是什么。

Mar*_*eel 6

如记录在ResultSet.getRow()

注意:对于结果集类型getRowResultSets的方法的支持是可选的TYPE_FORWARD_ONLY
[..] 的

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

您要么需要使用可滚动光标

conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
Run Code Online (Sandbox Code Playgroud)

或者 - 可能更好 - 自己跟踪行号而不是使用ResultSet.getRow(). 例如:

int rowIdx = 0;
while (rs.next()) {
    Object[] row = new Object[columns];
    // ...

    ((DefaultTableModel) table.getModel()).insertRow(rowIdx++, row);
}
Run Code Online (Sandbox Code Playgroud)

我已经有一段时间没有使用 Swing 做过任何事情了,但从表模型中删除现有行并调用addRow.