# Exception bei ResultSet.moveToInsertRow



## DreamDander (25. Feb 2005)

Hallo Leute,

fange gerade erst an mit Java und JDBC auf einer Oracle Datenbank zu programmieren.
Da ich es von VB gewohnt bin mit RecordSets ( in Java ja ResultSet ) zu programmieren, wollte ich auch nun in Java alles über das ResultSet Objekt machen. 

Nur bekomme ich jetzt beim einfügen von einem neuen Datensatz den folgenden Fehler:

java.sql.SQLException: Ungültiger Vorgang bei schreibgeschützter Ergebnismenge: moveToInsertRow
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBE rror.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBE rror.java:179)
at oracle.jdbc.driver.BaseResultSet.moveToInsertRow(B aseResultSet.java:628)
at test3.main(test3.java:59)

Habe aber beim erstellen des Statements darauf geachtet das es UPDATABLE ist.

Hier der Code:


```
try
{
                
	            SelectStmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
	                    				ResultSet.CONCUR_UPDATABLE);
	          
	            String Query = "Select * from test";
	            rSet = SelectStmt.executeQuery(Query);
	            
	            rSet.moveToInsertRow();
	            rSet.updateInt("id",1);
	            rSet.updateInt("value",2);
	            rSet.insertRow();
```

Als Treiber verwende ich den jdbcracle:thin von Oracle.

Hoffe ihr könnt mir helfen, bin schon am verzweifeln.
Mfg DreamDancer


----------



## abollm (28. Feb 2005)

Kannst du ein wenig mehr Code posten?
Wenn ja, dann ist die Wahrscheinlichkeit, dass dir hier geholfen wird, sicherlich größer.


----------



## bambi (28. Feb 2005)

Hab' bis jetzt auch noch nichts mit moveToInsertRow() gemacht.
Was ist denn der Vorteil davon - wenn wir gerade mal beim Thema sind? Ansonsten: ich hab'
mal in die API gesehen. Demnach sieht's schon vom Ansatz her richtig aus. Es ware also das
Beste, wenn Du mal schreibst in welcher Zeile genau Du die Exception bekommst. Dann kann
man sicher mehr sagen.

THX


----------



## DreamDander (3. Mrz 2005)

Also der Fehler tritt auf in Zeile 11.

Und vor dem hier geposteten Code wird nur noch die DB geöffnet und zwar wie folgt:



```
final String connect_string = "jdbc:oracle:thin:username/password@DB:Port:Schema";
        Connection conn;
        
        try
        {
            DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
            conn = DriverManager.getConnection (connect_string);
            
        }
        catch( Exception e)
        {
            System.out.println( e );
            return;
        }
```


Ich bin das arbeiten mit ResultSets von VB her gewohnt, so kann man dort auch nocheinmal die Daten die sich im ResultSet befinden Filtern, ohne das eine erneute Abfrage auf die Db ausgeführt wird.Weiß einer von euch ob das mit den Java ResultSets auch geht? Hab so ne Methode noch nicht gefunden.

MfG DreamDancer


----------



## Bleiglanz (3. Mrz 2005)

DriverManager.registerDriver (new oracle.jdbc.OracleDriver()); 

WARUM?

=> Datenbank Treiber haben i.A. einen Initialisierungscode (static) der selbst dafür sorgt, dass sie sich beim DriverManager registieren

verwende die Variante mit Class.forName!
+

rs.getType
rs.getConcurrency

aufrufen ob das resultset passt

+

ruf mal über die Metadaten

supportsResultsetType
supportsResultsetConcurrency

auf (ob das mit deinem Treiber überhaupt geht)

+

lass mal die Warnings deines ConnectionsObjekts ausgeben

+ 


> Ich bin das arbeiten mit ResultSets von VB her gewohnt, so kann man dort auch nocheinmal die Daten die sich im ResultSet befinden Filtern, ohne das eine erneute Abfrage auf die Db ausgeführt wird.Weiß einer von euch ob das mit den Java ResultSets auch geht? Hab so ne Methode noch nicht gefunden.


google mal such mal nach RowSet, ein normales ResultSet kann man nicht "filtern", es entspricht überhaupt nicht dem, was du von VB her kennst


----------



## DreamDander (3. Mrz 2005)

also hab jetzt mal wie du sagtest alles durchgecheckt.

Und herraus gekommen ist:

Die Datenbank lässt den concurrency Mode ResultSet.CONCUR_UPDATABLE zu, auch die Kombination aus
ResultSet.TYPE_SCROLL_SENSITIVE und ResultSet.CONCUR_UPDATABLE wird unterstützt.

Nach erstellen des Statements liefert mir getResultSetConcurrency  ResultSet.CONCUR_UPDATABLE .
Allerdings gibt mir das ResultSet beim aufrufen von getConcurrency() ResultSet.CONCUR_READ_ONLY zurück.
Das Statement hat nach dem erstellen aber immer noch den Concurreny Typ CONCUR_UPDATABLE.



Das mit den RowSets hab ich mir schonmal angeschaut, da gibts ja dieses FilteredRowSet, was aber scheinbar auch nicht das is was ich aus VB her kenne. Anscheinend ist es dort ja nur möglich Ranges zu definieren in denen sich die Daten befinden sollen. Ich kenne es so das ichim Filter quasi nochmal mit SQL den Teil der WHERE Bedingung einsetzen kann und dann dementsprechend nur auf den Filter zutreffende Sätze im Recordset angezeigt werden.

Gibts da nicht so etwas auch in Java?
Oder wie läuft das dann mit großen Daten ab? 

Muss wegen jeder spezielleren Abfrage ein neuer Query an die Datenbank abgesetzt werden?
Erzeugt doch erheblich mehr Traffic.

MfG DreamDancer


----------



## Gast (2. Nov 2005)

versuch es mal mit 
String Query = "Select test.* from test"


----------

