Запрошенная операция не поддерживается только для наборов результатов вперед - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь показать данные в таблицу, но там есть какая-то ошибка.Метод, который я использовал, возвращает мне все связанные данные, но когда я пытаюсь связать данные в таблицу, он показывает мне ошибку, и ошибка говорит:

Запрошенная операция не поддерживается только для наборов результатов пересылки.

Вот как я реализовал свой код:

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);
    }

}

Следующий код показывает, как я связал данные в 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);
    }

Метод возвратаданные в терминах 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();
    }
}

Полная трассировка стека

com.microsoft.sqlserver.jdbc.SQLServerException: запрошенная операция не поддерживаетсятолько на форвардных наборах результатов.по адресу com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError (SQLServerException.java:191) по адресу com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable (SQLServerResultSet.javaversoft.Set.SyserS.ServS.SYS.Rys.SYS.Rys.SYS.Rys.SYS.Rys.SYS.Rys.SYS.(SQLServerResultSet.java:437) на com.microsoft.sqlserver.jdbc.SQLServerResultSet.last (SQLServerResultSet.java:1477) на com.gaurav.auctionhouse.common.Table.buildDataTable (Table.java:34) на com.gaura.auctionhouse.view.SellerPage. (SellerPage.java:29) на com.gaurav.auctionhouse.view.AddItems.jbtnSubmitActionPerformed (AddItems.java:265) на com.gaurav.auctionhouse.view.AddItems.access $ 100 (AddItems.java:33) в com.gaurav.auctionhouse.view.AddItems $ 2.actionPerformed (AddItems.java:111) в javax.swing.AbstractButton.fireActionPerformed (AbstractButton.java:2022) в javax.swing.AbstractButton $ Handler.actionBerformed.Java: 2348) в javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:402)at javax.swing.DefaultButtonModel.setPressed (DefaultButtonModel.java:259)

Надеясь на положительный ответ.

1 Ответ

0 голосов
/ 12 мая 2018

Это:

    rs.last();
    data = new Object[rs.getRow()][columnCount];
    rs.beforeFirst();

не будет работать с форвардом ResultSet. Кроме того, выборка последней строки и получение ее номера не очень надежный способ определения количества строк, не говоря уже о соображениях производительности.

Кроме того, JavaDoc на ResultSet сообщает следующее:

Примечание. Поддержка метода getRow является необязательной для ResultSets с типом набора результатов TYPE_FORWARD_ONLY

Так что это тоже не сработает.

Однако корень вашей проблемы в том, что вы используете массивы. Лучше избегать массивов в Java, потому что платформа Collection предлагает гораздо большую гибкость.

В вашем случае введите data a List<Object[]> и создайте новый Object[columnCount] для каждой строки, считанной из базы данных. Еще лучше, используйте List для этого.

В целом, ваш код выглядит как старомодный C, преобразованный в Java: нет 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);
    }
}
...