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.