2010-05-13 2 views
8

JDBC ResultSet이 있고 getLong() 또는 getshort() 메서드를 호출한다고 가정 해보십시오.JDBC 결과 집합에서 getLong() 또는 getShort()가 int 결과 열에서 호출 될 때 어떤 일이 발생해야합니까?

다음 SQL 유형 {SMALLINT, INT, BIGINT} 중 어느 것을 오래 가져야하고 어떤 유형의 오류가 발생해야합니까?

즉, INT가 있고 SMALLINT (A short)를 원한다면 얻을 수 있습니까? 아니면 오류가 있습니까? 마찬가지로 INT가 있고 BIGINT (long)을 원한다면 얻을 수 있습니까? 아니면 오류가 있습니까?

Javadocs (아래 나열 됨)는 아무 것도 말하지 않습니다.

공공 긴 getLong (INT의 columnIndex에) 긴 Java 프로그램 언어의이 ResultSet 객체의 예외 : SQLException

Retrieves the value of the designated column in the current row 

가 발생합니다.

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 

답변

9

로 반환됩니다 :

JDBC는 지금까지 당신이 다른 SQL 유형을 검색하는 데 사용할 수있는의 getXXX 방법으로 위도가 많이 있습니다. 예를 들어, getInt 메소드를 사용하여 숫자 또는 문자 유형을 검색 할 수 있습니다. 검색 한 데이터는 int로 변환됩니다. 즉, SQL의 형태가 VARCHAR의 경우, JDBC는 VARCHAR로부터 정수를 구문 분석하려고합니다. 그러나 getInt 메소드는 SQL INTEGER 유형 만 검색하는 것이 좋으며 BINARY, VARBINARY, LONGVARBINARY, DATE, TIME 또는 TIMESTAMP SQL 유형에는 사용할 수 없습니다.

나는 데이터가 강제로 변환된다는 것을 의미합니다. 업 캐스트라면 잘 작동하지만, 예를 들어 getInt()을 사용하여 LONG 값을 읽는 경우 잠재적으로 정밀도가 저하 될 수 있습니다 (자연스럽게). getInt()을 사용하여 텍스트를 읽으려고하면 Exception이 throw 될 것으로 예상됩니다.

+1

Wonderful ... JDBC의 ResultSet에 대한 래퍼를 작성 중이며 구현에 의존하지 않는 int 유형을 명확하게 해석하고 싶습니다. 이것을 찾아 주셔서 감사합니다! – Uri

+1

DataBaseMetaData.supportsConvert (int fromType, int toType)를 호출하여 제공된 구현이 주어진 변환을 지원하는지 확인할 수 있습니다. – Yishai

2

그것은 긴에 캐스팅거야, 그리고 그것을 잘해야합니다.

"Bob"이 포함 된 문자열 또는 long으로 쉽게 변환 할 수없는 다른 필드에서 길게 만들려고하면 오류가 발생합니다.

+1

이것이 내가 궁금해하는 점이며 이것이 구현에 의존하는지 여부입니다. 설명서가 모호한 것처럼 느껴집니다. null 인 경우에는 0을 얻을 것입니다.하지만이 경우에는 런타임 경고가 표시되지 않는 것 같습니다. – Uri

+0

대부분 구현에 따라 다릅니다. 즉, 여러 DB에 대해 테스트해야합니다. 그러나 추운 진실은 "휴대용"SQL을 사용하는 많은 응용 프로그램이 DB 특정이므로 일반적으로 큰 문제는 아니라는 것입니다. 분명히, "의존한다". –

1

사양은이 동작에 대해 아무런 언급도하지 않습니다. 이것은 전적으로 드라이버의 구현에 달려 있습니다.

MySQL 커넥터를 사용하면 유효한 숫자 형식이고 길이가 긴 경우 거의 숫자처럼 보이게 할 수 있습니다. 널/거짓은 자바 튜토리얼의 Retrieving Values from Result Sets 섹션에서 0

1

이것은 구현에 따라 다릅니다. 사양에 따르면 ResultSet 구현은 이러한 변환을 지원할 수 있으며 DataBaseMetaData.supportsConvert(int fromType, int toType) (4.0 구현 자 사양의 15.2.3.1 절)을 호출하여 확인할 수 있습니다.

최상의 방법은 동작에 의존하지 않고 올바른 유형의 ResultSetMetaData를 확인하는 것입니다.

관련 문제