前向结果集不支持请求的操作

Chr*_*eld 4 java jdbc resultset

我试图将数据显示到表格中,但在那里出现了一些错误。我使用的方法返回了所有相关数据,但是当我尝试将数据绑定到表中时,它显示了错误,错误说:

前向结果集不支持请求的操作。

这是我实现我的代码的方式:

public class Table {

    public static DefaultTableModel buildDataTable(ResultSet rs) {
        ResultSetMetaData metaData;
        Object[][] data = null;
        Object[] columnNames = null;
        try {
            metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            columnNames = new Object[columnCount];
            int index = 0;
            for (int column = 1; column <= columnCount; column++) {
                columnNames[index] = metaData.getColumnName(column).toUpperCase();
                index++;
            }
            rs.last();
            data = new Object[rs.getRow()][columnCount];
            rs.beforeFirst();
            while (rs.next()) {
                for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
                    data[rs.getRow() - 1][columnIndex - 1] = rs.getObject(columnIndex);
                }
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return new DefaultTableModel(data, columnNames);
    }

}
Run Code Online (Sandbox Code Playgroud)

以下代码显示了我如何将数据绑定到 jtable 中:

try {
        dtm = com.gaurav.auctionhouse.common.Table.buildDataTable(new ItemDAOImp().getItemByUserId(MainClass.userId));
        jTable1.setModel(dtm);
    } catch (SQLException ex) {
        Logger.getLogger(SellerPage.class.getName()).log(Level.SEVERE, null, ex);
    }
Run Code Online (Sandbox Code Playgroud)

返回数据的方法 ResultSet

public ResultSet getItemByUserId(int id) throws SQLException {
    String query = "SELECT id, type, description, state, reservedPrice, itemName, image  FROM tbl_item WHERE userId = ?";
    try {
        pst = DBConnection.getConnection().prepareStatement(query);
        pst.setInt(1, id);
        res = pst.executeQuery();

        return res;
    } catch (SQLException ex) {
        throw new SQLException(ex);
    } finally {
        DBConnection.getConnection().close();
    }
}
Run Code Online (Sandbox Code Playgroud)

完整的堆栈跟踪

com.microsoft.sqlserver.jdbc.SQLServerException:仅转发结果集不支持请求的操作。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191) 在 com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable(SQLServerResultSet.java:414) 在 com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetIsScrollable (SQLServerResultSet.java:437) at com.microsoft.sqlserver.jdbc.SQLServerResultSet.last(SQLServerResultSet.java:1477) at com.gaurav.auctionhouse.common.Table.buildDataTable(Table.java:34) at com.gaurav。 Auctionhouse.view.SellerPage.(SellerPage.java:29) at com.gaurav.auctionhouse.view.AddItems.jbtnSubmitActionPerformed(AddItems.java:265) at com.gaurav.auctionhouse.view.AddItems.access$100(AddItems.java: 33) 在 com。

希望得到积极的回应。

Sev*_*One 5

这个:

    rs.last();
    data = new Object[rs.getRow()][columnCount];
    rs.beforeFirst();
Run Code Online (Sandbox Code Playgroud)

不会使用 forward-only ResultSet。除此之外,除了性能考虑之外,获取最后一行并获取其编号并不是确定行数的非常可靠的方法。

此外,JavaDoc onResultSet声明如下:

注意:对于结果集类型为 TYPE_FORWARD_ONLY 的 ResultSet,对 getRow 方法的支持是可选的

所以这也行不通。

但是,问题的根源在于您使用的是数组。最好避免 Java 中的数组,因为 Collection 框架提供了更大的灵活性。

在您的情况下,创建data一个List<Object[]>,并Object[columnCount]为从数据库中读取的每一行创建一个新的。更好的是,List为此也使用 a 。

一般来说,你的代码看起来像转换成 Java 的老式 C:没有final变量,在代码的开头声明变量,不使用 Collections 框架等。这是你可能想看看的东西。

编辑:添加正确的解决方案...当然,但您需要正确学习 Java。您现在可能会得到一个解决方案,但您仍然需要编写代码。下面仍然存在问题,例如异常处理,这也阻止我创建所有变量final,但您可以自己处理。

public class Table {

    public static DefaultTableModel buildDataTable(final ResultSet rs) {

        final List<Object[]> data = new ArrayList<>();
        String[] columnNames = null;
        int columnCount = 0;

        try {
            final ResultSetMetaData metaData = rs.getMetaData();
            columnCount = metaData.getColumnCount();
            columnNames = new String[columnCount];
            for (int column = 0; column < columnCount; column++) {
                columnNames[column] = metaData.getColumnName(column + 1).toUpperCase();
            }

            while (rs.next()) {
                final Object[] row = new Object[columnCount];
                for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
                    row[columnIndex] = rs.getObject(columnIndex + 1);
                }
                data.add(row);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        return new DefaultTableModel(data.toArray(new Object[data.size()][columnCount]), columnNames);
    }
}
Run Code Online (Sandbox Code Playgroud)