Mit getString oder getObject einen Stringarray füllen

Hallo,

ich würde gerne einen 2-Dimensionalen String Array mit werten aus einer Derby DB füllen. Um diesen dann später in einem JTable auszugeben.

Momentan sieht mein Code wie folgt aus:

  int anzDatenSätze = 0;
            String[] SpaltenName = new String[meta.getColumnCount()+1];
            String[][] Tupel = new String[meta.getColumnCount()+1][meta.getColumnCount()+1];   
         

            //Namen der Spalten Ausgben
            for (int i = 1; i <= meta.getColumnCount(); i++) {     
                SpaltenName** = (String)meta.getColumnName(i);          
            }
           
            //inhalt der Spalten ausgeben    
            while(rs.next()){
               anzDatenSätze++; 
            }

            for(int a=1; a<=meta.getColumnCount();a++){
                for (int b=1; b<=anzDatenSätze;b++){;
                        Tupel[a]**= rs.getString(b);
                        System.out.println(Tupel[a]**);
                    }
                }

            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTable table = new JTable(Tupel, SpaltenName);
            f.add(new JScrollPane(table));
            f.pack();
            f.setVisible(true);
}

Denn String Array “Tupel” kann cih so leider nicht befüllen. Ich habe es auch mit

Tupel[a]**= rs.getObject(b).toString();

versucht, was ebenfalls nicht ging.

Ich würde mich freuen, wenn mir jemand helfen könnte, oder zumindest einen “Gedankenstubser” in die richtige Richtung geben könnte.

Grüße

der Gedankenschubser wäre hin zu Tutorials, grundlegender Durchlauf eines ResultSets,

while(rs.next())-Schleife ist dabei eben führend,
solange diese läuft kann man auf einen jeweiligen Datensatz zugreifen,

wenn am Ende durch dann maximal der letzte Datensatz oder gar keiner, was ist deine Fehlermeldung?

die bisher gezählte anzDatenSätze nutzt du auch noch gar nicht, um das Array in der richtigen Größe anzulegen


besser:
mit der while-Schleife arbeiten, je Zeile/ Eintrag ein eindimensionales Array anlegen, befüllen,
alle eindimensionalen Arrays in eine ArrayList, am Ende davon toArray() aufrufen

Wenn ich es richtig sehe, hättest Du mit dem zweidimensionalen String Array gerne eine Art Tabelle, die genau die Werte enthält, die ein SELECT zurück liefert. Dein erster gedanklicher Fehler ist bei der Allozierung des Arrays. Du allozierst ihn sowol bei der Spalten- als auch bei der Zeilenanzahl mit:

meta.getColumnCount()+1

. Das ist nur für die zweite Dimension (die Spalten) korrekt. Da dann nur die Frage, warum +1?. Für die erste Dimension (die Zeilen) stimmt es nicht. Hier ist die Anzahl der im ResultSet enthaltenen Zeilen entscheidend. Nun ist es aber garnicht so einfach, wie man denken sollte, diese Zahl rauszufinden. Da würde ich einen SELECT COUNT mit gleicher WHERE-Klausel vorweg machen. Hier würde ich übrigens das +1 verstehen, wenn Du gerne die Spaltenüberschriften mit drinnen hättest.

War es das? Ansonsten, schreibe bitte etwas mehr dazu, was “es ging nicht” bei Dir genau bedeutet.

Danke erstmal!

die bisher gezählte anzDatenSätze nutzt du auch noch gar nicht, um das Array in der richtigen Größe anzulegen
ich benutze die Schleife um rauszufinden wieviele Datensätze ich überhaupt in der Tabelle habe. Es geht mit sicherheit eleganter, mir ist aber spontan nichts eingefallen.
Wenn ich so arbeiten würde:

 while(rs.next()){
               for(int a=1; a<=meta.getColumnCount();a++){
                   for (int b=1; b<=**XXX**;b++){
                        Tupel[a]**= (String)rs.getObject(b); 
                    }
               }
           }    

Wüsste ich nicht wie ich die passende Abbruchbedingung schreiben kann.

Wenn ich es richtig sehe, hättest Du mit dem zweidimensionalen String Array gerne eine Art Tabelle, die genau die Werte enthält, die ein SELECT zurück liefert. Dein erster gedanklicher Fehler ist bei der Allozierung des Arrays. Du allozierst ihn sowol bei der Spalten- als auch bei der Zeilenanzahl mit:
Code:
meta.getColumnCount()+1
. Das ist nur für die zweite Dimension (die Spalten) korrekt. Da dann nur die Frage, warum +1?. Für die erste Dimension (die Zeilen) stimmt es nicht. Hier ist die Anzahl der im ResultSet enthaltenen Zeilen entscheidend. Nun ist es aber garnicht so einfach, wie man denken sollte, diese Zahl rauszufinden. Da würde ich einen SELECT COUNT mit gleicher WHERE-Klausel vorweg machen. Hier würde ich übrigens das +1 verstehen, wenn Du gerne die Spaltenüberschriften mit drinnen hättest.

War es das? Ansonsten, schreibe bitte etwas mehr dazu, was „es ging nicht“ bei Dir genau bedeutet.
Vielen dank dafür.
Ich habe

String[] SpaltenName = new String[meta.getColumnCount()+1];

und den Schleifen Zähler auf 1 gesetzt, da

meta.getColumnName(0)

nicht möglich ist. Eine tabelle fängt bei 1 an zu zählen und nicht, wie sonst üblich bei 0. (Soweit ich weiß)
Ich bekomme keine Fehlermeldung, bekomme allerdings auch keine Tabelle angezeigt.

So jetzt bin ich Angemeldet

mir geht es im Prinzip nur darum rauszufinden, wie ich es schaffe “Tupel[a]**” mit den jeweiligen Werten der Datenbank zu befüllen, damit ich diese als JTable ausgeben kann.

nichts angezeigt ist nie ausreichend, vielleicht hat deine Query gar keine Ergebnisse, ergo anzDatenSätze == 0,
dann wird die Schleife nicht ausgeführt,

man muss immer positiv arbeiten, etwa anzDatenSätze ausgeben, das muss irgendwas zeigen, und sei es 0

wie gesagt, in der while-Schleife kannst du jeweils einen Datensatz abarbeiten, dafür braucht es Grundverständnis, schaue dir in Tutorials an, wie ein ResultSet durchlaufen wird,

eine Doppelschleife innerhalb der while-Schleife ergibt keinen Sinn, da kann nur eine einfache Schleife stehen,
das gewonnene Ergebnis zu einem Eintrag dann etwa in einer Liste speichern


[QUOTE=-42-;23372]So jetzt bin ich Angemeldet

mir geht es im Prinzip nur darum rauszufinden, wie ich es schaffe „Tupel[a]**“ mit den jeweiligen Werten der Datenbank zu befüllen, damit ich diese als JTable ausgeben kann.[/QUOTE]

autsch, eine solche Wiederholung liest sich auch als völlige Ignorierung aller bisherigen Tipps…

[QUOTE=SlaterB]

autsch, eine solche Wiederholung liest sich auch als völlige Ignorierung aller bisherigen Tipps…[/QUOTE]

ähm ja habs auch gemerkt… war ein langer Tag Sorry :o

Ich habe mir in “Java ist auch eine Insel” den entsprechenden artikel durchgelesen.
Ich versuche mich morgen nochmal dran und melde mich dann nochmal.

Bis dahin schonmal vielen Dank für eure Hilfe

Ich habe
Code:
String[] SpaltenName = new String[meta.getColumnCount()+1;]
und den Schleifen Zähler auf 1 gesetzt

Beim Schleifenzähler macht das Sinn. In JDBC fangen die Spalteninidzes tatsächlich bei 1 an. Da habe ich auch nix angemeckert. Bei der initialen Größe des Array macht Deine Begründung überhaupt keinen Sinn…

Zur Erklärung Deines Problems: Bei einem Resultset bewegst Du mit der next-Methode einen Cursor von Datensatz zu Datensatz. Mit dem Code hier:

//inhalt der Spalten ausgeben    
while(rs.next()){
  anzDatenSätze++; 
}

hast Du den Cursor hinter alle Datensätze bewegt, ohne auch nur einen einzigen auszulesen. Ein Auslesen mittels der getXX-Methoden ist danach nicht mehr möglich (wundert mich, dass Du hier keine Exception bekommst, wahrscheinlich verschluckst Du sie?!?). Wie es richtig geht, ist hier skizziert: Retrieving and Modifying Values from Result Sets (The Java™ Tutorials > JDBC Database Access > JDBC Basics)

Wenn Du das verstanden hast, hast du zwei Möglichkeiten:
[ol]
[li]Du befolgst SlaterB’s Tipp und verwendest statt eines Arrays eine List. Da musst du nicht im Voraus wissen, wieviele Zeilen das Ergebnis hat.
[/li][li]Du bleibst beim Array. Dann musst VOR Initialisierung des Arrays bereits die Anzahl Zeilen wissen. Dafür zwei mögliche Wege:
[/li][LIST=1]
[li]Ein SELECT COUNT(id) mit genau der gleichen WHERE-Klausel wie Deine Query
[/li][li]Mittels last() im ResultSet auf den letzten Datensatz springen und mittels getRow() die Zeilennummer ausgeben lassen. Dann mittels first() zurück springen und dann erst durch das ResultSet mit next() durchgehen.
[/li][/ol]
[/LIST]
Ich finde 1. (SlaterB, Verwendung einer List) am elegantesten. Wenn Du 2. willst, dann finde ich 2.1. (vorgeschaltetes SELECT COUNT) eleganter.

  1. Meta-Daten der Tabelle auslesen und die Anzahl Zeilen abgreifen

Das mit der Liste ist aber deutlich eleganter, einfacher und… macht man das nicht eh so? Habe sowas noch nie mit einem Array versuch. Ich mache das aber mit einer doppelten Liste, also List<List<?>>, statt list + array.

Ich habs jetzt zum laufen gebracht. Der Code ist zwar nicht so schön aber es läuft.
Für alle die sich dafür interessiern:

import java.util.*;
import javax.swing.*;



public class Ausgabe {
    
    public static String[][] TupelToArray(List tupelInhalt,int length){
 
      String[][] tupel= new String[(tupelInhalt.size()/length)][length]; 
      int counter = 0; 
       for(int x=0; x<(tupelInhalt.size()/length);x++){ 
        for(int i=0;i<length;i++){
            tupel[x]** = (String) tupelInhalt.get(counter);
            counter++;
       }     
        }        
        return tupel;
        
    }
    
    public static String[] SpaltenNamenToArray(List spaltenName){
        String string[] = new String[spaltenName.size()];

        for (int i=0;i<spaltenName.size();i++){
            string**=(String)spaltenName.get(i);
        } 
        return string; 
    }
    
    public static void ausgabe(String anweisung, Connection con) throws SQLException {
        
            Statement st = con.createStatement();                    //Sql Anweisung          
            ResultSet rs = st.executeQuery(anweisung);
            
            ResultSetMetaData meta = rs.getMetaData();
             
            List spaltenName = new ArrayList();
            List tupelInhalt = new ArrayList();

            for (int i = 1; i <= meta.getColumnCount(); i++) {       //Liste mit den Namen der Spalten füllen
                spaltenName.add(meta.getColumnName(i));
            }
                while(rs.next()){                                    //Inhalt der Tupel in eine liste füllen
                   for(int i=1;i<=meta.getColumnCount();i++){        
                       tupelInhalt.add(rs.getString(i));
                   }
                }  
           System.out.println(spaltenName);
            String[] spaltenNamen = new String[meta.getColumnCount()];
            String[][] tupel = new String[tupelInhalt.size()/meta.getColumnCount()][meta.getColumnCount()];
            
            spaltenNamen = SpaltenNamenToArray(spaltenName);
            tupel = TupelToArray(tupelInhalt,meta.getColumnCount());
 
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTable table = new JTable(tupel,spaltenNamen);
            f.add(new JScrollPane(table));
            f.pack();
            f.setVisible(true);
    }        
}

bisschen kompliziert gehalten,

wie gesagt könntest du auch schon in der while(rs.next())-Schleife pro Zeile/ Eintrag ein eigenes Array erstellen,
dann müsstest du am Ende nur noch die z.B. 75 einzelnen Arrays aus der Liste herausholen

statt im Moment z.B. 75*5 = 375 einzelne Werte der Liste über komplizierte Index-Umrechnungen auf 75 Arrays zu verteilen,
aber auch kein Beinbruch wenn es geht