Como obter o número de colunas de um ResultSet JDBC?

92

Estou usando o CsvJdbc (é um driver JDBC para arquivos csv) para acessar um arquivo csv. Não sei quantas colunas o arquivo csv contém. Como posso obter o número de colunas? Existe alguma função JDBC para isso? Não consigo encontrar nenhum método para isso em java.sql.ResultSet.

Para acessar o arquivo, utilizo um código semelhante ao exemplo do site CsvJdbc.

Jonas
fonte

Respostas:

250

Você pode obter o número das colunas em ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();
romano
fonte
1
Seria interessante entender como o driver CSV JDBC e sua ResultSetMetaDataimplementação lidam com registros CSV de comprimento variável. Por exemplo, se você especificou SELECT * FROM samplee cada linha continha um número diferente de campos, a contagem de colunas seria reavaliada para cada linha que foi iterada?
rhu
@rhu Isso é fácil. Não faria isso, porque os metadados são independentes da linha em que você está. Portanto, provavelmente é o número máximo de colunas 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
fonte
1
Alguém sabe? O rs.getMetaData()método é caro? Ele consulta o banco de dados toda vez que é chamado ou não?
Fandi Susanto
A rs.getMetaData()chamada pode ser intensa; mas, depois de ter o objeto rsmd, normalmente nenhuma chamada adicional ao banco de dados é feita ao invocar métodos no objeto de metadados; todos os metadados são preenchidos com a chamada getMetaData.
Mark Stewart
2
Não deveria ser rsmd.getColumnName (1) e rsmd.getColumnTypeName (1)? Estamos imprimindo a "1ª coluna", não a 2ª.
DAB
5

Número de colunas no conjunto de resultados que você pode obter com o código (como DB é usado PostgreSQL):

// carregue o driver para PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Propriedades adereços = novo Propriedades ();
props.setProperty ("usuário", "mydbuser");
props.setProperty ("senha", "mydbpass");
Conexão conn = DriverManager.getConnection (url, props);

// criar declaração
Instrução stat = conn.createStatement ();

// obtenha um conjunto de resultados
ResultSet rs = stat.executeQuery ("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");

// do conjunto de resultados fornece metadados
ResultSetMetaData rsmd = rs.getMetaData ();

// contagem de colunas do objeto de metadados
int numOfCols = rsmd.getColumnCount ();

Mas você pode obter mais meta-informações sobre colunas:

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

E pelo menos, mas não menos importante, você pode obter algumas informações não apenas sobre a mesa, mas também sobre o DB, como fazer isso você pode encontrar aqui e aqui .

1ac0
fonte
4

Depois de estabelecer a conexão e executar a consulta, tente o seguinte:

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

Isso imprimirá os dados em colunas e chegará a uma nova linha assim que a última coluna for alcançada.

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

            }
xá nitish
fonte