2012-01-20 3 views
7

데이터 형식이 날짜 인 열이있는 MS SQL Server에 대한 테이블이 있습니다. DB와의 JDBC 연결을 위해 jtds.jar을 사용하고 있습니다. Connection에서 DatabaseMetaData를 가져옵니다. DatabaseMetaData의에서 열을 확인하면서, 나는 문자열이 아닌 날짜입니다 java.sql.Types.VARCHAR로 그잘못된 데이터 형식이 jtds.jar의 날짜로 반환되었습니다.

int iType = rsMeta.getInt("DATA_TYPE"); 

반환 열 유형을 관찰했다. 또한

String tmp = rsMeta.getString("TYPE_NAME"); 

날짜 형식으로 표시됩니다.

그러나 Oracle의 경우 데이터 유형을 java.sql.Types.DATE으로 반환합니다.

왜 그렇게 다른가요?

+0

'.getTimestamp ("DATA_TYPE")' – epoch

+0

내 지식에 따라 getInt ("DATA_TYPE")는 http://docs.oracle.com/javase/1.4에서 유형 중 하나를 반환해야합니다. .2/docs/api/constant-values.html # java.sql.Types.DATE – FlyingDutchman

+2

나는 또한 이와 비슷한 링크를 발견 : http://stackoverflow.com/questions/7885459/jdbc-jtds-bug-for-columns- of-date-and-timex – FlyingDutchman

답변

4

이것은 알려진 JTDS 버그입니다 (http://sourceforge.net/p/jtds/bugs/679/ 참조).

SQLServer에 날짜 유형에 대한 반환 데이터 형식이 잘못 (10)의 길이의 VARCHAR로 반환됩니다, 그것은 Sql.Date로 반환해야합니다. int iType = rsMeta.getInt ("DATA_TYPE"); 문자열 tmp = rsMeta.getString ("TYPE_NAME");

1

이것은 여전히 ​​jTDS 1.3.1에서 열린 문제로 보입니다. 내가 함께 일하고 있어요 테이블에 대한 직접 SQL Server 테이블 카탈로그를 쿼리하고 테이블에 대한 날짜 열 목록을 얻어서 그것을 해결할 수 있었다 :

private HashMap<String,Boolean> getDateColumns (String tableName, String schemaName, Connection conn) throws Exception { 
    String sql = "SELECT table_name + ',' + column_name" 
       + " FROM INFORMATION_SCHEMA.COLUMNS " 
       + " WHERE TABLE_SCHEMA = N'" + schemaName + "' " 
       + " AND table_name = N'" + tableName + "' " 
       + " AND data_type IN ('date', 'datetime', 'datetime2')"; 

    Statement stmt = conn.createStatement();       
    ResultSet rs = stmt.executeQuery(sql); 
    HashMap<String,Boolean> dateCols = new HashMap<String,Boolean>(); 

    while (rs.next()) { 
     String tableColKey = rs.getString(1);   
     dateCols.put(tableColKey.toUpperCase(), true); 
    } 

    rs.close();  
    return dateCols;   
} 

당신이 목록이 있으면, 당신이 할 수있는 JT와 함께 실행할 때

SAMPLE 
------------------ 
SITE_ID  numeric 
START_DATE date 
END_DATE date 

이 코드는 다음 값을 출력 할 것이다 :

private ResultSetMetaData getTableMetaData (String tableName, Connection conn) throws Exception { 
    String sql = "SELECT * FROM dbo." + tableName + " where 1 = 2 "; 
    Statement stmt = conn.createStatement();       
    ResultSet rs = stmt.executeQuery(sql); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    rs.close(); 

    HashMap<String,Boolean> dateColumns = getDateColumns (tableName, conn); 

    for (int i = 1; i <= rsmd.getColumnCount(); i++) {     

     String key = tableName + "," + rsmd.getColumnName(i); 
     int type = -1; 
     if (dateColumns.containsKey(key)) { 
      type = Types.DATE; 
     } 
     else { 
      type = rsmd.getColumnType(i); 
     } 

     System.out.println ("... col: " + rsmd.getColumnName(i) + ", driver type name: " + rsmd.getColumnTypeName(i) + ", driver type: " + rsmd.getColumnType(i) + ", final data type: " + type); 
    }  

    return rsmd; 
} 

그래서, 나는 세 개의 열이있는 샘플 테이블이 있다고 가정 : 열이 날짜 유형의 경우 명시 적으로 확인하고 참조 DS :

... col: SITE_ID, driver type name: numeric, driver type: 2, final data type: 2 
... col: START_DATE, driver type name: nvarchar, driver type: 12, final data type: 91 
... col: END_DATE, driver type name: nvarchar, driver type: 12, final data type: 91 

비슷한 문제가있는 다른 사람들에게도 적합합니다.

관련 문제