MySQL ResultSet vollständig auslesen

Llois41

Mitglied
Hallo,

ich habe folgendes Problem: Ich möchte per Abfrage alle dazu passenden Datensätze auslesen und in ein Nutzer-Array ("Nutzer" ist ein eigener Datentyp mit verschiedenen Attributen, bspw. Name, Vorname, Geb.Dat etc.) speichern.

Nun bekomme ich aber leider alle Daten nur 3-fach ausgelesen, habe mir sogar einen Counter gesetzt, der auch das 3-fache an Ausgaben zählt, wie eigentlich nur möglich sind (Nutzer-Array ist auf 50 Einträge beschränkt).
Zudem wird immer nur ein Nutzer mehrmals ausgegeben, obwohl mehrere Nutzer auf meine Testabfrage passen müssten.

Anbei mein Code, vielleicht sieht ja jemand den Fehler:
Java:
public Suchanfrage suchen(Suchanfrage s){
        try{
         
            con.setReadOnly(true);
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM nutzer WHERE ichWillLernen LIKE UPPER('"+s.getParameterIchKann()+
                    "') AND ichSpreche LIKE UPPER('"+s.getParameterIchLerne()+"') ");
            int countResults = 0;
             
            while(rs.next())
            {
                   
                for(int i = 0;i < s.getSuchergebnisse().length; i++)
                {
                  
                    String datum = rs.getString(5);
                    String[] zahlenString = datum.split("\\.");
                    int tag=Integer.parseInt(zahlenString[0]);
                    int monat=Integer.parseInt(zahlenString[1]);
                    int jahr=Integer.parseInt(zahlenString[2]);
                 
                    Nutzer n = new Nutzer(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),
                            new Datum(tag,monat,jahr),rs.getString(6), rs.getString(7),rs.getString(8),
                            rs.getString(9).split(","),rs.getString(10),null,null,null);
             
                    s.getSuchergebnisse()[i] = n;
                    countResults ++;
                    
                }
               
                    }
               
            rs.close();
            stmt.close();
            con.close();
            System.out.println(countResults);
            //System.out.println(s);
           
            for(int j = 0; j<s.getSuchergebnisse().length; j++)
            {
                System.out.println(s.getSuchergebnisse()[j]);
            }
           
            return s;
           
        }catch(Exception e){
            System.out.println("****Fehlermeldung**** ->"+e);
            return null;
        }
 
Zuletzt bearbeitet von einem Moderator:
Der erste Teil soll alle Ergebnisse anzeigen, die die Anfrage erfüllen, die sind ja dann nach meinem Verständnis alle im ResultSet, und über die Schleife versuche ich diese auszulesen. Leider weiß ich nicht genau wie ich das hinbekomme.

Den zweiten Teil muss ich natürlich ändern, da erstelle ich jetzt erst ein Nutzer-Array, welches zum Schluss über die set-Methode in den Suchergebnissen gespeichert wird.
 
Funktioniert leider auch nicht, er springt einfach nicht in die nächste Zeile des ResultSets, ich habe es schon mit rs.absolute(i+1) probiert, allerdings funktioniert das auch nicht, bin gerade leicht am verzweifeln, dabei ist es bestimmt nur eine Zeile die Fehlt 😀

Aktuell sieht der Code nun so aus:

Java:
public Suchanfrage suchen(Suchanfrage s){
        try{
           
            con.setReadOnly(true);
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM nutzer WHERE ichWillLernen LIKE UPPER('"+s.getParameterIchKann()+
                    "') AND ichSpreche LIKE UPPER('"+s.getParameterIchLerne()+"') ");
            int countResults = 0;
            Nutzer [] results = new Nutzer [s.getSuchergebnisse().length];
            
            for(int i = 0; i < s.getSuchergebnisse().length && rs.next(); i++)
            {
                String datum = rs.getString(5);
                String[] zahlenString = datum.split("\\.");
                int tag=Integer.parseInt(zahlenString[0]);
                int monat=Integer.parseInt(zahlenString[1]);
                int jahr=Integer.parseInt(zahlenString[2]);
                   
                Nutzer n = new Nutzer(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),
                        new Datum(tag,monat,jahr),rs.getString(6), rs.getString(7),rs.getString(8),
                        rs.getString(9).split(","),rs.getString(10),null,null,null);
           
                results[i] = n;
                countResults ++;
                
                    }
            s.setSuchergebnisse(results);    
            rs.close();
            stmt.close();
            con.close();
            System.out.println(countResults);
 
ich würde es mal mit einer while Schleife
Java:
while(rs.next()){
    // do it...
}
versuchen

Ich habe es sowohl mit einer while-Schleife, als auch mit einer äquivalenten for-Schleife versucht, als Ausgabe bekomme ich weiterhin leider nur einen Datensatz n-mal angezeigt, wobei n für die Anzahl der Treffer steht.

Über rs.getRow() lasse ich mir bei jedem Durchlauf nun die Reihe anzeigen, und siehe da, er zählt die von 1 bis n auch hoch, lediglich die Daten aus den Reihen werden nicht geladen, ich erhalte immer nur einen Datensatz.
 
schon mal kontolliert wie groß das array ist?

warum nimmst du keine List?

Das Array ist 50 Felder groß und die Schleife wird auch nur n-Mal durchlaufen, in den anderen Zeilen in der Ausgabe steht "null".

Ich würd mal mit einem sql viewer deine Tabelle ansehen, was da drinnen steht.


In den ersten n Ausgaben jedoch leider n-mal das gleiche, dabei sind auch n passende Datensätze drin, allerdings wird nur der neueste Eintrag ausgegeben.
 
Ok ich lasse mir nun in jedem Schleifendurchlauf den Datensatz ausgeben, und diese sind alle richtig und auch unterschiedlich. Nachdem ich die von dem temporären Array (results[]) in das Array des Objekts gespeichert habe und mir das nach der Schleife ausgeben lasse, gibt er wieder nur den letzten Eintrag aus...
 
Poste die Klasse Nutzer mal... ich hab da so einen Verdacht.
Java:
public class Nutzer
{
    //Variablendeklaration
    private static String vorname;
    private static String name;
    private static String bezirk;
    private static String geschlecht;
    private static Datum geburtsdatum;
    private static String ichSpreche;
    private static String ichWillLernen;
    private static String[] freizeitAktivitäten;
    private static String sonstigeInfos;
    protected static String mail;
    private static char[] passwort;
    private static Match [] alleMatches = new Match[10];
    private static Suchanfrage [] alleSuchanfragen = new Suchanfrage[10];
  
    //Konstruktor
    public Nutzer(String vorname, String name, String geschlecht, String bezirk, Datum geburtsdatum, String ichSpreche,
            String ichWillLernen, String sonstigeInfos, String[] freizeitAktivitäten, String mail, char[] passwort, Match[] alleMatches, Suchanfrage[] alleSuchanfragen)
    {
        Nutzer.vorname = vorname;
        Nutzer.name = name;
        Nutzer.geschlecht = geschlecht;
        Nutzer.geburtsdatum = geburtsdatum;
        Nutzer.bezirk = bezirk;
        Nutzer.ichSpreche = ichSpreche;
        Nutzer.ichWillLernen = ichWillLernen;
        Nutzer.freizeitAktivitäten = freizeitAktivitäten;
        Nutzer.sonstigeInfos = sonstigeInfos;
        Nutzer.mail = mail;
        Nutzer.passwort = passwort;
//        this.alleMatches = alleMatches;
//        this.alleSuchanfragen = alleSuchanfragen;
    }

    //Methoden
  
//    public void ErzeugeNutzer(Nutzer n){
//        addNutzer(n);
//    }

  
    public Nutzer(char[] passwort2, String mail2) {
        // TODO Automatisch generierter Konstruktorstub
    }

    @Override
    public String toString() {
        return "('"+ vorname + "','"+name+"','"+geschlecht+"','"+bezirk+"','"+geburtsdatum+
                "','"+ichSpreche+"','"+ichWillLernen+"','"+sonstigeInfos+"','"+Arrays.toString(freizeitAktivitäten)+"','"+mail+"','"+Arrays.toString(passwort)+"','"
                +alleMatches+"','"+alleSuchanfragen+"')";  
      
//        return "Nutzer [vorname=" + vorname + ", name=" + name + ", bezirk=" + bezirk + ", geschlecht=" + geschlecht
//                + ", geburtsdatum=" + geburtsdatum + ", ichSpreche=" + ichSpreche + ", ichWillLernen=" + ichWillLernen
//                + ", freizeitAktivitäten=" + Arrays.toString(freizeitAktivitäten) + ", sonstigeInfos=" + sonstigeInfos
//                + ", mail=" + mail + ", passwort=" + passwort + ", alleMatches=" + Arrays.toString(alleMatches)
//                + ", alleSuchanfragen=" + Arrays.toString(alleSuchanfragen) + "]";
    }

    public static String getVorname() {
        return vorname;
    }

    public static void setVorname(String vorname) {
        Nutzer.vorname = vorname;
    }

    public static String getName() {
        return name;
    }

    public static void setName(String name) {
        Nutzer.name = name;
    }

    public static String getBezirk() {
        return bezirk;
    }

    public static void setBezirk(String bezirk) {
        Nutzer.bezirk = bezirk;
    }

    public static String getGeschlecht() {
        return geschlecht;
    }

    public static void setGeschlecht(String geschlecht) {
        Nutzer.geschlecht = geschlecht;
    }

    public static Datum getGeburtsdatum() {
        return geburtsdatum;
    }

    public static void setGeburtsdatum(Datum geburtsdatum) {
        Nutzer.geburtsdatum = geburtsdatum;
    }

    public static String getIchSpreche() {
        return ichSpreche;
    }

    public static void setIchSpreche(String ichSpreche) {
        Nutzer.ichSpreche = ichSpreche;
    }

    public static String getIchWillLernen() {
        return ichWillLernen;
    }

    public static void setIchWillLernen(String ichWillLernen) {
        Nutzer.ichWillLernen = ichWillLernen;
    }

    public static String[] getFreizeitAktivitäten() {
        return freizeitAktivitäten;
    }

    public static void setFreizeitAktivitäten(String[] freizeitAktivitäten) {
        Nutzer.freizeitAktivitäten = freizeitAktivitäten;
    }

    public static String getSonstigeInfos() {
        return sonstigeInfos;
    }

    public static void setSonstigeInfos(String sonstigeInfos) {
        Nutzer.sonstigeInfos = sonstigeInfos;
    }

    public static String getMail() {
        return mail;
    }

    public static void setMail(String mail) {
        Nutzer.mail = mail;
    }
  
    public static char[] getPasswort() {
        return passwort;
    }

    public static void setPasswort(char[] passwort) {
        Nutzer.passwort = passwort;
    }

    public static Match[] getAlleMatches() {
        return alleMatches;
    }

    public static void setAlleMatches(Match[] alleMatches) {
        Nutzer.alleMatches = alleMatches;
    }

    public static Suchanfrage[] getAlleSuchanfragen() {
        return alleSuchanfragen;
    }

    public static void setAlleSuchanfragen(Suchanfrage[] alleSuchanfragen) {
        Nutzer.alleSuchanfragen = alleSuchanfragen;
    }

}
 
STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC STATIC

Google das doch mal!

PS: Poste doch Code in Code-Tags [code=java]//JAVA CODE HERE[/code]
 
Öhm gute Frage, wir arbeiten zu 2. daran und ich glaube, das war für eine andere Methode wichtig, wüsste aber gerade nicht genau was...
Aber über
Java:
//System.out.println(results[i]);
bekomme ich in jedem Durchlauf das richtige ausgegeben, lediglich bei der Ausgabe am Ende
Java:
//
s.setSuchergebnisse(results);   
           
            System.out.println("Es wurden " + countResults + " passende Einträge gefunden!");
           
            for(int j = 0; j<s.getSuchergebnisse().length; j++)
            {
                System.out.println(s.getSuchergebnisse()[j]);
            }
bekomme ich nur den gleichen Datensatz angeziegt...
 
Aber wieso bekomme ich dann über
Java:
System.out.println(results[i]);
die richtigen Objekte ausgegeben, ist dann der Fehler nicht beim Speichern des einen Arrays in das andere?
 
Habe eine Lösung gefunden, Nutzer ist jetzt nicht mehr static, hat aber ein statisches Attribut, welches den aktuellen Nutzer anzeigt. Ist nicht die schönste Lösung, aber es funktioniert. 😀
Danke für die Hilfe!
 

Zurück
Oben