2012-01-20 22 views
7

में दिनांक के लिए लौटाया गया है मेरे पास एमएस एसक्यूएल सर्वर पर एक टेबल है जिसमें कॉलम डेटा डेटा है। मैं डीबी के साथ जेडीबीसी कनेक्शन के लिए jtds.jar का उपयोग कर रहा हूँ। मैं कनेक्शन से डेटाबेस मेटाडेटा ले रहा हूँ। DatabaseMetaData से स्तंभ करते हुए मैं java.sql.Types.VARCHAR जो एक स्ट्रिंग और नहीं तारीख के रूप में है किगलत डेटा प्रकार jtds.jar

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

रिटर्न कॉलम प्रकार मनाया। लेकिन यह

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

टाइप नाम के रूप में भी लौटाता है।

लेकिन ओरेकल के लिए, यह दिनांक डेटाटाइप java.sql.Types.DATE के रूप में देता है।

ऐसा अंतर क्यों है?

+0

क्यों तुम सिर्फ .getTimestamp ("DATA_TYPE") ' – epoch

+0

का उपयोग नहीं करते' प्रति मेरी जानकारी getInt ("DATA_TYPE") के रूप में से http://docs.oracle.com/javase/1.4 प्रकारों में से एक वापस आ जाएगी .2/डॉक्स/एपीआई/स्थिर-मूल्य.html # java.sql.Types.DATE – FlyingDutchman

+2

मुझे भी इसी तरह का लिंक मिला: http://stackoverflow.com/questions/7885459/jdbc-jtds-bug-for-columns- ऑफ-टाइप-डेट-एंड-टाइमएक्स – FlyingDutchman

उत्तर

4

यह ज्ञात जेटीडीएस बग है, http://sourceforge.net/p/jtds/bugs/679/ देखें।

एक SQLServer दिनांक प्रकार के लिए लौट आए डेटाप्रकार से 10 की लंबाई यह गलत है के साथ एक varchar के रूप में दिया जाता है, यह Sql.Date के रूप में वापस आ जाएगी। int iType = rsMeta.getInt ("DATA_TYPE"); स्ट्रिंग tmp = rsMeta.getString ("TYPE_NAME");

1

यह अभी भी जेटीडीएस 1.3.1 के साथ एक खुला मुद्दा प्रतीत होता है। मैं टेबल के साथ मैं काम कर रहा हूँ के लिए सीधे एसक्यूएल सर्वर तालिका सूची क्वेरी करने, और मेज के लिए तिथि कॉलम की एक सूची हो रही द्वारा यह आस-पास काम करने में सक्षम था:

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;   
} 

बार जब आप इस सूची है, आप कर सकते हैं स्पष्ट रूप से जाँच करें और देखें कि स्तंभ दिनांक प्रकार है:

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; 
} 

तो, मैं तीन स्तंभों के साथ एक नमूना तालिका है कहना डीएस:

... 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 

यह आदर्श नहीं है, लेकिन इसे इसी तरह की समस्या वाले अन्य लोगों के लिए काम करना चाहिए।

संबंधित मुद्दे