Это:
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);
}
}