Что должно происходить в JDBC ResultSet при вызове getLong () или getShort () в столбце результатов int? - PullRequest
8 голосов
/ 13 мая 2010

Скажите, что у меня есть JDBC ResultSet, и я вызываю метод getLong () или getshort ().

Для какого из следующих типов SQL {SMALLINT, INT, BIGINT} я должен получить long, и для каких типов я должен получить ошибку?

Другими словами, если у меня есть INT и я хочу SMALLINT (короткий), получу ли я его, или я получу ошибку? Точно так же, если у меня есть INT и я хочу BIGINT (long), получу ли я его или получу ошибку?

Javadocs (перечислены ниже) ничего не говорят.

public long getLong (int columnIndex) выдает SQLException

Retrieves the value of the designated column in the current row

этого объекта ResultSet как long в язык программирования Java.

Parameters:
    columnIndex - the first column is 1, the second is 2, ... 
Returns:
    the column value; if the value is SQL NULL, the value returned is 0 
Throws:
    SQLException - if a database access error occurs

Ответы [ 4 ]

10 голосов
/ 13 мая 2010

Из Извлечение значений из результирующих наборов учебников по Java:

JDBC допускает большую широту, насколько методы getXXX вы можете использовать для извлечения различных типов SQL. Например, метод getInt можно использовать для получения любого из числовых или символьных типов. Полученные данные будут преобразованы в int; то есть, если тип SQL VARCHAR, JDBC попытается проанализировать целое число из VARCHAR. Однако метод getInt рекомендуется для извлечения только типов SQL INTEGER, и его нельзя использовать для типов SQL BINARY, VARBINARY, LONGVARBINARY, DATE, TIME или TIMESTAMP.

Я интерпретирую это как означающее, что данные будут принуждены. Это должно работать просто отлично, если это upcast, но я ожидаю потенциальной потери точности (естественно), если, например, вы читаете значение LONG, используя getInt(). Я ожидаю, что будет выдано исключение, если вы попытаетесь прочитать текст, используя getInt().

2 голосов
/ 13 мая 2010

Это приведет к длинному и все должно быть в порядке.

Вы получите сообщение об ошибке, если попытаетесь получить длинную строку, содержащую «Bob», или какое-либо другое поле, которое не может быть легко преобразовано в длинную.

1 голос
/ 13 мая 2010

Это зависит от реализации. В спецификации сказано, что реализация ResultSet может поддерживать такое преобразование, и вы можете проверить это, вызвав DataBaseMetaData.supportsConvert(int fromType, int toType) (раздел 15.2.3.1 спецификации реализации 4.0).

Лучше всего не полагаться на поведение, а проверять ResultSetMetaData на правильный тип.

1 голос
/ 13 мая 2010

Спецификация ничего не говорит об этом поведении. Это будет полностью зависеть от реализации драйверов.

С MySQL Connector вы можете получить почти все, что угодно, если вы в числовом формате и в диапазоне long. Null / False также возвращаются как 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...