Целочисленное математическое решение, что предоставленный Ian хорош, но страдает от ошибки целочисленного переполнения. Принятие переменных является всем int
, решение могло быть переписано, чтобы использовать long
математика и избежать ошибки:
int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;
, Если records
long
, ошибка остается. Решение для модуля не имеет ошибки.
String[] arrLocations = locations.toArray(new String[0]);
Это правильный ответ. Причина вашего исключения заключается в том, что все объекты на самом деле не являются строками.
Вам необходимо изменить это:
Object value = rs.getObject(i);
на это:
String value = rs.getString(i);
или это:
String value = rs.getObject(i).toString();
Последнему потребуется проверка нуля, если вы может возвращать пустые столбцы.
Обратите внимание, что представление toString () может быть не совсем тем, что вы ищете во всех случаях, но оно поможет вам начать.
Изменить: если вы заполняете поле со списком, вам понадобится один столбец в строке, не так ли? Если нет, вам нужно каким-то образом представить всю строку как строку. Затем вы вставляете это значение и помещаете значение непосредственно в окончательный список массивов, поэтому ваш цикл должен выглядеть следующим образом:
ArrayList<String> al = new ArrayList<String>();
while (rs.next()) {
ArrayList<String> record = new ArrayList<String>();
for (int i = 1; i <= columns; i++) {
String value = rs.String(i);
record.add(value);
}
String value = methodWhichConvertsArrayListToStringTheWayYouNeedItFormatted(record);
al.add(value);
}
return al;
Почему бы не использовать rs.getString (). Однако я не буду рекомендовать это делать. Но это решило бы вашу проблему. Я имею в виду просто иметь дело со String с самого начала. Пример,
// Not a good idea to pass a active resultset as a parameter.
// Use disconnected implementation instead, for example rowset.
public ArrayList<ArrayList<Object>> results2Array(ResultSet rs)
throws SQLException {
ResultSetMetaData metaData = rs.getMetaData();
int columns = metaData.getColumnCount();
ArrayList<String[]> list = new ArrayList<String[]>();
while (rs.next()) {
String[] record = new String[columns];
for (int i = 1; i <= columns; i++) {
// Not a good idea to get everything as a string. This way you will
// get a default string representation of objects. Suppose, you
// want to format dates and doubles as per some requirement.
record[i-1] = rs.getString(i);
}
list.add(record);
}
return list;
}
Теперь вам нужно получить его, как показано ниже.
String[][] arrLocations = locations.toArray(new String[locations.size()][0]);
Еще лучше проверить тип и получить соответствующие значения, используя имеющиеся у вас метаданные. Это поможет вам отформатировать данные, а именно даты и числа с двойной точностью.
String [] arrLocations = locations.toArray (new String [0]);
Приведенный выше код преобразует список строк в массив строк. Теперь в вашем случае вы создаете список объектов, поэтому вы не можете напрямую преобразовать его в массив String. Как правило, у вас есть 2 варианта:
String value = rs.getObject (i) .toString ();
В качестве примечания - методы в Java должны начинаться со строчной буквы