ResultSet ist leer?

JumpFrog

Mitglied
Hey Leute,


ich habe mein kleines Problem.

Ich habe eine Tabelle von einer Datenbank. Wie die Aussieht könnt ihr im Anhang sehen. Dabei sind alle Integerwerte wie 1 0 2 etc. Fremdschlüsselbeziehungen zu anderen Tabellen.

Ich möchte jetzt jeden Datensatz mit meinem Java Programm einlesen und Speichern.

So sieht mein Momentaner Stand aus:

Code:
public void loadKurs() {
		try {
			Statement stmt = con.createStatement();
			
			int i = 1;
			ResultSet rs = stmt.executeQuery("SELECT * FROM Kurs");
			Connection con2 = connection.createConnection();
			Statement stmt2 = con2.createStatement();
			
			ResultSet rs2;
			
			while (rs.next()) {
				System.out.println(rs.getString(1)+ " - " + rs.getString(2));
				KursInfo kurs = new KursInfo();
				kurs.setKursID(i - 1);
				rs2 = stmt2.executeQuery("SELECT Name FROM Typ WHERE "
						+ rs.getInt(2) + "= TypID");
				kurs.setTyp(rs2.getString(2));
				System.out.println("SELECT Typ FROM Zyklus WHERE "
						+ "ZyklusID = " + rs.getInt(3));
				rs2 = stmt2.executeQuery("SELECT Typ FROM Zyklus WHERE "
						+ "ZyklusID = " + rs.getInt(3));
				System.out.println(rs2.getString(1));
				kurs.setZyklus(rs2.getString(1));
				rs2 = stmt2.executeQuery("SELECT Typ FROM Wiederholung WHERE "
						+ rs.getInt(4) + "= Wiederholung");
				kurs.setWiederholung(rs2.getString(1));
				rs2 = stmt2.executeQuery("SELECT Name FROM Wochentag WHERE "
						+ rs.getInt(5) + "= WochentagID");
				kurs.setWochentag(rs2.getString(1));
				rs2 = stmt2.executeQuery("SELECT Von FROM Time WHERE "
						+ rs.getInt(6) + "= TimeID");
				kurs.setTimeVon(rs2.getString(1));
				kurs.setTimeBis(rs2.getString(2));
				rs2 = stmt2.executeQuery("SELECT Name FROM Modul WHERE "
						+ rs.getInt(7) + "= ModulID");
				kurs.setModulID(rs.getString(7));
				rs2 = stmt2
						.executeQuery("SELECT Kurzbeschreibung FROM Aufgaben WHERE "
								+ rs.getInt(8) + "= AufgabenID");
				kurs.setHaus(rs.getString(8));
				kurs.setZimmer(rs.getInt(9));
				kurse.put(kurs.getKursID(), kurs);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Was habe ich alles schon versucht? :
  • 2 Abfragen über 1 con Objekt
  • 1 Abfrage über 1 Con objekt und neue Abfrage über 2 Con Objekt

Eigentlich bin ich ja kein Freund von direkten Lösungen, aber Aufgrund des enormen Zeitmangels im Moment wäre es toll wenn jemand schon fertigen Beispiel Code hat den ich nur noch an mein Beispiel umschreiben muss und der dann Funktioniert.

Ich weiß nicht ob euch das was ihr da an Quellcode seht reicht. Falls nicht schreibt einfach was Unklar ist :)

Achso hier noch die Exception:

com.microsoft.sqlserver.jdbc.SQLServerException: Das Resultset verfügt über keine aktuelle Zeile.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetHasCurrentRow(SQLServerResultSet.java:456)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(SQLServerResultSet.java:1946)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:1981)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getValue(SQLServerResultSet.java:1966)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getString(SQLServerResultSet.java:2291)
at de.fh.zwickau.querys.Kurs.loadKurs(Kurs.java:83)
at de.fh.zwickau.querys.Kurs.<init>(Kurs.java:35)
at de.fh.zwickau.Start.startup(Start.java:70)
at de.fh.zwickau.Start.<init>(Start.java:39)
at de.fh.zwickau.Start.<clinit>(Start.java:24)

Zeile 83 in der Methode loadKurs wäre bei dem hier die Zeile 18



Danke

LG JumpFrog

PS: über die Vorteilhafte und gute Java Programmierung brauchen wir glaube ich nicht reden. Den das ist nur Prüfungsvorleistung, dabei spielt es keine Rolle wie es am ende Implementiert ist und ob da auch auf gute Performance geachtet wurde. Es soll einfach nur die Kriterien erfüllen.
 

Anhänge

  • datenbank.jpg
    datenbank.jpg
    18,1 KB · Aufrufe: 18
Moin ^^

Sag mal, wie weit reichen deine Kenntnisse im Umgang mit Datenbanken? Das mit den Connections und Statements lass ich mal außen vor, aber die Art der Verarbeitung ist ja mal krass. Das wäre mit ein paar Joins in einem Query getan und sicherlich auch schonender für das System.
 
Moin,

kurz und knapp, das ist das erste mal das ich etwas mit Datenbanken programmiere und wie schon gesagt gibt es sicherlich bessere Lösungsmöglichkeiten. Hätte ich die Zeit würde ich darauf auch achten. Doch die habe ich nicht. Somit muss es mit schlechter Programmierung auch gehen.

Zumal es nur ein paar Funktionen haben muss und dann in die Tonne getreten wird.
 
Naja, es ist recht einfach zu sehen, was das Problem ist:

Java:
                rs2 = stmt2.executeQuery("SELECT Name FROM Typ WHERE "
                        + rs.getInt(2) + "= TypID");
                kurs.setTyp(rs2.getString(2));

Du selektierst eine Spalte aus der Tabelle Typ, möchtest aus dem Ergebnis aber Spalte 2 haben, um es in dein Pojo zu legen.
 
Hey saftmeister,

wie Recht du doch hast.
Ich hab es in :

Code:
kurs.setTyp(rs2.getString(1));

weiter

geändert. Die Exception besteht aber weiterhin.
 
Vielleicht habe ich es überlesen, aber was wird denn in der Zeile 13 also hier ausgegeben?

Java:
System.out.println(rs.getString(1)+ " - " + rs.getString(2));

Und vor allem: Eine ID, die 0 ist, ist eigentlich keine ID. Sinnvoller wäre es außerdem, wenn man im Query in der WHERE-Kondition erst die Spalte und dann den Operanden einsetzt:

Java:
                System.out.println(rs.getString(1)+ " - " + rs.getString(2));
                KursInfo kurs = new KursInfo();
                kurs.setKursID(i - 1);
                rs2 = stmt2.executeQuery("SELECT Name FROM Typ WHERE "
                        "TypID = " + rs.getInt(2));
 
Also der Sysout gibt die ersten 2 Spalten von Kurs wieder (siehe 1 Post im Anhang).

Ok, das mit der 0 klingt irgendwie einleuchtend. :)

Ich habe es so gedreht wie du (natürlich mit dem fehlenden Plus nach Where ") und trotzdem kommt nach wie vor die selben Fehlermeldung :(
 
Hast du mal versucht, den Query in einer anderen Applikation (also der, mit der du den Inhalt im Screenshot) auszuführen? Was mir auch aufgefallen ist: In der Sysout-Zeile gibst du rs.getString() aus, im Query verwendest du aber getInt(). Welchen Daten-Typ hat die Spalte "TypID" in der Tabelle Typ eigentlich und welchen Daten-Typ hat die Spalte "Typ" in der Tabelle Kurs?
 
Ich habe den Befehl direkt im SQLServer getestet und auch ein seperates Programm hat nichts anderes gemacht als diesen Befehl ausgeführt und da hat es ohne Probleme Funktioniert. Die Abfrage stimmt also.

Ob es nun rs.getString() oder rs.getInt() ist spielt keine Rolle. Ich habe gerade eine als String gespeicherte Variable mit rs.getInt() ausgelesen und weder das Programm ist abgestürzt noch gab es irgend welche anderen Anzeichen.

Ich hatte ja am Anfang das bedenken das er vielleicht Probleme damit hat, das ich immer auf 1 Connection Objekt zugreife. Deswegen habe ich ein neues erzeugt. Doch auch da geht es nicht. Somit bleibt mir Momentan nur die Erklärung das ich in der while(rs.next) {} Schleife nicht noch ein ResultSet erstellen kann bzw. befüllen kann.

Datentypen:
TypID: int (Tabelle Typ)
Typ: int (Tabelle Kurs)


SOLVE:

Es lag daran das der Coursor von rs2 nicht auf das erste element gezeigt hat. Somit muss wie bei rs immer noch eine schleife drum rum... damit der courser gesetzt wird.
 
Zuletzt bearbeitet:
Zurück