executeUpdate() funktioniert auf einmal nicht

Status
Nicht offen für weitere Antworten.

Ellie

Aktives Mitglied
Hallo!

Ich schlage mich schon den zweiten Tag mit einem Fehler herum, dessen Grund mir einfach nicht klar wird.

Meine Applikation ist an die HSQLDB angebunden, den Code dazu habe ich größtenteils aus „Java ist auch eine Insel“. Nach ein paar Umschichtungen im Programm bekomme ich nun eine Menge von Exceptions bei jedem Versuch, statement.executeUpdate(string) auszuführen. Die Verbindung scheint in Ordnung zu sein, es wird der richtige String erzeugt und der Zugriff aus das Statement-Objekt ist gesichert.

Ich verstehe also nicht, was man tun könnte. Googlen der Fehlerausgaben bringt nur unbeantwortete Fragen zum Vorschein. Ich hoffe nun, dass jemand, der das Problem eventuell wiedererkennt, mir einen Tipp geben kann, wo sich mein Fehler versteckt oder wonach ich noch einmal googeln sollte.

Code der Datenbankanbindung:

Code:
//--------------------------- im Konstruktor ----------------------------------
try 
        {
            Class.forName( "org.hsqldb.jdbcDriver" );
        } 
        catch ( ClassNotFoundException e ) 
        {
            System.err.println( "Keine Treiber-Klasse!" );
            return;
        }
        
        
        
        
        con = null;
        try 
        {
        	con = DriverManager.getConnection("jdbc:hsqldb:file:IrasDB;shutdown=true", "sa", "");
            //System.err.println("Verbindung hergestellt.");
            stmt = con.createStatement();
            
        } 
        catch (SQLException es) 
        	{
                System.err.println("Fehler bei Verbindung mit Datenbank.");
                es.printStackTrace();
            } 
        finally 
            {
                if (con != null) 
                {
                    try { con.close(); } catch ( SQLException esl ) { esl.printStackTrace(); }
                }
            }

//----------------actionPerformed ( Knopfdruck ) ------------------------------ 

  public void actionPerformed(ActionEvent e) {
        if (e.getSource() == knopf || e.getSource() == knopf2) {
        	try {
        	
            	System.err.println(stmt.toString());
                System.err.println("Statement erzeugt.");
                String updateString;
                if (leknr.isSelected()) // Text des Updates
                {
                   updateString = new String("INSERT INTO KANTHAROS VALUES ('" + vokabel.getText() + "', '" + uebersetzung.getText() + "', " + lektion.getText() + ")");
                } else {
                    updateString = new String("INSERT INTO VokabelTabelle (Vokabel, Uebersetzung) VALUES ('" + vokabel.getText() + "', '" + uebersetzung.getText() + "')");
                }
                System.err.println("String erzeugt." + updateString);
                stmt.executeUpdate(updateString);
                System.err.println("Update durchgefuehrt.");

(Ein Screenshot mit der Fehleranzeige)
 
ist das so schwer zu erkennen?
8 Zeilen nach der Erzeugung des Statements schließt du die Verbindung wieder (con.close())

was glaubst du was das zu bedeuten hat?
hast du denn dir nicht ein einziges Tutorial angeschaut
oder dort nicht gelesen was die einzelnen Befehle machen?

die Fehlermeldung sagt es dir dann auch direkt:
'der Fehler ist, dass die Connection schon geschlossen ist'

kann man mehr an Tipps geben in dieser Situation?
Fehlermeldungen sind ja oft kryptisch, aber diese passt perfekt,

--------

so, du darfst also die Connection nicht closen
bzw. es wäre wahrscheinlich besser, wenn du die Connection und das Statement erst dann erzeugst, wenn sie gebraucht wird,
z.B. in der actionPerformed-Operation
 
Oh. Vielen Dank für die Antwort, die Rüge nehme ich an. 🙂 Hätte mir nicht gedacht, dass ich so etwas unter meiner Nase übersehen habe.


(Was nun genau der Denkfehler war: Ich hatte die Anweisung finally immer zum Wirkungsbereich von catch gezählt und weiter nicht beachtet, da ja try nachweislich erfolgreich verlief.)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben