# Böses deleteRow()



## Waldelf (6. Jul 2006)

Hallo allerseits und Tach erstmal!

deleteRow will nicht und ich kann den Fehler nicht finden. Alles andere geht. 
Es handelt sich um eine Oracle-DB und den Thin Treiber.


```
Statement st = dbCon.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE );
rsData = st.executeQuery("select bla bla bla...");
if ((rsData.next()) ) {
if (rowId>0) {rsData.absolute(rowId);}
...
if (navigator.equals("doDelete")) {
	rsData.deleteRow();
}
...
```

Als Fehlermedung bekomme ich:
"Ungültiger Vorgang bei schreibgeschützter Ergebnismenge: deleteRow"
Wieso schreibgeschützt, ich habe doch CONCUR_UPDATABLE gesetzt und der User hat auch Schreibrechte?

Ich möchte kein Delete SQL ausführen sondern den aktuellen Datensatz löschen, es soll auch bei Tabellen ohne PK funktionieren.

Hat jemand eine Idee?

Danke
nic


----------



## foobar (6. Jul 2006)

> ch möchte kein Delete SQL ausführen sondern den aktuellen Datensatz löschen, es soll auch bei Tabellen ohne PK funktionieren.


Warum nicht? Die Bedingungen die du im Selectstatement verwendest kannst du doch auch im DELETE verwenden. Wo liegt das Problem?


----------



## Waldelf (6. Jul 2006)

Das geht nicht bei Tabelle ohne PK. 

Mein ziel ist eine universelle Klasse für ein editierbares DBGrid mit HTML-Ausgabe zu bauen. Die Tabelle ohne PK sind da die Spielverderber. 

Ich suche keinen Workaround, sondern möchte das deleteRowe verstehen und benutzen.


----------



## vas (27. Feb 2008)

... fast zwei Jahre später ...



Hallo!


Ich möchte nur eine kleine Desktoptop-Datenbankanwendung mit Java DB (Derby) unter Win XP erstellen, und versuche mich jetzt seit Stunden (genauer: Tagen) an einer simplen Demoapplikation. Die Struktur der Datenbank ist gegeben (mit Netbeans 6.0 erstellt). Die Verbindung mit dem embeddedDriver funktioniert endlich, Einfügen neuer Sätze und Navigation in den Sätzen des ResultSet ebenfalls.


Was jetzt nicht klappt, ist das Löschen von Sätzen aus dem ResultSet. Der Satz-Zeiger sollte eigentlich laut Dokumentation auf den prevoius-Satz zurückspringen, macht er aber nicht (ermittelt über int ResultSet.getRow()), sein Wert bleibt konstant. Wenn ich von dem gelöschten Satz mit ResultSet.next() bzw prevoius() weggehe, funktioniert das zwar. Wenn ich dann aber wieder in Richtung des "gelöschten" Satzes navigiere und ihn erreiche kommt die Fehlermeldung:

java.sql.SQLException: Das ResultSet ist nicht geöffnet. Die Operation 'next' ist unzulässig. Prüfen Sie, ob das automatische Festschreiben inaktiviert ist.


Teile des Codes


```
stmtX = cncDemo.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                                              ResultSet.CONCUR_UPDATABLE);
...

sSQL = "SELECT * FROM TabelleX";
rsX = stmtX.executeQuery(sSQL);
rsX.next();                             // 1. Datensatz

...

rsX.deleteRow();                    // ???
...
```


Ich bin wohl nicht der Einzige, der Probleme mit dem ResultSet.deleteRow() hat. Irgendwelche Tipps?



vas


----------



## Waldelf (28. Feb 2008)

He ließ ja jemand meine Posts? Cool!

hast Du einen Primärschlüssel auf der Tabelle?

Nein? Dann ist es das gleiche Problem wie bei mir damals.

Ich habe bisher keine Lösung gefunen, habe es aber auch nicht weiter verfolgt.

Viel Erfolg!


----------



## vas (1. Mrz 2008)

@ waldelf, als braver Forumsuser guck ich natürlich, ob schon ein Thema zu meinem Problem existiert!

Na ja, das deleteRow() scheint immer noch böse zu sein. Das ist nix gut!

vas


----------



## TonyToronto (28. Apr 2008)

Vielleicht hilft Euch das ja weiter.
Hatte ein ähnliches Problem.
Fehlermeldung "Ungültiger Vorgang bei schreibgeschützter Ergebnismenge:", obwohl ResultSet.CONCUR_UPDATABLE  gesetzt war.
Habe dann statt "Select * " die Spaltennamen direkt hingeschrieben.
Danach war das ResultSet tatsächlich updatable.


----------

