Oracle Problem mit Resultset

MaikHSW

Aktives Mitglied
Hey zusammen.
Ich arbeite in meinem Programm mit einer Oracle-DB.
Das geht auch soweit erstmal sehr gut.
Nun habe ich jedoch folgendes Problem:

Ich stelle eine SQL-Abfrage und bekomme ein Resultset zurück.
Um die Größe zu erfahren damit ich ein Array passend initialisieren kann durchlaufe ich es einmal und zähle mit.

Das mache ich so:
Java:
while (a.getErgebnis().next()) {
Zeilen = Zeilen+1;
 }

Das klappt auch noch erfolgreich.
Wenn ich das Resultset aber nun mit einer Schleife durchlaufe kriege ich nichts zurück.
Schleife:
Java:
	while (b.getErgebnis().next()) {
    	Tabelleninhalt[x][0]=b.getErgebnis().getString(1);
       Tabelleninhalt[x][1]=b.getErgebnis().getString(2);
       Tabelleninhalt[x][2]=b.getErgebnis().getString(3);
       Tabelleninhalt[x][3]=b.getErgebnis().getString(4);
       Tabelleninhalt[x][4]=b.getErgebnis().getString(5);
       Tabelleninhalt[x][5]=b.getErgebnis().getString(6);
       Tabelleninhalt[x][6]=b.getErgebnis().getString(7);
       Tabelleninhalt[x][7]=b.getErgebnis().getString(8);
	 x=x+1;
	}

Nun nehme ich an, dass der Pointer beim Resultset noch auf der letzten Stelle steht und daher das next() nicht so der Hit ist.
Eine Recherche brachte folgende Möglichkeiten der Lösung:
ResultSet.beforeFirst(); ---> setzt den Pointer vor die erste Stelle auf, also genau das was ich eigentlich suche. Oder
Resultset.absolute(X); ---> setzt den Pointer an der X-Stelle wieder auf. Das geht ja auch wenn ich da einfach 0 oder 1 nehme.

In beiden Fällen kommt jedoch ein ganz unschöner Fehler, nämlich folgender:
java.sql.SQLException: Ungültiger Vorgang bei Nur-Weiterleiten-Ergebnismenge: beforeFirst
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.BaseResultSet.beforeFirst(BaseResultSet.java:62)

Auch wenn ich absolute nehme kommt der gleiche Fehler, nur statt beforeFirst steht da dann absolute.
Ich habe es einmal testweise in die Klasse implementiert wo ich die Funktion brauche und einmal direkt in meine Datenbankklasse.
In beiden Fällen brachte es mich kein Stück weiter.

Wie macht man das?
Was mache ich nun schon wieder falsch?

Danke für eure Hilfe.



Gruß
 
du kannst beim Statement-erschaffen nen Parameter dafür mitgeben, dann geht das (weiß ihn grade nicht auswendig)..

aaaber: nimm doch lieber ne ArrayList, dann hast du das Problem garnicht mehr... warum willst du das in ein dummes Array stopfen?
 
Hey Schandro.
Das will ich, weil ich das dann in Folge an eine JTable übergebe zwecks Darstellung.
Das scheint mir der einfachste Weg zu sein.
Okay, ich kann nen Parameter mitgeben.
Aber wenn du ihn nicht weißt bzw. ich die Anwendung des Parameters nicht kenne hilft der mir nur bedingt weiter 🙂


Gruß
 
Hey Mvitz.
Ich habe ja nur das Resultset genommen da Oracle bereits in der Form die Daten bereitstellt.
So spare ich mir das Konvertieren.
Also sollte ich vom Resultset in die ArrayList und von da ausgehend in das Array konvertieren?

Wo ist der Vorteil der ArrayList?
Wenn ich mich nicht täusche ist das eine Liste und somit ist der Zugriff nicht frei wählbar,
man muss also wieder durch die Liste iterieren.
Oder?


Gruß
 
nein, ne ArrayList ist intern nur ein Array... du kannst mit O(1) auf alle Elemente zugreifen...
deswegen kostet es auch nichts das wieder in ein Array umzuwandeln.

ergo: nimm ArrayList!
 
du kannst beim Statement-erschaffen nen Parameter dafür mitgeben, dann geht das (weiß ihn grade nicht auswendig)..

Ich denke, dass was Schandro meinte ist folgendes:

Java:
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

Wenn du das ganze in einer JTable anzeigen möchtest. Könntest du dir ja noch eine Klasse erstellen und diese von AbstractTableModel erben lassen.

Ich hoffe, dass hilft dir weiter.

mfg
 
Hey Lodrik.
Das mit AbstractTableModell ist mir aktuell noch etwas zu hoch,
das kommt später mal 🙂
Den Befehl versuche ich mal, danke.


Gruß

P.S. Die Parameter waren es. Nur die ergänzen und schon klappt es wunderbar. Die Arraylist-Umbaute kann somit perspektivisch erfolgen und ist nicht zeitkritisch. Danke.
 
Zuletzt bearbeitet:
Noch ein Tipp am Rande.

Nutze wo immer du kannst Implementierungen des Interfaces List --> ArrayList oder LinkedList anstelle von Arrays. Es ist einfach wesentlich eleganter und auch einfacher mit diesen zu arbeiten.
 
Hey mvitz.
Hab das einen Hintergrund?
Ich würde es gerne verstehen da ich ja Anfänger bin....
Wo ist die Eleganz? Und wie implementiert man die richtig? Ganz normal, vergleichbar mit einem Array?


Gruß
 
Rein von der Nutzung sind List und das Array recht ähnlich.

Was beim array double ist ist in der Liste list.get(i).
Beim reinfüllen double = 1.0 ist in der Liste entweder list.add(1.0) oder list.add(i, 1.0).

Wieso man das macht, weil der Umgang mit Listen halt angenehmer ist und viele der Klassen eine Liste als Parameter erwarten und kein Array mehr. Zudem wachsen Arrays mit und haben nicht eine vorher festgelegte Größe, was z.B. für Resultsets von Vorteil ist.
 
Hey.
Okay, das verstehe ich.
Ich danke dir für deine Erklärung.

Nun muss ich doch mal ernsthaft über eine Änderung meiner Sourcen nachdenken 🙂



Gruß
 

Neue Themen


Zurück
Oben