Derby/JavaDB ItemListener

ToxicAvenger

Mitglied
Hallo zusammen!
Zur Erklärung: Ich habe eine Derby Datenbank mit der Tabelle "Languages" und der Tabelle "Sections". Jede Section hat einen Fremdschlüssel mit Verweis auf die Languages-Tabelle.
Beim Start des Programms sollen zunächst alle Sprachen in eine ComboBox und die jeweils dazu gehörigen Sections in eine andere Combobox geladen werden.
Dazu habe ich für jede ComboBox eine initiate() Methode und einen ItemListener auf die Language ComboBox implementiert.


itemListener.PNG
Das Problem ist nun das immer nur die erste Zeile der Languages Tabelle eingelesen wird, nach dem der ItemListener die intitiate Methode aufruft wird die while schleife unterbrochen und kommt nicht mehr zurück.
Hat jemand eine Idee wie man das anders lösen kann?
 

mrBrown

Super-Moderator
Mitarbeiter
wird sie unterbrochen (im Sinne von return/break/Exception) oder kommt sie nicht mehr zurück und macht nicht mehr weiter?

Generell ist es sehr ratsam, Datenbank und GUI zu trennen (zB nach MVC) und die Datenbankzugriffe anders zu gestalten (static ist bei sowas ganz böse und wird nur Probleme verursachen)
 

ToxicAvenger

Mitglied
Danke für den Tip mit dem MVC, das werde ich mir mal genauer ansehen.

Nein es wird keine Exception geworfen und es gibt auch kein break oder return.

Weshalb ist hier static ein Problem? Es gibt ja nur eine Datenbankverbindung und es sollten nicht mehrere ResultSets, wenn ich es richtig verstanden habe, zur selben zeit geöffnet sein?
 

mrBrown

Super-Moderator
Mitarbeiter
Nein es wird keine Exception geworfen und es gibt auch kein break oder return.
Kehrt er denn aus der Schleife zurück?


Weshalb ist hier static ein Problem? Es gibt ja nur eine Datenbankverbindung und es sollten nicht mehrere ResultSets, wenn ich es richtig verstanden habe, zur selben zeit geöffnet sein?
Weil du niemals weißt, wer gleichzeitig noch auf diese Verbindung zugreift.

Grob geraten: Das hinzufügen des ersten Items löst einen ItemEvent aus, das löst die andere initiate() aus, die lädt Daten aus der Datenbank und schon stimmt das ResultSet nicht mehr. Würde ich in dem Fall auch als Fehlerquelle vermuten.
 

ToxicAvenger

Mitglied
Kehrt er denn aus der Schleife zurück?
Nein denn es wird ja immer nur der erste Datensatz durchlaufen.
Grob geraten: Das hinzufügen des ersten Items löst einen ItemEvent aus, das löst die andere initiate() aus, die lädt Daten aus der Datenbank und schon stimmt das ResultSet nicht mehr. Würde ich in dem Fall auch als Fehlerquelle vermuten.
Ja genau, mit dem ersten Datensatz wird auch das erste Item in die erste ComboBox gesetzt und somit das ItemEvent ausgelöst. Damit wird dann die überschriebene Initiate() aufgerufen, welche die zweite Combobox mit Daten aus der Datenbank füllt. Nach dem die Initiate() aus dem ItemEvent aufgerufen und durchgelaufen ist, kehrt er aber nicht mehr zurück in die while Schleife der ersten Initiate() Methode. Deshalb wird auch nur der erste Datensatz in die erste ComboBox gelesen.

Ich habe jetzt mal für jede Klasse eine eigene ResultSet Variable angelegt. Jetzt bekomme ich eine SQL-Exception:

SCHWERWIEGEND: null
java.sql.SQLException: ResultSet nicht geöffnet. Vorgang 'next' nicht zulässig. Stellen Sie sicher, dass Autocommit deaktiviert ist.

Aber auch nachdem ich die Connection auf SetAutoCommit(false) setze bekomme ich die Selbe Exception.
 

mrBrown

Super-Moderator
Mitarbeiter
Nein denn es wird ja immer nur der erste Datensatz durchlaufen.
Was nun mal passiert, wenn das ResultSet danach leer ist, über das zurückkehren aus der Schleife sagt das nichts aus.

Ja genau, mit dem ersten Datensatz wird auch das erste Item in die erste ComboBox gesetzt und somit das ItemEvent ausgelöst. Damit wird dann die überschriebene Initiate() aufgerufen, welche die zweite Combobox mit Daten aus der Datenbank füllt. Nach dem die Initiate() aus dem ItemEvent aufgerufen und durchgelaufen ist, kehrt er aber nicht mehr zurück in die while Schleife der ersten Initiate() Methode. Deshalb wird auch nur der erste Datensatz in die erste ComboBox gelesen.
Doch, er kehrt zurück.
Allerdings ist das ResultSet (was in der anderen Methode überschrieben wurde) dann schon durchlaufen - du hast ja die andere ComboBox damit gefüllt.


Ich habe jetzt mal für jede Klasse eine eigene ResultSet Variable angelegt. Jetzt bekomme ich eine SQL-Exception:

SCHWERWIEGEND: null
java.sql.SQLException: ResultSet nicht geöffnet. Vorgang 'next' nicht zulässig. Stellen Sie sicher, dass Autocommit deaktiviert ist.

Aber auch nachdem ich die Connection auf SetAutoCommit(false) setze bekomme ich die Selbe Exception.
Mach es dir leichter und trenn Lesen und Anzeigen.
Lies dann einfach das ganze ResultSet auf einmal ein und das Problem löst sich in Luft auf.


wahrscheinlich benutzt du auch noch ein statisches Statement...

Das einzige was statisch sein darf ist die Verbindung selber.
Ich würde weiter gehe und sagen: Kein Zustand sollte statisch sein.
 

Neue Themen


Oben