# Aufzählung liest nur ersten Datensatz



## Einklang. (17. Dez 2012)

Hallo,

habe folgenden Code:


```
// 10 Datensätze auslesen und den Spalten zuordnen
		ButtonDBTablezweite inst3 = ButtonDBTablezweite.getInstance();
		inst3.createConnection(); // Herstellung der Verbindung
		Statement lokaldb3 = inst3.lokalconnection.createStatement();
		// Neue SQL Abfrage mit dem String-Wert
		ResultSet res3 = lokaldb3.executeQuery("Select * from "+objektstring);
		ResultSetMetaData res3meta = res3.getMetaData();
		
		int spaltdatenzahl = res3meta.getColumnCount();
		String spaltdatenaufz = "";
		String spaltdatenna = "";
		int datensatz = 0;
		
		for (int i=0; i<10; i++) {
			if (res3.next()) {
				datensatz = res3.getRow();
				String kontrollsatz = res3.getString(1);
				System.out.println("Inhalt erste Spalte von dem Datensatz " + kontrollsatz);
				
			
					// datensatz auslesen 
					for (int h = 1; h<=spaltdatenzahl; h++) {
						spaltdatenna = res3.getString(h);
				
					// noch sicherheitsabfrage damit spaltaufz ohne komma am anfang ist
						if(spaltdatenaufz.length() == 0) {
							spaltdatenaufz = spaltdatenaufz + spaltdatenna;
						}
						else {
							spaltdatenaufz = spaltdatenaufz + ", " + spaltdatenna; // hier sind die Spaltenname im String spaltaufz gespeichert
							// System.out.println("Spaltdatenaufz Inhalt: " + spaltdatenaufz);
						}
					
					};
				
			}			
				//Datensatz ausgeben
				defaultTableModel4.addRow(new Object[] { 
		  			spaltdatenaufz 
   				   
				});		
		};
		
	   
	} catch (SQLException ex) {
	   System.out.println("SQL-Exception ist aufgetreten: " + ex.getMessage());
	}
```

Nun ist es so dass in der Console die Nummern aus der ersten Spalte ausgegeben werden und die Datensätze also wirklich durchgegangen werden.
Auch das Auslesen der Spalte funktioniert an sich sehr gut.

Das Problem ist, dass im Ergebnis nur immer der erste Datensatz angezeigt wird und ich beides irgendwie nicht zusammenbekomme...! 
Also obwohl die Datensätze durchgegangen werden, wird immer nur der erste Datensatz ausgelesen...!

Danke wenn jemand nen Tipp hat ;-)


----------



## Camill (17. Dez 2012)

Hmm... muss [c]spaltdatenaufz[/c] nicht nach jedem Durchlauf innerhalb der for-Schleife "geleert" werden?
Anmerkung: Hinter eine for-Schleife gehört kein Semikolon.


----------



## Bizarrus (17. Dez 2012)

Camill hat gesagt.:


> Hmm... muss [c]spaltdatenaufz[/c] nicht nach jedem Durchlauf innerhalb der for-Schleife "geleert" werden?



Nicht zwingend, da hier ja ein Wert zugewiesen wird, oder nicht?


----------



## Bleiglanz (17. Dez 2012)

> Das Problem ist, dass im Ergebnis nur immer der erste Datensatz angezeigt wird und ich beides irgendwie nicht zusammenbekomme...!


Was genau meinst du mit "im Ergebnis"? Dass in deiner JTable nicht alles angezeigt wird? Wie genau sieht denn dein Code für das DefaultTableModel aus?


----------



## Camill (17. Dez 2012)

Bizarrus hat gesagt.:


> Nicht zwingend, da hier ja ein Wert zugewiesen wird, oder nicht?



Naja im ersten Druchlauf wird es folgendermaßen aussehen:
[c]1, foo, bar[/c]

Im nächsten Durchlauf dann schon so:
[c]1, foo, bar, 2, foo2, bar2[/c]

Ich nehme an das es hierdurch dann bei [c]defaultTableModel4.addRow[/c] zu Problemen kommt, da nicht nur eine einzelner Datensatz übergeben wird. Das Hinzuügen einer neuen Zeile erscheint mit jedoch auch ein wenig komisch.


----------



## Einklang. (17. Dez 2012)

Bizarrus hat gesagt.:


> Nicht zwingend, da hier ja ein Wert zugewiesen wird, oder nicht?



Nein das geht weil dann die ganzen Inhalte auf einmal in der Tabelle gefüllt werden.



> Das Problem ist, dass im Ergebnis nur immer der erste Datensatz angezeigt wird und ich beides irgendwie nicht zusammenbekomme...!



Im Ergebnis meine ich, dass in der JTable bzw JScrollbar nicht die 10 verschiedenen Datensätze angezeigt werden wie sie tatsächlich bei datensatz durchgegangen werden, sondern immer nur der erste Datensatz in der Tabelle!

Es wird sowas angezeigt:
inhalt, zwei, drei
inhalt, zwei, drei, vier, fünf, sechs
(also immer vom gleichen Datensatz)

Was angezeigt werden soll ist:
datesantz inhalt, datesantz inhalt1, datesantz inhalt2
zweiter Datensatz, Inhalt2, Inhalt3,
dritter Datensatz, inhalt, inhalt
usw usf also immer ein neuer kompletter Datensatz

Warum das nun nicht so ist find ich nicht, denn eigentlich macht der jeweilig Code was er soll..!
Nur wenn ich dann die einzelnen Spalten auslese (for-schleife), ist er nicht in dem aktuellen Datensatz, der in der Variablen datensatz angezeigt wird....! 

danke


----------



## TKausL (18. Dez 2012)

Camill hat gesagt.:


> Hmm... muss [c]spaltdatenaufz[/c] nicht nach jedem Durchlauf innerhalb der for-Schleife "geleert" werden?



This!


----------



## Einklang. (20. Dez 2012)

TKausL hat gesagt.:


> This!



Ist das ein Hinweis? Wenn ja versteh ich ihn nicht ganz....


----------



## Michael... (20. Dez 2012)

> Warum das nun nicht so ist find ich nicht, denn eigentlich macht der jeweilig Code was er soll..!


Wenn das so ist, dann passt doch alles ;-)

Die feste for Schleife von 0 bis 10 halte ich für ziemlich kritisch! Warum? Kannst Du immer davon ausgehen, dass von der DB mindestens 10 Ergebnisse geliefert werden? Interessiert Dich ein elfter Datensatz nicht?

Dein Fehler liegt daran - und es wurde ja bereits als erste Antwort und weiter mehrfach erwähnt, dass Du 
	
	
	
	





```
spaltdatenaufz
```
 bei neuen Daten nicht "zurücksetzt" und einfach nur die Daten immer weiter hinten dran hängst.
Grundsätzlich sollte der Geltungsbereich von Variablen möglichst klein gehalten werden. Wenn Du Dich daran orientierst, dann würden solche Fehler sofort auffallen bzw. in diesem Fall gar nicht passieren.


----------



## Landei (20. Dez 2012)

Einklang. hat gesagt.:


> Ist das ein Hinweis? Wenn ja versteh ich ihn nicht ganz....



Was ist den unklar, "spaltdatenaufz", "Durchlauf", "for-Schleife" oder "geleert"?


"spaltdatenaufz" ist eine von dir definierte Variable, an die du immer neue Daten hängst. Auch wenn vom letzten "Durchlauf" noch alte drin sind.
"Durchlauf" ist ein einzelner Schritt bei der Abarbeitung einer Schleife
"for-Schleife" ist ein bestimmte Schleifen-Art, die erlaubt, Schleifenvariablen zu initialisieren und in jedem Schritt zu testen und zu ändern
"geleert" bezieht sich im Zusammenhang mit Monoiden gewöhnlich darauf, zum neutralen Element als "leerem" Zustand zurückzukehren. Neutrale Elemente bei Strings sind Leerstrings, bei Listen die leere Liste, bei der Addition null und bei der Multiplikation eins.


----------



## Einklang. (20. Dez 2012)

Hm ich schein das Problem wirklcih nicht deutlich gesagt zu haben:

Es sollen die ersten 10 Datensätze angezeigt werden. Dafür lese ich sie aus, was auch funktioniert. Dann gehe ich Spalte für Spalte durch und füge die Inhalte zusammen, was auch funktioniert.

Das Problem ist aber, dass die Spalten IMMER WIEDER vom ersten Datensatz abgefragt werden, obwohl der Datensatz hochgezählt (also Datnesatz 1, 2, 3 dann 4 usw durchgegangen wird) wird. 

Anders gefragt: Warum werden immer die Spalten vom ersten Datensatz immer wieder ausgelesen, obwohl sich der Datensatz verändert?

Beide Teile - einmal die Datensätze durchgehen und andererseits die Spalteninhalte auslesen und zusammenfügen - funktionieren für sich! Das Problem ist, dass nicht die Spalten der aktuellen Datensatzes durchgegangen werden, sondern 10mal der erste Datensatz!

Das Ergebnis sollte sein, dass in der JTable dann die ersten 10 Datensätze gezeigt werden - es wird aber nur der erste Datensatz 10 mal angezeigt!

so ich hoffe das Problem ist nun verständlich ;-)

danke


----------



## Landei (20. Dez 2012)

Wenn möglich würde ich das mit den maximal 10 Datensätzen die DB machen lassen (falls nämlich weniger drin ist). Bei mySQL geht das mit LIMIT, bei MS-SQL gibt es TOP, andere DBs werden Ähnliches haben.


----------



## Camill (20. Dez 2012)

So dann versuche ich es nochmals mit einem KSKB:

```
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class DBTableTest {

    private JFrame frame;
    private JPanel content;
    private JTable table;
    private DefaultTableModel model;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                DBTableTest test = new DBTableTest();
                test.pack();
                test.setLocationRelativeTo(null);
                test.setVisible(true);
            }
        });
    }

    private DBTableTest() {
        this.frame = new JFrame("DBTableTest");
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.content = new JPanel(new BorderLayout());
        this.frame.getContentPane().add(this.content);

        Object[] columnNames = { "Col A", "Col B" };
        this.model = new DefaultTableModel(columnNames, 0);
        this.table = new JTable(this.model);
        this.content.add(new JScrollPane(this.table), BorderLayout.CENTER);

        this.read();
    }

    public void setLocationRelativeTo(Component arg0) {
        this.frame.setLocationRelativeTo(arg0);
    }

    public void setVisible(boolean b) {
        this.frame.setVisible(b);
    }

    public void pack() {
        this.frame.pack();
    }

    private void read() {
        int spaltdatenzahl = this.model.getColumnCount();
        String spaltdatenaufz = "";
        String spaltdatenna = "";

        String[][] result = { { "Row 1 / Col A", "Row 1 / Col B" },
                { "Row 2 / Col A", "Row 2 / Col B" },
                { "Row 3 / Col A", "Row 3 / Col B" } };

        for (int i = 0; i < result.length; i++) {
            String kontrollsatz = result[i][0];
            System.out.println("\nInhalt Spalte 1 von Datensatz " + i + ": " + kontrollsatz);

            for (int h = 0; h < spaltdatenzahl; h++) {
                spaltdatenna = result[i][h];

                if (spaltdatenaufz.length() == 0) {
                    spaltdatenaufz = spaltdatenaufz + spaltdatenna;
                } else {
                    spaltdatenaufz += ", " + spaltdatenna;
                }
                System.out.println("Inhalt von 'spaltdatenaufz': " + spaltdatenaufz);
            }

            this.model.addRow(new Object[] { spaltdatenaufz });
        }
    }
}
```

Die Methode 'read' folgt nun dem gleichen Ablauf wie dein Code.
Lass dieses Programm mal bei dir Durchlaufen und schau dir die Ausgaben auf der Konsole an, wichtig ist hierbei die Veränderung des Inhaltes der Variable [c]spaltdatenaufz[/c]:


Spoiler: Konsolen Output



Inhalt Spalte 1 von Datensatz 0: Row 1 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A, Row 1 / Col B

Inhalt Spalte 1 von Datensatz 1: Row 2 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A, Row 1 / Col B, Row 2 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A, Row 1 / Col B, Row 2 / Col A, Row 2 / Col B

Inhalt Spalte 1 von Datensatz 2: Row 3 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A, Row 1 / Col B, Row 2 / Col A, Row 2 / Col B, Row 3 / Col A
Inhalt von 'spaltdatenaufz': Row 1 / Col A, Row 1 / Col B, Row 2 / Col A, Row 2 / Col B, Row 3 / Col A, Row 3 / Col B



Wie du siehst wird ein neuer Datensatz einfach nur hinten "dran gehängt", somit wird an die [c]addRow[/c] Methode (dazu kommen wir gleich auch noch) des Models nicht nur ein Datensatz übergeben.
[c]spaltdatenaufz[/c] sollte deßhalb wie bereits in Post2 erwähnt "geleert" werden oder sogar erst deklariert werden wenn dies nötig ist:


Spoiler: read Methode





```
private void read() {
        // ...

        for (int i = 0; i < result.length; i++) {
            String kontrollsatz = result[i][0];
            System.out.println("\nInhalt Spalte 1 von Datensatz " + i + ": " + kontrollsatz);
            String spaltdatenaufz = "";

            // ...
        }
    }
```




Nun zu der besagten [c]addRow[/c] Methode, sofern du diese nicht Überschrieben hast wirst du mit [c]addRow(new Object[] { spaltdatenaufz })[/c] nicht zum gewünschten Ergebnis gelangen.
Das Hinzufügen eines neuen Datensatz könnte folgendermaßen aussehen: [c]addRow(spaltdatenaufz.split(", "))[/c]

Ich hoffe das dir dieses jetzt weiterhilft.


----------



## Einklang. (20. Dez 2012)

Danke, ich probier mal aus! ;-)


----------



## Einklang. (20. Dez 2012)

Super es scheint jetzt alles zu funktionieren! Habe nur bei dem defaultTableModel4.setRowCount(0); eingetragen und spaltdatenaufz geleert am Ende...! ;-)

So wie es funktioniert ist es auf jeden Fall schon hilfreich, mehr braucht es nicht, auch wenn man da noch einiges tun könnte! ;-)
Aber es soll mir nur die ersten Datensätze anzeigen, damit ich weiß, was in etwa drin ist an Daten - die Metaangaben werden schon in ner anderen JTable angezeigt ;-)!

So jetzt kann es endlich an die richtige Programmierung gehen - die MEtainfos hab ich jetzt in ner ANzeige drin ;-)


----------

