wie mit resultset.next() über Datensätze iterieren?

JIZZES

Mitglied
Guten Abend liebe Gemeinde!

ich habe bezüglich des iterierens über Datensätze eine Frage:

ist es möglich mit einem resultset und dessen methode next() über einzelne Datensätze zu iterieren? Wenn ja, wie? jedesmal, wenn ich die next() methode im RS aufrufe, ruft dieser nur den letzten Datensatz in der Datenbank auf, anstatt alle Datensätze einzeln aufzurufen. Das Ganze soll über einen Button aufrufbar sein, der durch anklicken den nächsten Datensatz anzeigt. Aber das ist nicht das Problem.

mein code sieht quasi so aus:

Java:
statement....
resultSet + sql-querie...

while (rs.next()) {

isbn = rs.getString("isbn")
likes = rs.getString("like")
...
wie könnte ich jeden einzelnen Datensatz in der Datenbank aufrufen lassen? Bin dankbar für jede Hilfe...
 

CptSocket

Aktives Mitglied
Hallo

Hast du schonmal probiert, auf Zeile 9 die Werte von isbn und likes auszugeben? Sehr wahrscheinlich würdest du dann alle Datensätze sehen.
Für mich sieht es so aus, wie wenn du im while-loop isbn und likes solange überschreiben würdest, bis du beim letzten Datensatz angelangt bist.

Eine Variante wäre, dass du eine Klasse 'Datensatz' mit den Attributen isbn und likes erstellst. Der Rückgabewert der Methode wäre dann eine Liste von Datensätzen, im while-loop würde jeweils ein neuer Datensatz in die Liste eingetragen. Der Unterschied dieser Lösung zu dem was du beschreibst ist aber, dass die Daten in einem Rutsch und nicht einzeln geladen werden.

Alternativ müsstest du das resultset offen halten und bei jedem Klick auf den Butten ein einzelnes Resultat aus dem ResultSet beziehen (also nicht über das ResultSet loopen).


Freundliche Grüsse
CptSocket
 

xerion21

Mitglied
Java:
statement....
resultSet + sql-querie...

while (rs.next()) {

isbn = rs.getString("isbn")
likes = rs.getString("like")
...

Wie mein vorposter schon sagte, sehr wahrscheinlich überschreibst du deinen Inhalt in den Variabeln bei jedem Aufruf und gibst dann nur den letzten aus.

Denn mit
Java:
while(rs.next()) { ... }
funktioniert das auf jeden Fall richtig. Ich benutze den Befehl momentan genauso. Ich übertrage das mal auf den Beispiel:
Java:
ArrayList<Buch> buecherliste = new ArrayList<>;
Buch buch;
while(rs.next()) {
    buch = new Buch();
    buch.setISBN(rs.getString("isbn"));
    buch.setLikes(rs.getString("likes"));
    buecherliste.add(buch);
}

Nun hast du alle Bücher in der ArrayList
 
Zuletzt bearbeitet:

JIZZES

Mitglied
Vielen Dank für die Antworten! Darauf bin ich echt nicht gekommen. Nochmals: Danke. Ich habe nun eine neue Klasse "Books" angelegt mit getter und setter für isbn, likes und comment und den Construktor.

Auch habe ich wie oben von xerion beschrieben, dass ganze mit der ArrayList realisiert. Meine Frage jetzt: Ich rufe die Methode über den Button auf. Doch wie rufe ich die einzelne Datensätze auf?
Ich denke da an...

einen Iterator bzw. die Liste mit while(buecherliste.hasNext) { jtextfield.set... }

durchzugehen.

Doch wenn ich die Methode aufrufe, wie greife ich hier auf die ArrayList zu? Hab vielleicht nur ein Brett vorm Kopf, aber das bereitet mir gerade irgendwie Kopf zerbrechen :)
 

xerion21

Mitglied
Vielen Dank für die Antworten! Darauf bin ich echt nicht gekommen. Nochmals: Danke. Ich habe nun eine neue Klasse "Books" angelegt mit getter und setter für isbn, likes und comment und den Construktor.

Auch habe ich wie oben von xerion beschrieben, dass ganze mit der ArrayList realisiert. Meine Frage jetzt: Ich rufe die Methode über den Button auf. Doch wie rufe ich die einzelne Datensätze auf?
Ich denke da an...

einen Iterator bzw. die Liste mit while(buecherliste.hasNext) { jtextfield.set... }

durchzugehen.

Doch wenn ich die Methode aufrufe, wie greife ich hier auf die ArrayList zu? Hab vielleicht nur ein Brett vorm Kopf, aber das bereitet mir gerade irgendwie Kopf zerbrechen :)

Hi, du kannst das Arraylist die Items ausgeben lassen mit:
Java:
buecherliste.get(//parameter);
 

JIZZES

Mitglied
hallo xerion,

wenn ich das so mache wie du oben erwähnst, will er in der get Methode ein int, ansonsten geht da nichts- oder soll das ein Beispiel sein? Ich poste am besten meinen Code:

Java:
static void next(String user) {
        try {
            GlobalDBVars.st = GlobalDBVars.v_connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            GlobalDBVars.rs = GlobalDBVars.st.executeQuery("SELECT * FROM USERBOOKS WHERE EMAIL = '" + user + "'");
            
            while(GlobalDBVars.rs.next()) {

                
                
                 book = new Books();
                 book.setComment(GlobalDBVars.rs.getString("comment"));
                 book.setIsbn(GlobalDBVars.rs.getString("isbn"));
                 book.setLike(GlobalDBVars.rs.getString("like"));
                 bookList.add(book);

Die ArrayList ist Static und ausserhalb.

Java:
 private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        UserBooks.next(jTextField1.getText());
        UserBooks.bookList.get(WIDTH); // hier will er ein int
        
        jTextField2.setText(GlobalDBVars.isbn);
        jTextField3.setText(GlobalDBVars.likes);
        jTextField4.setText(GlobalDBVars.comment);
    }

habe es probiert, den INT in ein String umzuwandeln. Funktioniert aber so nicht. irgendwelchen weitere Tipps?
 

xerion21

Mitglied
Java:
 private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        UserBooks.next(jTextField1.getText());
        UserBooks.bookList.get(WIDTH); // hier will er ein int
        
        jTextField2.setText(GlobalDBVars.isbn);
        jTextField3.setText(GlobalDBVars.likes);
        jTextField4.setText(GlobalDBVars.comment);
    }

habe es probiert, den INT in ein String umzuwandeln. Funktioniert aber so nicht. irgendwelchen weitere Tipps?

was entspricht denn der Variable WIDTH? Die ArrayList erwartet von dir ein int für den angegeben Platz des Elements in der ArrayList. Das heißt wenn du 3 Bücher hast, kannst du die Werte 0-2 eingeben. Du kannst auch, wenn es dir einfacher fällt die ArrayList in ein Array mit
Java:
UserBooks.bookList.toArray()
umwandeln.
 

JIZZES

Mitglied
naürlich!
theoretisch sollte doch auch

UserBooks.bookList.get(UserBooks.booList.size());

funktionieren! Ich werde es mal ausprobieren :D
 

JIZZES

Mitglied
vergiss das oben. hab völligen quark geschrieben. Sorry tut mir leid, bin seit Monaten aus der Übung und sehe offentsichtlich vor lauter Bäumen den Wald kaum.
 

xerion21

Mitglied
vergiss das oben. hab völligen quark geschrieben. Sorry tut mir leid, bin seit Monaten aus der Übung und sehe offentsichtlich vor lauter Bäumen den Wald kaum.

kein problem :D hast du die Lösung nun?

einfach mit einer Schleife auslesen:
Java:
for(int i = 0; i < booklist.size(); i++) {
  booklist.get(i);
}
 
Zuletzt bearbeitet:

JIZZES

Mitglied
hm nicht wirklich. habe meinen Code nochmal neu geschrieben und es anderst probiert:

Java:
static void next(String user) {
       
       try {
            GlobalDBVars.st = GlobalDBVars.v_connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            GlobalDBVars.rs = GlobalDBVars.st.executeQuery("SELECT * FROM USERBOOKS WHERE EMAIL = '" + user + "'");
            
            if (GlobalDBVars.rs!= null) {
                
            
            if(GlobalDBVars.rs.next()==false) {
                System.err.println("Konsole: keine Bücher vorhanden");
                }else {
                
                GlobalDBVars.isbn = GlobalDBVars.rs.getString("ISBN");
                GlobalDBVars.likes = GlobalDBVars.rs.getString("GEFALLEN");
                GlobalDBVars.comment = GlobalDBVars.rs.getString("KOMMENTAR");
            
                
                System.out.println(GlobalDBVars.rs.getString("ISBN")); 
                System.out.println(GlobalDBVars.rs.getString("GEFALLEN"));
                System.out.println(GlobalDBVars.rs.getString("KOMMENTAR")); 
                
                bookList.add(book); // ohne das hinzufügen spuckt er mir alle Bücher von User xyz im SysOut aus
                
                GlobalDBVars.rs.next();
                
            
                
                while(GlobalDBVars.rs.isAfterLast()==false);      
                 }
            }
       }
         catch (SQLException ex) {
            System.err.println("Konsole: Keine Bücher vorhanden " + ex.getMessage());
         }

   }

Beim Aufruf:

Java:
  private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        UserBooks.next(jTextField1.getText());
        for (int i = 0; i < bookList.size(); i++) {
            bookList.get(i);
        jTextField2.setText(GlobalDBVars.isbn);
        jTextField3.setText(GlobalDBVars.likes);
        jTextField4.setText(GlobalDBVars.comment);        
}
                        
        
        
                        
    }

sieht es so aus. Führe ich den Code so aus, hängt sich das Programm auf, sobald ich einmal auf next drücke und ich weiß nicht woran das liegt. Irgendwo muss er nun hängen :/ Meine Vermutung: hängt mit der for schleife zusammen.
Es sollte so funktionieren, dass ich mit jedem "next" Klick das nächste Buchobjekt aufrufe. Es ist zum Haare raufen :'(
 

CptSocket

Aktives Mitglied
Hallo

Das liegt ziemlich sicher an folgender Stelle:
Java:
while(GlobalDBVars.rs.isAfterLast()==false);      
}
=> Da wartest du, bis ein Ereignis eintritt, aber während dem Warten änderst du nichts am Resultset => Deadlock

Was mir noch aufgefallen ist:

Vor dem while-Loop machst du
Java:
GlobalDBVars.rs.next();
Was ist der Zweck von dieser Zeile? Ich würde mal tippen, dass du damit beim wiederholten Aufruf jedesmal eine Zeile überspringst (da im if ganz am Anfang auch schon auf den nächsten Datensatz navigiert wird).

Die Methode kann so wie du sie implementiert hast aber nicht funktionieren, respektive sie wird immer den ersten Datensatz zurückliefern: Auf Zeile 4/5 erstellst du ein neues Statement / setzt ein neues query ab. Du müsstest das Resultset zwischenspeichern und beim nächsten Aufruf der Methode mit dem bestehenden Resultset weiterarbeiten.

Die Enge Kopplung von Gui und Datenbank halte ich ehrlich gesagt nicht für eine gute Idee (wie auch das Verwenden von static und 'globalen Variablen'). Meine Empfehlung wäre: Lade alle Datensätze und gib sie an's Gui weiter. Im Gui kannst du dann per Button über die Datensätze Iterieren (wieso stellst du nicht alle in einer Tabelle dar?). Wenn du wirklich per button-Klick über die Datenbank iterieren musst, würde ich das in einem Objekt kapseln.


Freundliche Grüsse
CptSocket
 

JIZZES

Mitglied
Hallo

Das liegt ziemlich sicher an folgender Stelle:
Java:
while(GlobalDBVars.rs.isAfterLast()==false);      
}
=> Da wartest du, bis ein Ereignis eintritt, aber während dem Warten änderst du nichts am Resultset => Deadlock

Was mir noch aufgefallen ist:

Vor dem while-Loop machst du
Java:
GlobalDBVars.rs.next();
Was ist der Zweck von dieser Zeile? Ich würde mal tippen, dass du damit beim wiederholten Aufruf jedesmal eine Zeile überspringst (da im if ganz am Anfang auch schon auf den nächsten Datensatz navigiert wird).

Die Methode kann so wie du sie implementiert hast aber nicht funktionieren, respektive sie wird immer den ersten Datensatz zurückliefern: Auf Zeile 4/5 erstellst du ein neues Statement / setzt ein neues query ab. Du müsstest das Resultset zwischenspeichern und beim nächsten Aufruf der Methode mit dem bestehenden Resultset weiterarbeiten.

Die Enge Kopplung von Gui und Datenbank halte ich ehrlich gesagt nicht für eine gute Idee (wie auch das Verwenden von static und 'globalen Variablen'). Meine Empfehlung wäre: Lade alle Datensätze und gib sie an's Gui weiter. Im Gui kannst du dann per Button über die Datensätze Iterieren (wieso stellst du nicht alle in einer Tabelle dar?). Wenn du wirklich per button-Klick über die Datenbank iterieren musst, würde ich das in einem Objekt kapseln.


Freundliche Grüsse
CptSocket

Hallo CptSocket,

in Zeile 29 setze ich mit next() den Cursor auf den nächsten Datensatz. Wenn ich mit Sysout Arbeite, spuckt er mir in der Konsole a lle Bücher von User xy aus. Will ich die Bücher jedoch in der ArrayList abspeichern, hängt sich das komplette Programm auf.

Wie meinst du das mit Query Zwischenspeichern? Meinst du damit, dass ich das im If Statement schreiben muss? Ich komme von der VBA Programmierung und hab seit Ewigkeiten nicht mehr in Java programmiert. Tut mir leid, wenn ich mich in manchen Sachen doch etwas dämlich anstelle.
 

CptSocket

Aktives Mitglied
Hallo

Du rufst next() aber zweimal auf! Einmal in der if-Bedingung und dann nochmals innerhalb vom if. Das ist nicht richtig - das eine mal in der if-Bedingung reicht, damit wird schon der nächste Datensatz gelesen.

Was heisst hängt sich das Programm auf? Wird eine Exception geworfen (was für eine?) oder blockiert das Programm?

In folgender Zeile fügst du ein buch einer Liste hinzu:
Java:
bookList.add(book);
Drei Fragen dazu:
1. Wird die Liste initialisiert?
2. Wo wird eine neue Instanz von book erstellt?
3. Für was brauchst du die GlobalDBVars iban, likes und comment? Diese Attribute sollen im Objekt book gespeichert werden.


Freundliche Grüsse
CptSocket
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T MAX und ResultSet#next Datenbankprogrammierung 10
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben