# Operation not allowed after ResultSet closed



## AlArenal (10. Feb 2004)

Wenn ihr diesen Fehler mal haben solltet,

"java.sql.SQLException: Operation not allowed after ResultSet closed",

habt ihr mal voll verloren!

Der gute Herr Google hilft einem hier nämlich mal gar nicht. Ist voll klasse, man hat einen Code á la


```
1 rs = stmt.executeQuery(sql);
2 
3 while (rs.next()) {
4  // tu was
5 }
```

hat, und als Dank bekommt man für Zeile 3 obigen Fehler. Das Beste ist: Den halben Tag läuft die Anwendung und auf einmal kommt er mir jedes Mal an derselben Stelle mit dem Quatsch an. DB ist MySQL 3, der Connector ist die 3.0.10, JDK ist 1.4.2_3 und das ist mal einer dieser Fehler, wo man sich keiner Schande bewusst ist.


----------



## BRT006 (10. Feb 2004)

Sicher dass du nicht irgendwo dein Statement Objekt schließt? Das hätte nämlich genau diesen Effekt


----------



## AlArenal (10. Feb 2004)

BRT006 hat gesagt.:
			
		

> Sicher dass du nicht irgendwo dein Statement Objekt schließt? Das hätte nämlich genau diesen Effekt



Zwischen den beiden Zeilen beifndet sich genau 0 Code!
Ich habe jetzt auch rausgefunden, dass der Fehler nur auftritt, wenn das SQL-Statement auch in der DB mehrere (!) Zeilen liefert. Ein getRow() liefert seltsamerweise immer 0. 

Ich blick das echt nicht.. ich schaue morgen mal, ob ich alternativ mit einem RowSet arbeiten kann, das erklärt zwar nicht die Ursache, behebt aber hoffentlich wenigstens das Problem.


----------



## AlArenal (11. Feb 2004)

Fehler gefunden!

Innerhlab der while-Schleife gab es noch eine weitere SQL-Abfrage. Diese benutzte zwar eine andere ResultSet-Variable, aber dieselbe Statement-Variable. Dummerweise hat so ein Statement die Angewohnheit bei erneuter Abfrage das zuvor erzeugte ResultSet zu schließen und daher stammte der Fehler.

Ich verstehe nun nur noch weniger, warum der Code vorher funtkioniert hat...


----------



## DP (12. Feb 2004)

hat jemand eine ahnung wie ich einen resultset mehrmals durchlaufen kann?!

danke


----------



## AlArenal (13. Feb 2004)

DP hat gesagt.:
			
		

> hat jemand eine ahnung wie ich einen resultset mehrmals durchlaufen kann?!
> 
> danke




```
rs.beforeFirst();
```

Und danach kannste einfach wieder mit


```
while (rs.next()) {}
```

nochmal durchlaufen.


----------



## Orolhawion (13. Feb 2004)

gibts dabei dann nicht nochwas zu beachten?
ich bekomm dann das...
java.sql.SQLException: Ungültiger Vorgang bei Nur-Weiterleiten-Ergebnismenge: beforeFirst

eigentlich will ich nur datensätze zählen, dafür durchlaufe ich das ResultSet mit nem counter
danach setze ich den pointer eben mit 
	
	
	
	





```
res.beforeFirst();
```
 wieder auf die erste position und durchlaufe das ResultSet erneut um den kram in eine jtable zu schreiben... geht das nur so oder geht das auch einfacher? 
(z.b. wie in php mit einer funktion wie 
	
	
	
	





```
$count=mysql_num_rows($argument);
```
)
DB ist eine Oracle-DB...


----------



## magneto (13. Feb 2004)

HI Orolhawion, 

also ich würde das so machen. Vorausgesetzt du willst nur die Datensätze zählen.


```
...
ResultSet r;
...
 statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
...

              r.last();
     int	 zeile=r.getRow();
	 r.beforeFirst();

while(r.next()){
...
}
```

gruß
ivan


----------



## Orolhawion (13. Feb 2004)

klingt gut, liefert mir jetzt das was du da geschrieben hast auch wirklich die zahl des letzten satzes oder nur die höchste id?! das hat sowas von 
	
	
	
	





```
SELECT * FROM table ORDER BY ID DESC LIMIT 1
```
angenommen die letzte id wäre 99 und die lösche ich und füge eine neue hinzu dann hat die den wert 100 aber es sind trotzdem nur 99 datensätze weil eben 99 fehlt...

ich brauch die anzahl der datensätze für die größe eines arrays..


----------



## magneto (13. Feb 2004)

HI,

hoffe ich habe dich nicht falsch verstanden :?: 
also damit bekommstdu die Anzahl der Datensätze(Reihen).
wenn du was löschst und dann was neues einfügst..würde ich einfach ein neues
ResultSet anfordern.

greetz
ivan

oder meinst du was ganz anderes ??


----------



## Orolhawion (13. Feb 2004)

ja im prinzip mein ich das was du denkst! 
ziel des ganzen ist folgendes: ich hole aus einer oracle-db per SELECT eine bestimmte anzahl von datensätzen raus, die je nach abfrage ständig variert. um diese daten jetzt in einer jtable darzustellen benötige ich zwei arrays. eins für die tabellenköpfe der jtable und eins für die daten für die jtable.

in PHP würd ich das so machen:


```
<?php
...
// Tabellenköpfe
echo "<table><tr><td>1</td><td>2</td>... </tr>";
// Tabelleninhalt
while ($row=mysql_fetch_array($get_data))
{
        echo "<tr><td>$row[1]</td><td>$row[2]</td>... </tr>";
}
echo "</table>";
?>
```

dann würde die tabelle so lang werden wie eben datensätze da sind, da es sowas äußerst nützliches in java nicht zu geben scheint (korrigier mich wenn ich falsch liege!) muß ich also den umweg über datensätze zählen gehen um die größe des arrays bestimmen zu können, wo nachher die daten reinkommen... klar soweit? :?


----------



## magneto (13. Feb 2004)

Hi, 
also ich bin weit davon weg ein Profi zu sein...
Das gleiche Problem hatte ich auch als ich meinen SQl-Trainer geschrieben habe.
Da habe ich es so gemacht, aber nur weil ich keine bessere Lösung gefunden habe.
So funktioniert es aber auf alle Fälle. Datensätze ermitteln und dann die Arrays für
JTable anlegen.
Wenn du willst poste ichden ganzen Code den ich damals eingesetz habe.
Ist mit new Access DB..

Gruß
ivan


----------



## Orolhawion (13. Feb 2004)

nee, geht schon, den code hatte ich ja schon von anfang an fertig, ich wollte nur wissen ob das eben auch einfacher geht, als so..  danke trotzdem!
schönes wochenende!


----------



## AlArenal (13. Feb 2004)

Du willst die Anzahl der Datensätze?

Schonmal was von SQL gehört?

count() ist dein Freund...


----------

