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.
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:
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.
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…
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++;
}
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.
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);
}
}
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