Come ottenere il numero di colonne da un ResultSet JDBC?


92

Sto usando CsvJdbc (è un driver JDBC per file csv) per accedere a un file csv. Non so quante colonne contiene il file csv. Come posso ottenere il numero di colonne? Esiste una funzione JDBC per questo? Non riesco a trovare alcun metodo per questo in java.sql.ResultSet.

Per accedere al file, utilizzo un codice simile all'esempio sul sito Web CsvJdbc.

Risposte:


250

Puoi ottenere il numero di colonne da ResultSetMetaData :

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

int columnsNumber = rsmd.getColumnCount();

1
Sarebbe interessante capire come il driver JDBC CSV e la sua ResultSetMetaDataimplementazione gestiscano i record CSV di lunghezza variabile. Ad esempio, se si specificava SELECT * FROM samplee ogni riga conteneva un numero diverso di campi, il conteggio delle colonne verrebbe rivalutato per ogni riga su cui è stata ripetuta l'iterazione?
rhu

@rhu È facile. Non lo sarebbe, perché i metadati sono indipendenti dalla riga in cui ti trovi. Quindi presumibilmente è il numero massimo di colonne trovate.
Marchese di 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
Qualcuno lo sa? Il rs.getMetaData()metodo è costoso? Interroga il database ogni volta che viene chiamato o no?
Fandi Susanto

La rs.getMetaData()chiamata può essere intensiva; ma una volta ottenuto l'oggetto, di rsmdsolito non vengono eseguite ulteriori chiamate al database quando si invocano metodi sull'oggetto metadati; tutti i metadati vengono popolati con la chiamata getMetaData.
Mark Stewart

2
Non dovrebbero essere rsmd.getColumnName (1) e rsmd.getColumnTypeName (1)? Stiamo stampando la "prima colonna", non la seconda.
DAB

5

Numero di colonne nel set di risultati che puoi ottenere con il codice (poiché DB viene utilizzato PostgreSQL):

// carica il driver per PostgreSQL
Class.forName ("org.postgresql.Driver");

Stringa url = "jdbc: postgresql: // localhost / test";
Proprietà props = new Properties ();
props.setProperty ("user", "mydbuser");
props.setProperty ("password", "mydbpass");
Connessione conn = DriverManager.getConnection (url, props);

// crea una dichiarazione
Istruzione stat = conn.createStatement ();

// ottiene un set di risultati
ResultSet rs = stat.executeQuery ("SELEZIONA c1, c2, c3, c4, c5 DA MY_TABLE");

// dal set di risultati fornisce i metadati
ResultSetMetaData rsmd = rs.getMetaData ();

// conteggio delle colonne dall'oggetto metadati
int numOfCols = rsmd.getColumnCount ();

Ma puoi ottenere più meta-informazioni sulle colonne:

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

E almeno ma non meno importante, puoi ottenere alcune informazioni non solo sulla tabella ma anche sul DB, come farlo puoi trovare qui e qui .


4

Dopo aver stabilito la connessione ed eseguito la query, prova questo:

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

-1

Questo stamperà i dati in colonne e tornerà a una nuova riga una volta raggiunta l'ultima colonna.

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

            }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.