Java SQL Variable menge an Spalten ausgeben?

3 Antworten

Von einem Experten bestätigt
//Retrieving the ResultSetMetaData object
ResultSetMetaData rsmd = rs.getMetaData();
//getting the column type
int column_count = rsmd.getColumnCount();

Einfach die Anzahl der Spalten dynamisch beziehen und dann via for Loop durch diese hindurchgehen.

LG

Woher ich das weiß:Berufserfahrung – 💻 Zertifizierter Sr. Cloud Engineer im IT-Consulting
DZNRandom 
Fragesteller
 22.02.2022, 09:01

Danke, genau das war auch mein gedanke, allerdings weiß ich nicht wie ich diesem loop da einbauen kann. Ist es nicht unfunktional wenn ich eine for in eine While packe? Hab da grad in meinem Kopf einen logik Fehler. Kannst du bitte kurz ein beispiel geben? :)

0
Dultus, UserMod Light   22.02.2022, 09:06
@DZNRandom
Connection con = DriverManager.getConnection(url, user, pass);
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("select * from staedteUSA;");
ResultSetMetaData rsmd = rs.getMetaData();
int column_count = rsmd.getColumnCount();

while(rs.next())
{
  for (int i = 0; i < column_count; i++)
    {
            System.out.print(rs.getString(i) + " ";
    }
  System.out.println("");
}

Das Leerzeichen am Schluss jeder Zeile dürfte nicht stören. Wenn doch, kannst du einfach trimmen. (Trim();)

 Ist es nicht unfunktional wenn ich eine for in eine While packe?

Jein, manchmal ja - in dem Falle nicht, da es egal ist, ob du nun

System.out.println(rs.getString(1) + " " +
rs.getString(2) + " " +
rs.getString(3) + " " +
rs.getString(4));

Eingibst oder das über eine For-Schleife machst. :-)

LG

0
DZNRandom 
Fragesteller
 22.02.2022, 09:36
@Dultus, UserMod Light

Danke! Habs grade versucht, leider kommt folgende Meldung: Der Index "0" liegt außerhalb des gültigen Bereichs. Danke schonmal!

Hier mal die Methode:

public static void execute() throws SQLException{

   ConAndEx c = new ConAndEx();

   Config w = new Config();

  

  

    Statement stmt = c.getconn().createStatement();

     

    ResultSet rs = stmt.executeQuery(w.getcommand());

    ResultSetMetaData rsmd = rs.getMetaData();

    int column_count = rsmd.getColumnCount();

    

    while(rs.next())

    {

     for (int i = 0; i < column_count; i++)

      {

          System.out.print(rs.getString(i) + " ");

      }

     System.out.println("");

    }}}

0
Dultus, UserMod Light   22.02.2022, 09:47
@DZNRandom

Oh, entschuldige - for (int i = 1; i <= column_count; i++)

Der GetString wird ja nicht bei einem Array ausgeführt. Deshalb wollte ich bei 0 anfangen. :o)

0
DZNRandom 
Fragesteller
 22.02.2022, 10:09
@Dultus, UserMod Light

Klappt, danke dir!!!!! Kurze frage noch: Was macht genau dieses System.out.println("");? I mean es ist ja basicly leer aber ohne das bekomme ich ja keine ausgabe.

0
Dultus, UserMod Light   22.02.2022, 10:13
@DZNRandom

Das "ln" steht für Line - wir geben also "nichts" aus und springen eine Zeile runter. Print schreibt hingegen nur in eine Zeile. Ohne das Println würden wir also permanent in der selben Zeile bleiben.

0
DZNRandom 
Fragesteller
 22.02.2022, 10:28
@Dultus, UserMod Light

Kann ich mir das eigentlich in einer richtigen Tabelle ausgeben lassen? Zumindest so dass die abstände gleich sind. Achso, hier der Code womit ich auch spalten anzeigen lasse:
for (int i = 1; i < column_count + 1; i++) {

String spaltenname = rsmd.getColumnName(i);

System.out.print(spaltenname);

}

System.out.print("\n");

while (rs.next()) {

for (int i = 1; i < column_count + 1; i++) {

System.out.print(rs.getString(i) + "\t");

}

System.out.println("");

}

0

ganz einfach -- gar nicht ;-)

"select *" ist nur für interaktives Entdecken, nicht für jdbc. Dort immer schön die gewünschten Spalten angeben.

Gandalf830  22.02.2022, 08:48

Naja doch. Zum einen könnte die API die Spaltenanzahl liefern, zum anderem könnte man eine Schleife nehmen und solange inkrementieren, bis eine Exception geworfen wird, die man abfängt. Oder SQL verwenden, um die Anzahl der Spalten zu zählen. Oder SQL verwenden und damit im Katalog nachgucken (Hängt natürlich dann vom Back-End ab).

0
freejack75  22.02.2022, 08:51
@Gandalf830

ja, es geht technisch. Trotzdem ist "select *" keine gute Idee an der Stelle.

0
freejack75  22.02.2022, 08:56
@Gandalf830

nein, das macht nur allerseltents Sinn (z.B. wenn ich eine allgemeine Reporting-Engine bauen will, und selbst da geht es besser).

Vorher lieber den Katalog abfragen und dann eine ordentliche Query bauen.

"select *" in JDBC ist einfach Anfänger-Mist. Wenn ich Code Reviews mache lasse ich das nicht durchgehen. Just sayin.

0
Gandalf830  22.02.2022, 09:00
@freejack75

Du kennst den genauen Anwendungsfall des Fragestellers überhaupt gar nicht (Das Beispiel in der Frage ist eben möglichwerweise nur ein Beispiel für einen komplexeren Fall) und es könnte sich um so einen seltenen Fall handeln. Deine Antwort "gar nicht" stimmt nicht, wie du bereits selbst schreibst.

Ja in einem Code-Review weißt du ja auch worum es geht.

0
Gandalf830  22.02.2022, 09:02
@freejack75

Du schreibst: "ganz einfach -- gar nicht ;-)" und dann "ja, es geht technisch. ". Das ist ein Wiederspruch. Und ob es eine Anfänger-Frage ist, dass weißt du auch nicht.

1

Dultus hat dir bereits alles an die Hand gegeben. Selbstverständlich kannst Du eine For-Schleife innerhalb von While verschachteln aber ich rate dir aus designtechnischen Gründen das nicht so zu machen sondern alle Spalten immer voll qualifizieren und benamen, denn zu einem späterem Zeitpunkt weis niemand mehr was Parameter3 war.

Das ist ganz schlechter Stil und sollte unbedingt vermieden werden.

Woher ich das weiß:Berufserfahrung
Dultus, UserMod Light   22.02.2022, 10:16

Das stimmt. :-)

Man sollte natürlich optimalerweise immer wissen, was man bekommt. Dafür nutzt man schlussendlich ja auch Interfaces und Delegaten.

1