2012-09-11 17 views
20

Possiedo un ResultSet che restituisce dati di tipi diversi. La query è costruita dinamicamente quindi, al momento della compilazione, non so quale tipo di valore restituirà la query.Come posso ottenere diversi tipi di dati da ResultSetMetaData in Java?

Ho scritto il seguente codice assumendo che tutti i risultati siano stringhe. Ma voglio ottenere anche il tipo di ciascun valore. Come posso fare questo?

Di seguito è riportato il codice che ho scritto.

while (reportTable_rst.next()) { 
    String column = reportTable_rst.getString(columnIterator); 
} 

A questo punto, desidero ottenere il tipo di colonna e ottenere il valore in base al tipo di dati.

+0

Ciao a tutti. Questa è un'informazione per i futuri visitatori. Se il requisito è ottenere il valore del campo indipendentemente dal tipo di dati di tale colonna, è possibile utilizzare il metodo getObject del metodo resultSet e setObject di PreparedStatement durante l'inserimento. Ecco un esempio. 'While (rsdata.next()) \t \t { \t \t \t for (int i = 0; i learner

risposta

30

Le ResultSetMetaData.getColumnType(int column) restituisce il valore int specificando il tipo di colonna trovata in java.sql.Types.

Esempio:

Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD); 
PreparedStatement statement = connection.prepareStatement(JDBC_SELECT); 
ResultSet rs = statement.executeQuery(); 
PrintStream out = System.out; 

if (rs != null) { 
    while (rs.next()) { 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
      if (i > 1) { 
      out.print(","); 
      } 

      int type = rsmd.getColumnType(i); 
      if (type == Types.VARCHAR || type == Types.CHAR) { 
       out.print(rs.getString(i)); 
      } else { 
       out.print(rs.getLong(i)); 
      } 
     } 

     out.println(); 
    } 
} 
+0

Buona risposta. Forse il pignolo, ma una domanda: perché recuperare * ResultSetMetaData * oggetto all'interno di un ciclo 'while'? Voglio dire, è sempre lo stesso, i nomi delle colonne e i loro tipi sono uguali. È sufficiente recuperare l'oggetto * ResultSetMetaData * ** una volta, prima ** del ciclo 'while'. – informatik01

+0

Senza l'iterazione di 'ResultSet', si verificherà un'eccezione in questo modo:' java.sql.SQLException: posizione del cursore non valida. Iterazione sposta il cursore in una direzione specificata o 'FORWARD' di default. –

+0

Ovviamente so che devi usare 'rs.next()' per iterare/passare alla riga successiva. Stavo dicendo sull'oggetto ** ResultSetMetaData **, che è ** lo stesso ** e non ha bisogno di essere iterato. Quindi puoi recuperare facilmente l'oggetto ** ResultSetMetaData ** solo una volta **, prima di entrare nel ciclo 'while', e non ti darà alcuna eccezione. – informatik01

3

È possibile chiamare,

Per ritorna designati tipo SQL della colonna.

int ResultSetMetaData.getColumnType(int column)

per tornare designato specifiche del database nome del tipo della colonna.

String ResultSetMetaData.getColumnTypeName(int column)

3
ResultSet rs; 
int column; 
..... 
ResultSetMetaData metadata = rs.getMetaData(); 
metadata.getColumnTypeName(column); // database specific type name 
metadata.getColumnType(column); // returns the SQL type 
1

Penso che la risposta di cui sopra non sta andando in loop e hanno una certa mancanza di dettagli. Questo frammento di codice può migliorare per mostrare solo il nome della colonna e il tipo di dati corrispondente. Ecco il codice completamente funzionante

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 

public class Test { 

    private static final String DRIVER = "com.mysql.jdbc.Driver"; 
    private static final String HOST = "192.168.56.101"; 
    private static final String PORT = "3316"; 
    private static final String CONNECTION_URL = "jdbc:mysql://"+HOST+":"+PORT+"/"; 
    private static final String USERNAME = "user"; 
    private static final String PASSWORD = "pwd"; 
    private static final String DATABASE = "db"; 
    private static final String TABLE = "table"; 
    private static final String QUERY = "select * from "+DATABASE+"."+TABLE+" where 1=0"; 

    public static void main(String[] args) throws ClassNotFoundException, SQLException { 
     Class.forName(DRIVER); 
     Connection con = DriverManager.getConnection (CONNECTION_URL , USERNAME, PASSWORD); 
     ResultSet rs = con.createStatement().executeQuery(QUERY); 
     if (rs != null) { 
      System.out.println("Column Type\t\t Column Name"); 

       ResultSetMetaData rsmd = rs.getMetaData(); 
       for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
        System.out.println(rsmd.getColumnTypeName(i)+"\t\t\t"+rsmd.getColumnName(i)); 
      } 
     } 
    } 
}