¿Cómo obtener el número de columnas de un ResultSet JDBC?

92

Estoy usando CsvJdbc (es un controlador JDBC para archivos csv) para acceder a un archivo csv. No sé cuántas columnas contiene el archivo csv. ¿Cómo puedo obtener el número de columnas? ¿Existe alguna función JDBC para esto? No puedo encontrar ningún método para esto en java.sql.ResultSet.

Para acceder al archivo, utilizo un código similar al ejemplo del sitio web CsvJdbc.

Jonas
fuente

Respuestas:

250

Puede obtener el número de columnas de ResultSetMetaData :

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();

int columnsNumber = rsmd.getColumnCount();
romano
fuente
1
Sería interesante comprender cómo el controlador CSV JDBC y su ResultSetMetaDataimplementación manejan los registros CSV de longitud variable. Por ejemplo, si especificaste SELECT * FROM sampley cada fila contuviera un número diferente de campos, ¿se volvería a evaluar el recuento de columnas para cada fila que se repitiera?
rhu
@rhu Eso es fácil. No lo haría, porque los metadatos son independientes de la fila en la que se encuentre. Así que presumiblemente es el número máximo de columnas encontradas.
Marqués de Lorne
8
PreparedStatement ps=con.prepareStatement("select * from stud");

ResultSet rs=ps.executeQuery();

ResultSetMetaData rsmd=rs.getMetaData();

System.out.println("columns: "+rsmd.getColumnCount());  
System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1));  
System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1)); 
lokesh
fuente
1
¿Alguien lo sabe? ¿Es rs.getMetaData()caro el método? ¿Consulta la base de datos cada vez que se llama o no?
Fandi Susanto
La rs.getMetaData()llamada puede ser intensa; pero una vez que tiene el objeto rsmd, por lo general, no se realizan llamadas adicionales a la base de datos al invocar métodos en el objeto de metadatos; todos los metadatos se rellenan con la llamada getMetaData.
Mark Stewart
2
¿No debería ser rsmd.getColumnName (1) y rsmd.getColumnTypeName (1)? Estamos imprimiendo la "primera columna", no la segunda.
DAB
5

Número de columnas en el conjunto de resultados que puede obtener con el código (ya que DB se usa PostgreSQL):

// carga el controlador para PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Propiedades props = new Properties ();
props.setProperty ("usuario", "mydbuser");
props.setProperty ("contraseña", "mydbpass");
Conexión conn = DriverManager.getConnection (url, props);

// crear declaración
Declaración stat = conn.createStatement ();

// obtener un conjunto de resultados
ResultSet rs = stat.executeQuery ("SELECCIONAR c1, c2, c3, c4, c5 DESDE MI_TABLE");

// del conjunto de resultados dar metadatos
ResultSetMetaData rsmd = rs.getMetaData ();

// las columnas cuentan del objeto de metadatos
int numOfCols = rsmd.getColumnCount ();

Pero puede obtener más metainformaciones sobre las columnas:

for(int i = 1; i <= numOfCols; i++)
{
    System.out.println(rsmd.getColumnName(i));
}

Y al menos, pero no menos importante, puede obtener información no solo sobre la mesa sino también sobre DB, cómo hacerlo, puede encontrar aquí y aquí .

1ac0
fuente
4

Después de establecer la conexión y ejecutar la consulta, intente esto:

 ResultSet resultSet;
 int columnCount = resultSet.getMetaData().getColumnCount();
 System.out.println("column count : "+columnCount);
Prabodh Hend
fuente
-1

Esto imprimirá los datos en columnas y aparecerá en una nueva línea una vez que se alcance la última columna.

ResultSetMetaData resultSetMetaData = res.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
for(int i =1; i<=columnCount; i++){
                if(!(i==columnCount)){

                    System.out.print(res.getString(i)+"\t");
                }
                else{
                    System.out.println(res.getString(i));
                }

            }
nitish shah
fuente