2012-09-11 20 views
20

Tengo un ResultSet que devuelve datos de diferentes tipos. La consulta se construye de forma dinámica, por lo que, en tiempo de compilación, no sé qué tipo de valor devolverá la consulta.¿Cómo puedo obtener diferentes tipos de datos de ResultSetMetaData en Java?

He escrito el siguiente código suponiendo que todos los resultados son cadenas. Pero también quiero obtener el tipo de cada valor. ¿Cómo puedo hacer esto?

A continuación se muestra el código que he escrito.

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

En este punto, me gustaría obtener el tipo de columna y obtener el valor de acuerdo con el tipo de datos.

+0

Hola a todos. Esta es una información para futuros visitantes. Si su requisito es obtener el valor de campo independientemente del tipo de datos de esa columna, puede usar el método getObject de resultSet y el método setObject de PreparedStatement durante la inserción. Aquí hay un ej. 'While (rsdata.next()) \t \t { \t \t \t for (int i = 0; i learner

Respuesta

30

Los ResultSetMetaData.getColumnType(int column) Devuelve un valor int especificando el tipo de columna que se encuentra en java.sql.Types.

Ejemplo:

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

Buena respuesta. Quizás quisquilloso, pero una pregunta: ¿por qué recuperar el objeto * ResultSetMetaData * dentro de un bucle 'while'? Quiero decir que sigue siendo el mismo, los nombres de columna y sus tipos también son iguales. Solo podría recuperar el objeto * ResultSetMetaData * una vez, antes de ** el bucle 'while'. – informatik01

+0

Sin la iteración de 'ResultSet', encontrará una excepción como:' java.sql.SQLException: posición del cursor no válida. La iteración mueve el cursor en la dirección especificada o 'ADELANTE 'por defecto. –

+0

Por supuesto, sé que debe usar 'rs.next()' para iterar/pasar a la siguiente fila. Estaba diciendo acerca del objeto ** ResultSetMetaData **, que es ** el mismo ** y no necesita ser iterado. Por lo tanto, puede recuperar fácilmente el objeto ** ResultSetMetaData ** ** solo una vez **, antes de ingresar al bucle 'while', y no le dará ninguna excepción. – informatik01

3

Puede llamar,

A vueltas designados tipo de SQL de la columna.

int ResultSetMetaData.getColumnType(int column)

para volver designado nombre del tipo de base de datos específica de la columna.

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

creo que la respuesta anterior no va en bucle y tiene cierta falta de detalles. Este fragmento de código puede mejorar para mostrar el Nombre de columna y el tipo de datos correspondiente. Aquí está el código de trabajo completo

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)); 
      } 
     } 
    } 
} 
Cuestiones relacionadas