Tabelle zu Datenbank hinzufügen / Apache Derby

KinaFina

Mitglied
Aufgabe: Nutzerdaten (Name und Passwort) sollen aus einer Datenbank kommen.
Es gibt schon eine Datenbank mit Tabellen zum Speichern von versendeten und eingegangenen E-Mails.
Jetzt habe ich eine weitere Tabelle (nutzer) in die bestehende Datenbank eingefügt , die aber nicht erkannt wird. Ich finde den Fehler nicht.
Java:
public class MiniMailDatenbankAnlegen extends JFrame {
    // automatisch über Eclipse erzeugt
    private static final long serialVersionUID = 7908452154759854933L;

    // für das Protokoll
    private String protokoll = "jdbc:derby:";

    // für die Verbindung
    // ACHTUNG! Es gibt mehrere Connection-Klassen!
    // benötigt wird die Klasse aus dem Paket java.sql.
    private Connection verbindung;
    

    // die innere Klasse für den ActionListener
    class MeinListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // wurde auf Anlegen geklickt?
            if (e.getActionCommand().equals("anlegen"))
                // dann die Datenbank anlegen
                anlegenDB();
            // wurde auf neue Einträge geklickt?
            if (e.getActionCommand().equals("eintraege"))
                // dann die Testeinträge anlegen
                anlegenEintraege();
            // wurde auf Beenden geklickt?
            if (e.getActionCommand().equals("ende"))
                // dann beenden
                System.exit(0);
        }
    }

    public MiniMailDatenbankAnlegen(String titel) {
        super(titel);

        // ein FlowLayout
        setLayout(new FlowLayout(FlowLayout.LEFT));

        // die Schaltflächen
        JButton anlegen = new JButton("Datenbank anlegen");
        anlegen.setActionCommand("anlegen");
        JButton test = new JButton("Testeinträge erzeugen");
        test.setActionCommand("eintraege");
        JButton beenden = new JButton("Beenden");
        beenden.setActionCommand("ende");

        MeinListener listener = new MeinListener();
        anlegen.addActionListener(listener);
        test.addActionListener(listener);
        beenden.addActionListener(listener);

        add(anlegen);
        add(test);
        add(beenden);

        // Größe setzen, Standardverhalten festlegen und anzeigen
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private void oeffnenDB(String arg) {
        try {
            verbindung = DriverManager.getConnection(arg);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }

    private void schliessenDB() {
        // das Schließen löst bei Erfolg eine Exception aus!!!
        boolean erfolg = false;
        try {
            DriverManager.getConnection(protokoll + "mailDB; shutdown = true");
        } catch (SQLException e) {
            erfolg = true;
        }
        if (erfolg != true)
            JOptionPane.showMessageDialog(this, "Das DBMS konnte nicht heruntergefahren werden.");
    }

    public static void main(String[] args) {
        new MiniMailDatenbankAnlegen("Datenbank-Werkzeuge");
    
        
    }

    private void anlegenDB() {
        // die Datenbank ist mailDB, sie wird neu angelegt
        oeffnenDB(protokoll + "mailDB; create = true");
        JOptionPane.showMessageDialog(this, "Die Datenbank wurde angelegt bzw. geöffnet.");
        // ein Statement zum Erstellen der Tabelle
        // bitte auch hier auf die richtige Klasse aus dem Paket sql achten!
        try {
            Statement state = verbindung.createStatement();
            state.execute("CREATE TABLE gesendet("
                    + "iNummer int NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),"
                    + "empfaenger varchar(255) NOT NULL," + "betreff varchar(255)," + "inhalt CLOB(64 K),"
                    + "PRIMARY KEY (iNummer))");
            JOptionPane.showMessageDialog(this, "Die Tabelle gesendet wurde angelegt.");
            state.execute("CREATE TABLE empfangen("
                    + "iNummer int NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),"
                    + "sender varchar(255) NOT NULL," + "betreff varchar(255)," + "inhalt CLOB(64 K),"
                    + "PRIMARY KEY (iNummer))");
            JOptionPane.showMessageDialog(this, "Die Tabelle empfangen wurde angelegt.");
            state.execute("CREATE TABLE nutzer("
                    + "iNummer int NOT NULL GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),"
                    + "name varchar(255) NOT NULL," + "kennwort varchar(255)," + "PRIMARY KEY (iNummer))");
            JOptionPane.showMessageDialog(this, "Die Tabelle nutzer wurde angelegt.");

            // Verbindung schließen
            state.close();
            verbindung.close();
            // und die Datenbank schließen
            schliessenDB();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }
    

    private void anlegenEintraege() {
        // die Datenbank öffnen
        oeffnenDB(protokoll + "mailDB");
        try {
            // einen Eintrag in der Tabellen nutzer anlegen
            // über ein vorbereitetes Statement
            PreparedStatement prepState;
            prepState = verbindung.prepareStatement("insert into nutzer (name, kennwort) values (?,?");
            prepState.setString(1, "kina.stuff@gmail.com");
            prepState.setString(2, "***");
            // das Statement ausführen
            prepState.executeUpdate();
            verbindung.commit();

            // Änderungen von außen werden sichtbar und der Cursor kann beliebig bewegt
            // werden
            Statement state;
            state = verbindung.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            // die Ergebnismenge erzeugen
            // dazu beschaffen wir alle Einträge in der Tabelle empfangen
            ResultSet ergebnisMenge;
            ergebnisMenge = state.executeQuery("SELECT * FROM nutzer");
            // ganz nach vorne gehen
            ergebnisMenge.first();

            // zum Test die Werte in der Konsole ausgeben
            // hier wird direkt die Spalte angegeben
            System.out.println(ergebnisMenge.getInt("iNummer"));
            System.out.println(ergebnisMenge.getString("name"));
            System.out.println(ergebnisMenge.getString("kennwort"));

            // zum letzten Eintrag gehen
            ergebnisMenge.last();
            System.out.println("In der Tabelle nutzer stehen jetzt " + ergebnisMenge.getRow() + " Einträge");

            // Verbindung schließen
            prepState.close();
            state.close();
            ergebnisMenge.close(); // auskommentieren wenn noch eine weitere Tabelle folgt???

            // einen Eintrag in der Tabelle empfangen anlegen
            // über ein vorbereitetes Statement
            // PreparedStatement prepState;
            prepState = verbindung.prepareStatement("insert into empfangen (sender, betreff, inhalt) values (?,?,?)");
            prepState.setString(1, "kina.stuff@gmail.com");
            prepState.setString(2, "Testnachricht");
            prepState.setString(3, "Der Text der empfangenen Nachricht als CLOB");
            // das Statement ausführen
            prepState.executeUpdate();
            verbindung.commit();

            // Änderungen von außen werden sichtbar und der Cursor kann beliebig bewegt
            // werden
            state = verbindung.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            // die Ergebnismenge erzeugen
            // dazu beschaffen wir alle Einträge in der Tabelle empfangen
            ergebnisMenge = state.executeQuery("SELECT * FROM empfangen");
            // ganz nach vorne gehen
            ergebnisMenge.first();

            // zum Test die Werte in der Konsole ausgeben
            // hier wird direkt die Spalte angegeben
            System.out.println(ergebnisMenge.getInt("iNummer"));
            System.out.println(ergebnisMenge.getString("sender"));
            System.out.println(ergebnisMenge.getString("betreff"));
            Clob clob;
            clob = ergebnisMenge.getClob("inhalt");
            System.out.println(clob.getSubString(1, (int) clob.length()));

            // zum letzten Eintrag gehen
            ergebnisMenge.last();
            System.out.println("In der Tabelle empfangen stehen jetzt " + ergebnisMenge.getRow() + " Einträge");

            // Verbindung schließen
            prepState.close();
            state.close();
            ergebnisMenge.close();

            // und einen Eintrag für die Tabelle gesendet anlegen
            // über ein vorbereitetes Statement
            prepState = verbindung.prepareStatement("insert into gesendet (empfaenger, betreff, inhalt) values (?,?,?)");
            prepState.setString(1, "kina.fina.stuff@gmail.com");
            prepState.setString(2, "Testnachricht");
            prepState.setString(3, "Der Text der gesendeten Nachricht als CLOB");
            // das Statement ausführen
            prepState.executeUpdate();
            verbindung.commit();

            // Änderungen von außen werden sichtbar und der Cursor kann beliebig bewegt
            // werden
            state = verbindung.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            // die Ergebnismenge erzeugen
            // dazu beschaffen wir alle Einträge in der Tabelle empfangen
            ergebnisMenge = state.executeQuery("SELECT * FROM gesendet");
            // ganz nach vorne gehen
            ergebnisMenge.first();

            // zum Test die Werte in der Konsole ausgeben
            // hier wird direkt die Spalte angegeben
            System.out.println(ergebnisMenge.getInt("iNummer"));
            System.out.println(ergebnisMenge.getString("empfaenger"));
            System.out.println(ergebnisMenge.getString("betreff"));
            clob = ergebnisMenge.getClob("inhalt");
            System.out.println(clob.getSubString(1, (int) clob.length()));

            // zum letzten Eintrag gehen
            ergebnisMenge.last();
            System.out.println("In der Tabelle gesendet stehen jetzt " + ergebnisMenge.getRow() + " Einträge");

            // Verbindung schließen
            prepState.close();
            state.close();
            // ergebnisMenge.close(); //habe ich hinzugefügt

            // letzte Anweisung im try-Zweig
            verbindung.close();
            // und die Datenbank schließen
            schliessenDB();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }
    
    
}
 

Oneixee5

Top Contributor
Hier fehlte eine Klammer:
Java:
            prepState = this.verbindung.prepareStatement("insert into nutzer (name, kennwort) values (?,?)");
 

Oneixee5

Top Contributor
Ich weiß nicht auf welchem Level ihr bereits in eurem Kurs seit. Ich muss aber sagen, die Aufgabe ist sehr schlecht umgesetzt und enthält einige Probleme/Fehler. Ich weiß aber nicht ob Interesse besteht über die gewünschte Fehlersuche hinaus, noch weiter Probleme zu besprechen.
 

Oneixee5

Top Contributor
Zunächst das Öffnen der DB:
Java:
    private void oeffnenDB(final String arg) {
        try {
            this.verbindung = DriverManager.getConnection(arg);
        } catch (final Exception e) {
            JOptionPane.showMessageDialog(this, "Problem: \n" + e.toString());
        }
    }

    private void anlegenDB() {
        // die Datenbank ist mailDB, sie wird neu angelegt
        oeffnenDB(this.protokoll + "mailDB; create = true");
        ...
Nehmen wir mal an, das Öffnen der DB geht schief. Du fängst die Exception ab und gibst eine Meldung aus. Das wäre in Ordnung wenn du dann nicht einfach mit der weiterhin geschlossenen DB weiterarbeiten würdest als wäre nichts passiert. Das endet dann in weiteren Fehlern. Es ist also völlig nutzlos den Fehler auszugeben. Der Nutzer kann gar nicht reagieren. Er bekommt einfach weitere Fehler angezeigt.

So wie du vorgehst wäre es am besten die Klassenvariable zu entfernen:
Code:
    // für die Verbindung
    // ACHTUNG! Es gibt mehrere Connection-Klassen!
    // benötigt wird die Klasse aus dem Paket java.sql.
    private Connection verbindung;
Die Connection kannst du problemlos als lokale Variable in der Methode benutzen. Das wäre auch für das weiter Vorgehen und die Fehlerbehandlung sinnvoller.

Wenn du das verstanden und geändert hast, können wir mit dem nächsten Problem weitermachen.
 

LaraCroft96

Mitglied
@KinaFina Huhu, ich stehe aktuell vor der gleichen Aufgabe! :) Also du hast quasi die mitgegebene Klasse zum anlegen der DB verwendet. Ich habe sie im CMD selbst angelegt und bin jetzt am Tüfteln, wie ich das mache. Hast du hier dann eine separate Klasse für die Anmeldung angelegt oder in einer vorhandenen Klasse eine neue Methode geschrieben ? Wäre dir sehr dankbar für Hilfe. Liebe Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ralfb1105 JavaFX TreeView dynamisch aus Datenbank Tabelle erstellen AWT, Swing, JavaFX & SWT 22
T Warnkorb + Tabelle + Datenbank AWT, Swing, JavaFX & SWT 3
W Kleine Sub-Tabelle in SpreadsheetView-Zelle anzeigen AWT, Swing, JavaFX & SWT 9
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
H Tabelle in JFrame einfügen AWT, Swing, JavaFX & SWT 1
T Zelle- und die Zeile-Farbenwechsel bei der Selektion in der Tabelle AWT, Swing, JavaFX & SWT 4
T Anbinden der Tabelle an die Daten AWT, Swing, JavaFX & SWT 5
F JavaFX Tabelle mit Daten füllen AWT, Swing, JavaFX & SWT 9
kodela Swing Letzte Änderung in der Tabelle wird nicht gespeichert AWT, Swing, JavaFX & SWT 5
W JavaFX Tabelle zeilenweise mit Werten füllen und an Container anpassen AWT, Swing, JavaFX & SWT 23
F JavaFX Tabelle mit gespeicherten Eingabe Werten AWT, Swing, JavaFX & SWT 8
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Swing Tabelle wird bei Betätigung des Button nicht befüllt AWT, Swing, JavaFX & SWT 17
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
D Filter in Tabelle Sql AWT, Swing, JavaFX & SWT 6
M JavaFX Tabelle flexibler Länge AWT, Swing, JavaFX & SWT 3
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
JavaMachtMichFertig JavaFX Gui - Löschbutton in Tabelle anzeigen, die mittels MySQL Abfrage gefüllt wird AWT, Swing, JavaFX & SWT 5
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
J JavaFX Tabelle soll ganze Seite ausfüllen AWT, Swing, JavaFX & SWT 2
M ausgewählte Inhalt von ListItem inn ComboBox in der Tabelle speichern AWT, Swing, JavaFX & SWT 0
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M Filter in die JFace/SWT Tabelle einbauen AWT, Swing, JavaFX & SWT 5
T SWT Mysql Tabelle zeigt immer nur den ersten Wert immer wieder an AWT, Swing, JavaFX & SWT 3
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
P Swing Klick in Tabelle nicht möglich AWT, Swing, JavaFX & SWT 0
Thallius Swing Tabelle nach Datumsspalte sortieren AWT, Swing, JavaFX & SWT 4
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
E Tabelle zeigt nicht neuste Datenbankeinträge an AWT, Swing, JavaFX & SWT 5
F SWT Problem mit Tabelle und Combobox in einem Wizard AWT, Swing, JavaFX & SWT 5
D Swing JTable- Meine Tabelle der Klasse JTable wird nur bedingt angezeigt AWT, Swing, JavaFX & SWT 4
O Tabelle "animiert" Scrollen AWT, Swing, JavaFX & SWT 1
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
G JavaFX ComboBoxTableCell für Zuordnung in Tabelle AWT, Swing, JavaFX & SWT 2
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
L Tabelle reagiert ungewollt auf Mausklick AWT, Swing, JavaFX & SWT 6
C Verschiebbare "Buttons" in einer Tabelle AWT, Swing, JavaFX & SWT 3
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
P Listener Auswahl Tabelle AWT, Swing, JavaFX & SWT 6
B LayoutManager Tabelle repainten AWT, Swing, JavaFX & SWT 4
K Swing JTable Text im Hintergrund einer leeren Tabelle AWT, Swing, JavaFX & SWT 3
H JScrollPane - JEditorPane und HTML-Tabelle AWT, Swing, JavaFX & SWT 2
F Elementbezeichnung in der Tabelle AWT, Swing, JavaFX & SWT 7
F Tabelle sortieren AWT, Swing, JavaFX & SWT 3
F SWT Tabelle Zeile auslesen AWT, Swing, JavaFX & SWT 3
T Spaltennamen jeweils der angezeigten Tabelle anpassen AWT, Swing, JavaFX & SWT 19
S JTable Filter nach Wort oder Wortteil über ganze Tabelle AWT, Swing, JavaFX & SWT 5
L Fehler beim erstellen einer Tabelle mithilfe von 2d-Array AWT, Swing, JavaFX & SWT 3
T Swing JScrollPane- und Tabelle-Header Problem AWT, Swing, JavaFX & SWT 25
B Tabelle anpassen AWT, Swing, JavaFX & SWT 6
N jComboBox mit eigenem Renderer und eigenem Datentyp als Rückgabe in einer Tabelle AWT, Swing, JavaFX & SWT 2
N Button akivieren, wenn Tabelle verändert worden ist AWT, Swing, JavaFX & SWT 2
C SWT refresh einer Tabelle AWT, Swing, JavaFX & SWT 4
X Tabelle während Funktionsaufruf aktualisieren AWT, Swing, JavaFX & SWT 11
C SWT Tabelle mit Werten befüllen AWT, Swing, JavaFX & SWT 5
Y LayoutManager Keine vollständige Darstellung der Tabelle mit GridBagLayout AWT, Swing, JavaFX & SWT 3
S Tabelle sortieren, mit Ausnahme der letzten Zeile AWT, Swing, JavaFX & SWT 9
H SWT RAP Anwendung - Tabelle - Theming AWT, Swing, JavaFX & SWT 3
_dp Swing ScrollPane unterschlägt Großteil der Tabelle AWT, Swing, JavaFX & SWT 7
_dp Swing Tabelle: Ausklappbare Einträge AWT, Swing, JavaFX & SWT 2
C Swing Inhalt einer JTable aktualisieren und filten nach Feldern die nicht in der Tabelle sind AWT, Swing, JavaFX & SWT 3
S Tabelle im selben Formular anzeigen AWT, Swing, JavaFX & SWT 6
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
A SWT Tabelle (elegant) sortieren AWT, Swing, JavaFX & SWT 2
D Scrollbar für Tabelle AWT, Swing, JavaFX & SWT 2
A Button in Tabelle ansprechen AWT, Swing, JavaFX & SWT 6
O Tabelle laden - Prozessorlast 100% ?? AWT, Swing, JavaFX & SWT 11
F Tabelle und Bildindex (Thumbnails) AWT, Swing, JavaFX & SWT 4
A SWT Tabelle Sortieren AWT, Swing, JavaFX & SWT 3
H Swing Tabelle nach Klick auf Button mit Daten füllen? AWT, Swing, JavaFX & SWT 2
Airwolf89 Swing Exception beim Füllen einer Tabelle AWT, Swing, JavaFX & SWT 10
D Swing Tabelle sortieren AWT, Swing, JavaFX & SWT 4
B tabelle mit labeln AWT, Swing, JavaFX & SWT 2
M sortierbare Tabelle mit jface und databinding AWT, Swing, JavaFX & SWT 3
H ArrayList?! in Tabelle AWT, Swing, JavaFX & SWT 3
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
D SWT String aus Textfeld auslesen und in eine Tabelle speichern AWT, Swing, JavaFX & SWT 5
Ollek JTable - Tabelle füllen mit einer ArrayList AWT, Swing, JavaFX & SWT 22
E Daten aus sortierter Tabelle lesen AWT, Swing, JavaFX & SWT 2
T Swing Java Darstellung einer Tabelle AWT, Swing, JavaFX & SWT 3
FoolMoon Swing JCheckBox neben Text in einer Tabelle AWT, Swing, JavaFX & SWT 2
K Strings aus jTextArea in Liste oder Tabelle übertragen- wie? AWT, Swing, JavaFX & SWT 4
H Swing Saubere Erstellung einer Tabelle AWT, Swing, JavaFX & SWT 3
O Tabelle über Event sortieren AWT, Swing, JavaFX & SWT 4
T Invalid Range - Fehler bei TableRowSorter / Tabelle AWT, Swing, JavaFX & SWT 17
S Zeile an eine Tabelle anfügen AWT, Swing, JavaFX & SWT 5
S Datum in Tabelle darstellen? AWT, Swing, JavaFX & SWT 4
R JTable: Tabelle neu darstellen AWT, Swing, JavaFX & SWT 6
M JSplitPane Tabelle neu zeichnen AWT, Swing, JavaFX & SWT 3
G Tabelle eine JList anziegen AWT, Swing, JavaFX & SWT 4
G Tabelle Spalten unsichtbar machen AWT, Swing, JavaFX & SWT 5
P Für den Inhalt einer Zelle (aus Tabelle) STRG-C anwenden AWT, Swing, JavaFX & SWT 2
D Zahlen mit nullen in einer Tabelle anzeigen AWT, Swing, JavaFX & SWT 2
W Probleme beim Erstellen einer Tabelle AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben