2010-04-01 2 views
2

좋은 ResultSetMetaData 메서드를 사용하기 위해 여러 열 이름을 열 인덱스로 변환해야합니다. 그러나 ResultSetMetaData 개체를 얻는 방법을 알고있는 유일한 방법은 ResultSetgetMetaData()을 호출하는 것입니다.ResultSet을 사용하지 않고 ResultSetMetaData를 얻는 방법

내가 가지고있는 문제는 ResultSet을 잡는 것이 내 마음 속에 불필요한 리소스를 차지한다는 것입니다. 실제로 테이블에 대한 데이터를 쿼리 할 필요가 없으며 테이블에 대한 정보 만 원합니다.

누군가 ResultSet (잠재적으로 거대한 테이블에서)을 얻지 않고 ResultSetMetaData 개체를 얻는 방법을 알고 있습니까?

답변

4

아마 당신은 그것은 각 테이블의 컬럼에 대해 하나 개의 행을 반환

DatabaseMetaData databaseMetaData = connection.getMetaData(); 
databaseMetaData.getColumns(null, null, tableName, "%"); 

사용할 수 있습니다.

이 경우 반환 된 ResultSet 자체는 ResultSetMetaData이 아니라 사용합니다.

이 접근법의 한 가지 장점은 데이터베이스 잠금 및 트랜잭션을 방해하지 않는다는 것입니다.

+0

^^^이 !!! 그러나 경고와 함께 HP에서 실행되는 Sybase에서 필자는 그것을 비웃었습니다. 이것은 2001 년의 마음이었습니다. 그러나 일반적으로이 방법을 사용합니다. –

+0

당신이 맞습니다 -이 방법을 들여다 보면 더 깨끗한 방식으로 작동한다는 것을 분명히 알 수 있습니다. – javanix

2

select * from mytable을 수행한다고 가정하면 레코드가 반환되지 않고 ResultSet이 비어 있지 않도록 where 절을 추가 할 수 있습니다.

그런 식으로 전체 데이터베이스가 아니라 관심있는 테이블의 메타 데이터를 얻는 것입니다.

+0

그래, 이것도 제가 알아 낸 것입니다. 나는 명확성을 위해 WHERE 절 대신 LIMIT 1 절을 사용하는 것을 끝내었지만, 그것은 두 가지 방법으로 할 수있는 것으로 보인다. – javanix

+3

그러나 이것은 조금 해키입니다. 그냥'DatabaseMetaData'를 사용하는 것이 더 깔끔합니다. – BalusC

+0

WHERE 1 = 0은 모든 데이터베이스에서 작동합니다. – sproketboy

0

다른 해결책

select * from mytable limit 0;

그런 다음 쿼리에서 데이터를 가져 오지 않습니다.

관련 문제