# Problem mit JDBC-Abfrage



## Sinfony (11. Mai 2014)

Hallo,

habe eine Frage zu meiner Hausaufgabe. Es geht darum, dass bestimmte Ordnungen für eine Ausleihe eines Mediums in einer Bibliothek geprüft werden. Das Programm durchläuft dann diverse Testfälle und spielt dafür Testdaten ein. Mein Problem ist nun, dass sich mein Programm scheinbar innerhalb der Methode etwas aufhängt und mir ständig "Maximale Anzahl von 15 Ausleihen erreicht!" auf der Konsole ausgibt, jedoch ist dies nur in einem einzigen Testfall so. Allerdings gibt er mir dies auch in den anderen Testfällen aus und ich weiß nicht warum :shock: 
Wenn ich die Abfrage der maximalen Leihen auskommentiere, dann erhalte ich den Fehler, dass ein Schlüsselwort fehlt. Für mich ergibt das einfach keinen Sinn. Würde mich über eine schnelle Hilfe bzw Denkanstoß freuen. Die besagte Methode ist unterhalb meines Post zu finden. Vielen Dank




Spoiler



private boolean pruefeOrdnungen(String ausweisNr, Long signatur, Connection c) 
			throws SQLException, ExemplarUnlendableException, ExemplarUnavailableException {
		boolean ausleihbar = true;
		PreparedStatement s;

		//Ausleihbare Medienarten
		try {
			s = c.prepareStatement("SELECT Signatur From Medium m "
					+ "INNER JOIN Medienart ma ON ma.martid = m.martid "
					+ "WHERE m.Signatur = ? "
					+ "AND ma.Martbezeichnung = 'Zeitschrift' "
					+ "OR ma.Martbezeichnung = 'Lose-Blatt-Sammlung' "
					+ "OR ma.Martbezeichnung = 'Technische Norm' "
					+ "OR ma.Martbezeichnung = 'Firmenschrift' ");
			s.setLong(1, signatur);
			ResultSet r = s.executeQuery();
			if (r.next()){
				ausleihbar = false;
				System.out.println("Diese Medienart ist nicht ausleihbar!");
				throw new ExemplarUnlendableException();
			}
		}catch(SQLException exp){
		}

		//Mehrfachausleihe des selben Exemplares
		try {
			s = c.prepareStatement("SELECT n.ausweisnr FROM Nutzer n "
					+ "INNER JOIN Ausleihe a ON a.ausweisnr = n.ausweisnr "
					+ "INNER JOIN Exemplar e ON a.exemplarID = e.exemplarID "
					+ "INNER JOIN Medium m ON m.signatur = e.signatur "
					+ "WHERE m.signatur = ? "
					+ "AND a.ausweisnr = ? "
					+ "AND a.tatsaechliches_rueckgabedatum IS NULL ");
			s.setLong(1, signatur);
			s.setString(2, ausweisNr);
			ResultSet r1 = s.executeQuery();
			if (r1.first()){
				ausleihbar = false;
				System.out.println("Mehrfachausleihe desselben Exemplares ist nicht gestattet!");
				throw new ExemplarUnlendableException();
			}
		}catch(SQLException exp){
		}

		//maximale Ausleihen von Mitarbeitern etc
		try {
			s = c.prepareStatement("SELECT a.ausweisnr FROM Nutzer n "
					+ "INNER JOIN Nutzerart na ON na.nartid = n.nartid "
					+ "INNER JOIN Ausleihe a ON n.ausweisnr = a.ausweisnr "
					+ "WHERE na.nartbezeichnung = 'Student' "
					+ "OR na.nartbezeichnung = 'Professor' "
					+ "OR na.nartbezeichnung = 'Akadem. Mitarbeiter' "
					+ "AND a.ausweisnr = ? "
					+ "GROUP BY a.ausweisnr "
					+ "HAVING COUNT (a.erwartetes_rueckgabedatum) >= 15 ");
			s.setString(1, ausweisNr);
			ResultSet r2 = s.executeQuery();
			if (r2.next()){
				ausleihbar = false;
				System.out.println("Maximale Anzahl von 15 Ausleihen erreicht!");
				throw new ExemplarUnlendableException();
			}
		}catch(SQLException exp){
		}

		//Maximale Ausleihen Fremder
		try {
			s = c.prepareStatement("SELECT a.ausweisnr FROM Nutzer n "
					+ "INNER JOIN Nutzerart na ON na.nartid = n.nartid "
					+ "INNER JOIN Ausleihe a ON n.ausweisnr = a.ausweisnr "
					+ "WHERE na.nartbezeichnung != 'Student' "
					+ "AND na.nartbezeichnung != 'Professor' "
					+ "AND na.nartbezeichnung != 'Akadem. Mitarbeiter' "
					+ "GROUP BY a.ausweisnr "
					+ "HAVING COUNT (a.erwartetes_rueckgabedatum) >= 10 ");
			ResultSet r3 = s.executeQuery();
			if (r3.next()){
				ausleihbar = false;
				System.out.println("Maximale Anzahl von 10 Ausleihen erreicht!");
				throw new ExemplarUnlendableException();
			}
		}catch(SQLException exp){
		}

		//Mahnstufe
		try {
			s = c.prepareStatement("SELECT a.ausweisnr FROM Mahnstufe ms "
					+"INNER JOIN Ausleihe a ON ms.mahnid = a.mahnid "
					+"INNER JOIN Nutzer n ON a.ausweisnr = n.ausweisnr "
					+"WHERE a.ausweisnr = ? "
					+"AND ms.mahnid = 3 "
					+"AND a.tatsaechliches_rueckgabedatum IS NULL ");
			s.setString(1, ausweisNr);
			ResultSet r4 = s.executeQuery();
			if (r4.next()){
				ausleihbar = false;
				System.out.println("Keine Ausleihe während Mahnverfahren möglich!");
				throw new ExemplarUnlendableException();
			}
		}catch(SQLException exp){
		}
		return ausleihbar;
	}


----------



## turtle (11. Mai 2014)

Bitte nutze 
	
	
	
	





```

```
 tags für deinen Code.

Auf den ersten schnellen Blick sehe ich nicht, das du ResultSet oder PreparedStatements löscht.

Ich empfehle mal sich das JDBC-Tutorial anzuschauen und insbesondere wie in finally-Blöclen aufgeräumt wird.


----------



## Sinfony (11. Mai 2014)

Danke erstmal. Habe ja immer andere Bezeichner dafür genommen, ist es dann nicht egal, ob ich sie schließe/lösche?
Also habe jetzt alles danach einmal fein säuberlich geschlossen, allerdings bleibt das Resultat dasselbe.

Das hier ist meine Konsolen-Ausgabe:


Spoiler



Maximale Anzahl von 15 Ausleihen erreicht!

Der Nutzer existiert nicht!

Maximale Anzahl von 15 Ausleihen erreicht!

Diese Medienart ist nicht ausleihbar!

Maximale Anzahl von 15 Ausleihen erreicht!

Maximale Anzahl von 15 Ausleihen erreicht!

Maximale Anzahl von 15 Ausleihen erreicht!



er gibt mir ja einmal für den richtigen Testfall aus, dass die gewünschte Medienart nicht ausleihbar ist. Für die restlichen Testfälle greift er jedoch immer auf die 15 Ausleihen zurück. Dabei ist in der Datenbank lediglich ein Nutzer der diese Anzahl erreicht hat und in den anderen Testfällen leiht nicht dieser Nutzer die Exemplare aus. Bin echt am verzweifeln ;(


----------



## turtle (12. Mai 2014)

> ist es dann nicht egal, ob ich sie schließe/lösche?


Nein, ist es (natürlich) nicht, denn schliesslich bindest du Resourcen in der DB, die letztendlich zu Problemen führen kann. Daher ist mein Rat immer sich nicht (mehr) mit JDBC zu befassen, sondern eine gut getestete etablierte Lösung aufzusetzen, die dies erledigt. Da ich mal einen Blog zum Thema myBATIS darfst du raten, welches Framework ich empfehle?

Als nächstes würde ich deine Methode pruefeOrdnungen in mehrere kleinere Methoden teilen, denn deine ist VIEL zu lang. 

Und dein Testcode kannst du auch mal posten (wie gesagt in Java-Tags) und sagen mit welcher DB du unterwegs bist. Daher wäre dein DB-Schema hilfreich, um es nachzustellen.


----------

