Comment obtenir le nombre de colonnes d'un ResultSet JDBC?


92

J'utilise CsvJdbc (c'est un pilote JDBC pour les fichiers csv) pour accéder à un fichier csv. Je ne sais pas combien de colonnes le fichier csv contient. Comment puis-je obtenir le nombre de colonnes? Existe-t-il une fonction JDBC pour cela? Je ne trouve aucune méthode pour cela dans java.sql.ResultSet.

Pour accéder au fichier, j'utilise un code similaire à l' exemple sur le site CsvJdbc.

Réponses:


250

Vous pouvez obtenir le numéro de colonne de ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();

1
Il serait intéressant de comprendre comment le pilote CSV JDBC et son ResultSetMetaDataimplémentation gèrent les enregistrements CSV de longueur variable. Par exemple, si vous avez spécifié SELECT * FROM sampleet que chaque ligne contenait un nombre différent de champs, le nombre de colonnes serait-il réévalué pour chaque ligne qui a été itérée?
rhu

@rhu C'est facile. Ce ne serait pas le cas, car les métadonnées sont indépendantes de la ligne sur laquelle vous vous trouvez. C'est donc vraisemblablement le nombre maximum de colonnes trouvées.
Marquis 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)); 

1
Quelqu'un le sait-il? La rs.getMetaData()méthode est-elle chère? Interroge-t-il la base de données à chaque fois qu'elle est appelée ou non?
Fandi Susanto

L' rs.getMetaData()appel peut être intensif; mais une fois que vous avez l'objet, rsmdaucun appel supplémentaire à la base de données n'est généralement effectué lors de l'appel de méthodes sur l'objet de métadonnées; toutes les métadonnées sont remplies avec l'appel getMetaData.
Mark Stewart

2
Cela ne devrait-il pas être rsmd.getColumnName (1) et rsmd.getColumnTypeName (1)? Nous imprimons la "1ère colonne", pas la 2ème.
DAB

5

Nombre de colonnes dans le jeu de résultats que vous pouvez obtenir avec du code (car DB est utilisé PostgreSQL):

// charge le pilote pour PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Propriétés props = nouvelles propriétés ();
props.setProperty ("utilisateur", "mydbuser");
props.setProperty ("mot de passe", "mydbpass");
Connexion conn = DriverManager.getConnection (url, accessoires);

// créer une instruction
Instruction stat = conn.createStatement ();

// obtenir un jeu de résultats
ResultSet rs = stat.executeQuery ("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");

// à partir du jeu de résultats, donne les métadonnées
ResultSetMetaData rsmd = rs.getMetaData ();

// nombre de colonnes à partir de l'objet de métadonnées
int numOfCols = rsmd.getColumnCount ();

Mais vous pouvez obtenir plus de méta-informations sur les colonnes:

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

Et au moins mais pas des moindres, vous pouvez obtenir des informations non seulement sur la table mais aussi sur DB, comment le faire, vous pouvez trouver ici et ici .


4

Après avoir établi la connexion et exécuté la requête, essayez ceci:

 ResultSet resultSet;
 int columnCount = resultSet.getMetaData().getColumnCount();
 System.out.println("column count : "+columnCount);

-1

Cela imprimera les données dans les colonnes et arrivera à la nouvelle ligne une fois que la dernière colonne sera atteinte.

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

            }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.