# Tabelle mit resultset refreshen?



## kinglui (13. Jun 2009)

Hallo beisammen,

ich hab leider mal wieder ein kleines Problemchen, bei dem ich auf euch angewiesen bin 

Undzwar habe ich folgende Situation:
Frame1 erzeugt eine Tabelle, welche mit Inhalten aus einer DB versehen wird. Klicke ich auf einen Datensatz, wird Frame2 geöffnet, auf welchem sich ein Löschenbutton befindet.

Klicke ich auf den Button, wird der Datensatz ganz normal gelöscht und Frame2 geschlossen.

Problem ist, dass der Datensatz in der Tabelle (Frame1) noch offen ist, ich folgende Meldung bekomme:

```
Operation not allowed after ResultSet closed
```

Kann ich die Tabelle irgendwie refreshen, damit der Datensatz nicht mehr angezeigt wird?
Hab versucht, die Tabelle zu removen und neu zu erstellen.. aber das passt nicht, weil meine "Tabellen-Erzeugenmethode" nicht private ist. 
Wenn ich sie auf public static setze, werden in "ihr" wieder eine Rechte verhauen. Kann ich das irgendwie anders lösen?

Danke!


----------



## SlaterB (13. Jun 2009)

aus einer JTable kann man quasi zu jedem Zeitpunkt einen Datensatz löschen oder auch alle und neue einfügen,
zu 100% unabhängig von irgendwelchen DB-Verbindungen, 

aus deinen eher wirren Erklärungen wird nichts richtig klar, was man direkt korrigieren könnte,

außer wie im ersten Satz schon angedeutet und extrem nützlich überall auf der Welt:
nicht Dinge mischen, die nicht zusammengehören,

auf der einen Seite ist alles was mit DB zu tun hat, ResultSet und so, von dort kannst du ein String[] oder eine ArrayList oder sonst irgendeine neutrale Form von Daten abfragen,
diese Daten kommen in die JTable bzw. deren Model, können gelöscht oder ersetzt werden,
aber JTable kann nie irgendwas mit einem Datenbank-Problem zu tun haben


----------



## kinglui (14. Jun 2009)

Hallo,

könntest du mir vielleicht sagen, warum mein Post wirr klingt? 
dann kann ich an mir arbeiten 

Falls es an den Fachtermini liegt, muss ich dir leider recht geben, da haperts noch..

aber ich versuche es nochmal:
Mein Tablemodell fragt Daten aus einer DB ab und erzeugt einen View  auf Frame1.
Klicke ich nun auf eine Zeile (=Tupel), wird per ActionEvent ein weiteres Frame geöffnet, welches einen Button hat, der per Statement execute den gewählten Datensatz löscht. Frame2 schließt sich darauf.

in Frame1 (und der Tabelle) ist aber immernoch der eben gelöschte Datensatz zu sehen und ich vermute, dass ich Meldung daher kommt (lt. meinem Tablemodel aus der getRowCount Methode).

Mein ResultSet schließe ich nähmlich garnicht in einer dieser Methoden.

Hoffe das war erklärender?

Danke


----------



## SlaterB (14. Jun 2009)

> könntest du mir vielleicht sagen, warum mein Post wirr klingt? 

> Problem ist, dass der Datensatz in der Tabelle (Frame1) noch offen ist, ich folgende Meldung bekomme:
> Code: Operation not allowed after ResultSet closed

Datensatz ist relativ abstrakt, kann vieles bedeuten, aber die Eigenschaft offen/ geschlossen kann ich mir dazu gar nicht vorstellen,
du meinst vielleicht, dass ein ResultSet noch offen ist?
ein ResultSet ist kein Datensatz sondern eine Informations-Austausch-Schnittstelle zur Datenbank (gerade ausgedachter Begriff  )

warum jetzt wo genau eine Exception auftritt ist unklar

> Hab versucht, die Tabelle zu removen und neu zu erstellen.. aber das passt nicht, weil meine "Tabellen-Erzeugenmethode" nicht private ist.

hier kann man mit viel Fantasie verschiedene Strategien ausmalen, wie dein Programm aufgebaut ist, und was du an dieser Stelle vorhast (JTable aus JPanel removen?)

> Wenn ich sie auf public static setze, werden in "ihr" wieder eine Rechte verhauen. 

gekrönter Höhepunkt, was ist 'eine Rechte', ein Boxer-Begriff? wer verhaut hier wen? 

----

> ist aber immernoch der eben gelöschte Datensatz zu sehen und ich vermute, dass ich Meldung daher kommt

dass vorhandene Daten weiter vorhanden sind und nicht von selbst verschwinden,
ist eine angenehme Konstante im Universum, wie es dazu aber eine Meldung gibt, ist unklar,

die Tabelle wird sich sicher nicht automatisch mit der Datenbank verbinden, um sich zu aktualisieren (wann? warum?)

----

wie zuvor mein grundsätzlicher Tipp, Anzeige von DB zu trennen, 
ResultSets spätestens 10 ms nach der DB-Anfrage schließen, dann kann in dem Bereich nicht viel schiefgehen,

wenn du irgendwo Daten löschst, dann kannst du im gleichen Atemzug aus einer Tabelle einen einzelnen Eintrag löschen (wenn du weißt welchen), ganz unabhängig von der DB,
oder du lädst einfach alle Daten neu aus der DB und schreibst sie in die Tabelle


----------



## kinglui (14. Jun 2009)

SlaterB,

muchas gracias!

zum einen für den Lachkrampf den du mir gerade mit meinen Zitaten bereitet hast (egal was ich genommen habe, ich lasse es in Zukunft) und zum anderen für deine Tipps.

Hab nochmal alles analysiert und den Fehler gefunden.
Ich dachte, dass ich einmalig ein Objekt vom Typ Statement erzeugen könnte, um dann im Verlauf nurnoch darauf zu referenzieren und neue ResultSets erzeugen könnte. Leider Fehlanzeige.

Der Fehler ist mir erst jetzt aufgefallen, weil ich bis dato jedes "Objekt", welches ein Resultset brauchte, immer einzeln aufgerufen habe, und es so nicht zu der "Überschneidung" kam.

Danke, ich geh dann mal weiter an meiner Artikulation arbeiten ...


----------

