# JDBC, ForwardOnly bei ResultSet nach Uebergabe



## Ellegon (12. Mrz 2007)

Hallo alle,

Ich hab ein Problem und weiss nicht, ob ich einen Design-Fehler habe oder einfach Java nicht richtig anwende  

Also, ich hab eine Klasse database(), das den Zugriff auf die Datenbank handhaben soll. Darin sind die Befehle für das Oeffnen und Schliessen der DB, sowie alle Abfragen enthalten. Das funktioniert auch.

Nun möchte ich von einer anderen Klasse aus Daten abfragen und diese in ein ResultSet setzen. Als Uebergabeparamater habe ich das Query, als Return das ResultSet. Auch das funktioniert.

Mein Problem ist nun aber das ResultSet. Das definiere ich in der äusseren Klasse mit

ResultSet rs = null;

und fülle es dann mit

String Query = "Select * from tabelle"
Database db = new Database()
rs = db.SelectQuery(Query)

Innerhalb der database() Klasse kann ich das ResultSet beim erstellen des Statements dann ja auch so definieren, dass ich zurück scrollen kann. Aber das rs in der 'äusseren' Klasse ist ja 'Forward Only', da ich bei 'ResultSet rs = null;' nix definieren kann. Für die weitere Anwendung will ich mich aber innerhalb des ResultSets frei bewegen können...

Was mache ich falsch? Aus Strukturgründen würde ich den Query auf die DB gerne in der database() Klasse drin lassen.

Ellegon


----------



## SlaterB (12. Mrz 2007)

> Aber das rs in der 'äusseren' Klasse ist ja 'Forward Only', 
> da ich bei 'ResultSet rs = null;' nix definieren kann. 

was zum Himmel meinst du denn damit?
wie definierst du ein ResultSet so dass es nicht 'Forward Only' ist?
und warum kann das die Database-Klasse nicht machen?

und wenn es die Database-Klasse macht, wieso geht es außerhalb nciht mehr?
nur weil das Objekt einmal übergeben wird, ändern sich doch nicht dessen Eigenschaften?
das ResultSet weiß doch gar nicht wer es da gerade aufruft..

aber generell solle das ResultSet die Database-Klasse nicht verlassen,
(es sei denn die andere Klasse ist auch eine Database-Klasse, nur eben eine andere)

packe doch alle Elemente in eine andere Datenstruktur, z.B. ein String[][]?
ok, wenn du viele Datentypen hast, dann wird das umständlich ohne ein größeres System


----------



## Ellegon (12. Mrz 2007)

Also, vielleicht noch einmal genauer.. ich habe ein Form auf dem ein Button ist, mit dem ich in der Datenbank Daten suchen kann. Sobald ich den drücke, wird der Select String gebildet (basierend auf den Daten im Form) und an die die db-Klasse übergeben. Die ist auch in einem zweiten Package. Bsp:

testprog.GUI (Package für alle GUI Elemente)
testprog.database (Package für alle DB Elemente)

Im Database package habe ich eine Klasse Database(). Darin sind Methoden wie 
private void OpenDB()
private void CloseDB() 

und 

public ResultSet SelectQuery(string)

Mit SelectQuery(string) kann ich nach übergabe des QueryStrings das Resultat in ein ResultSet setzen. Und wie gesagt, das funktioniert ja auch. Um aber ein ResultSet zurückzubekommen, muss ich es ja in der Klasse im Paket testprog.GUI ebenfalls definieren. Ich definiere es aber ohne dazugehöriges Statement, da dass ja dann in der database-Klasse passiert. Ich brauche das RS im GUI Paket ja eigentlich nur als Container, um auf die Daten zugreifen zu können (z.B. dann über GUI hin und herblättern).

Und genau da liegt meine Krux... ;(


----------



## SlaterB (12. Mrz 2007)

man definiert nix 'mit zugehörigen Statement', 
da hast du die Java-Grundlagen noch nicht verstanden,

es gibt genau eine Stelle, an der das ResultSet-Objekt erzeugt wird,
irgendwo in der DB-Klasse,

danach kann jederman damit arbeiten, selbst eine JSP wenn man sich nur den Aufwand des Transports macht,

für eine externe Klasse stehen vor der Benutzung zwei Aufgaben an:
1.
eine VARIABLE deklarieren, z.B.
ResultSet rs = null;
das hat mit dem späteren Objekt noch nicht viel zu tun, 
2.
das Objekt laden:
rs = database.getResultSet();
was die Database-Klasse intern alles anstellt, um das Objekt zu erzeugen, ist extern egal, 
hauptsachen am Ende ist das Objekt da und wird der besseren Handbarkeit wegen in einer lokalen Variablen rs gespeichert,
nun kann man mit rs arbeiten,


-------------

ein Problem ist evtl. wenn das ResultSet und/ oder die Datenbank-Verbindung geschlossen ist (close),
dann kann man mit dem ResultSet evtl. nichts mehr anfangen,

das hat aber nichts damit zu tun ob du dich in der Database-Klasse oder außerhalb aufhälst,
das hängt einfach nur vom Zeitpunkt ab,
wenn etwas weg ist, dann ist es danach nicht mehr da..


----------



## Ellegon (13. Mrz 2007)

Ah, ok danke. Ich wusste, ich hab ein grundsätzliches Denk-Problem drin  Und ja, ich denke noch lange nicht "java konform", sondern meist noch in "alten Schuhen". Ich werde mich da nochmal reinhängen. Für's erste reichen mir aber Deine guten Ausführungen. Danke.


----------

