Wie erhalte ich die Anzahl der Spalten aus einem JDBC ResultSet?


92

Ich verwende CsvJdbc (es ist ein JDBC-Treiber für CSV-Dateien), um auf eine CSV-Datei zuzugreifen. Ich weiß nicht, wie viele Spalten die CSV-Datei enthält. Wie kann ich die Anzahl der Spalten ermitteln? Gibt es dafür eine JDBC-Funktion? Ich kann keine Methoden dafür in java.sql.ResultSet finden.

Für den Zugriff auf die Datei verwende ich Code ähnlich dem Beispiel auf der CsvJdbc-Website.

Antworten:


250

Sie können die Spaltennummer von ResultSetMetaData erhalten :

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

int columnsNumber = rsmd.getColumnCount();

1
Es wäre interessant zu verstehen, wie der CSV-JDBC-Treiber und seine ResultSetMetaDataImplementierung CSV-Datensätze mit variabler Länge verarbeiten. Wenn Sie beispielsweise angegeben haben SELECT * FROM sampleund jede Zeile eine andere Anzahl von Feldern enthält, wird die Spaltenanzahl für jede Zeile, die wiederholt wurde, neu bewertet?
Rhu

@rhu Das ist einfach. Dies wäre nicht der Fall, da die Metadaten unabhängig davon sind, in welcher Zeile Sie sich befinden. Vermutlich ist es also die maximale Anzahl gefundener Spalten.
Marquis von 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
Weiß jemand Bescheid? Ist die rs.getMetaData()Methode teuer? Fragt es die Datenbank jedes Mal ab, wenn sie aufgerufen wird oder nicht?
Fandi Susanto

Der rs.getMetaData()Anruf kann intensiv sein; Sobald Sie das Objekt haben, werden rsmdnormalerweise keine zusätzlichen Aufrufe an die Datenbank ausgeführt, wenn Methoden für das Metadatenobjekt aufgerufen werden. Alle Metadaten werden mit dem Aufruf getMetaData gefüllt.
Mark Stewart

2
Sollte das nicht rsmd.getColumnName (1) und rsmd.getColumnTypeName (1) sein? Wir drucken die "1. Spalte", nicht die 2. Spalte.
DAB

5

Anzahl der Spalten in der Ergebnismenge, die Sie mit Code erhalten können (da DB PostgreSQL verwendet wird):

// lade den Treiber für PostgreSQL
Class.forName ("org.postgresql.Driver");

String url = "jdbc: postgresql: // localhost / test";
Eigenschaften Requisiten = neue Eigenschaften ();
props.setProperty ("Benutzer", "mydbuser");
props.setProperty ("Passwort", "mydbpass");
Verbindung conn = DriverManager.getConnection (URL, Requisiten);

// Anweisung erstellen
Anweisung stat = conn.createStatement ();

// eine Ergebnismenge erhalten
ResultSet rs = stat.executeQuery ("SELECT c1, c2, c3, c4, c5 FROM MY_TABLE");

// aus der Ergebnismenge geben Metadaten
ResultSetMetaData rsmd = rs.getMetaData ();

// Spaltenanzahl aus Metadatenobjekt
int numOfCols = rsmd.getColumnCount ();

Sie können jedoch weitere Meta-Informationen zu Spalten erhalten:

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

Und zumindest aber nicht zuletzt können Sie einige Informationen nicht nur über die Tabelle, sondern auch über die DB erhalten. Wie das geht, finden Sie hier und hier .


4

Versuchen Sie Folgendes, nachdem Sie die Verbindung hergestellt und die Abfrage ausgeführt haben:

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

-1

Dadurch werden die Daten in Spalten gedruckt und eine neue Zeile angezeigt, sobald die letzte Spalte erreicht ist.

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

            }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.