# Nur der letzte Datensatz wird in Tabelle geschrieben



## Exorcist (29. Mrz 2014)

Hallo zusammen,

Ich verzweifel hier an einer Aufgabe. Ich versuche eine Verbindung zu einer Datenbank aufzubauen, die Datensätze per SQL Statement auszulesen und in eine Tabelle zu schreiben.

Angezeigt wird in der Datenbank immer nur der letzte Datensatz und ich habe keine Ahnung, wie ich alle in der Tabelle anzeigen lassen kann. Ziel ist es, per Checkbox nur jene (Kunden, Lieferanten) Daten anzeigen zu lassen, die auch wirklich angekreuzt sind. Diese Daten sollen dann in der Netbeans Tabelle angezeigt werden. Dieses Beispiel soll jedoch erstmal die Daten in eine x-beliebige Tabelle schreiben.

[Java]

public class WriteSQLinTable {


    public static void main(String[] args) {

        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        Object[][] data;

         JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


        try {
            con = DriverManager.getConnection("jdbc:derby://localhost:1527/KundenDB", "user",        "test");
            stmt = con.createStatement();
            rs = stmt.executeQuery("Select * From Kunde");

            while (rs.next()) {


                String name = rs.getString("Name");
                String vorname = rs.getString("Vorname");
                System.out.println(name); 

                data =  new Object[][] {{vorname, name}}; 
                String[] titles = {"Name", "Vorname"} ;  
                f.add(new JScrollPane(new JTable(data, titles)));

            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }


        f.pack();
        f.setVisible(true);


        };

   }

[/Java]        


 Danke für eure Hilfe!


----------



## Fab1 (29. Mrz 2014)

du erzeugt für jeden Datensatz ein neues Objekt von JScrollPane und JTable und fügst das dem JFrame hinzu.

Grundsätzlich werden Daten in einer Strutkur gesammelt und dann der Tabelle übergeben und nicht für jede Zeile eine neue Tabelle erstellt 
Des Weiteren hat JFrame als Standard das BorderLayout. In deinem Fall klatscht du in die Mitte jedes mal eine neue Tabelle rein, die alte wird überschrieben.

Du solltest versuchen erstmal alle Daten von der RowSet in einer Struktur zu speichern, diese wird dann gebündet an EINE JTable übergeben. Dann hast du auch keine Probleme mehr mit dem Layout von JFrame.

siehe auch: How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Exorcist (30. Mrz 2014)

Fab1 hat gesagt.:


> du erzeugt für jeden Datensatz ein neues Objekt von JScrollPane und JTable und fügst das dem JFrame hinzu.
> 
> Grundsätzlich werden Daten in einer Strutkur gesammelt und dann der Tabelle übergeben und nicht für jede Zeile eine neue Tabelle erstellt
> Des Weiteren hat JFrame als Standard das BorderLayout. In deinem Fall klatscht du in die Mitte jedes mal eine neue Tabelle rein, die alte wird überschrieben.
> ...



Damit ich einen Datenbankeintrag, den ich per EntityManager hinzufüge, in einer Tabelle sehen kann, muss ich also den Eintrag aus der Datenbank wieder rauslesen, als String zusammenfügen und dann der Tabelle hinzufügen?

Gibt es nicht eine Möglichkeit, den Inhalt der Datenbank mit der Tabelle zu aktualisieren, damit ich immer den aktuellen Zustand der Datenbank sehe?


----------



## Exorcist (30. Mrz 2014)

Der Versuch, die Zeile der Tabelle hinzuzufügen ergibt mir folgender Fehler :

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: org.jdesktop.swingbinding.JTableBinding$BindingTableModel cannot be cast to javax.swing.table.DefaultTableModel

Der Code sieht so aus :

[Java]

 private void kundeCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {                                               
        if (kundeCheckBox.isSelected()) {
            System.out.println("Checkbox active");

            try {
                Connection con = DriverManager.getConnection("jdbc:derby://localhost:1527/BeispieldDB", "xxx", "pwd");
                Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
                ResultSet rs = stmt.executeQuery("SELECT * FROM KUNDE");

               Vector v = new Vector();

                    buffer.append("Vorname");

                    rs.last();
                    v.add(rs.getString("Name"));

                System.out.println(v.toString());
                ((DefaultTableModel) kundeLieferantTable.getModel()).addRow(v);

            } catch (SQLException ex) {
                ex.printStackTrace();
            }

        }

[/Java]


Weiss jemand warum ich eine ClassCastException erhalte? Ist dies der richtige Weg, die Tabelle um den letzten Eintrag aktualisieren zu können?

Danke,


----------



## Exorcist (31. Mrz 2014)

Habe ein eigenes TableModel erstellt, nun klappt es.


----------

