MySQL Problem mit UPDATE Abfrage

  • Themenstarter Themenstarter coolman1008
  • Beginndatum Beginndatum
C

coolman1008

Gast
Hallo alle zusammen,

ich habe eine Frage, ich möchte in meiner Access Datenbank einen Wert aktualisieren doch er bringt mir immer den Fehler, das mein ResultSet closed sei.

in meiner Datrenbank Klasse habe ich das als Methode:

Java:
public boolean speichere_Produkt(Produkt akt_produkt)
	{
	
	String mSQL;
	ResultSet rs;
	
	try
	{
		
	mSQL =  "SELECT Produktname,vorhanden,sicherheitsbestand,Menge FROM KÜHLSCHRANK";
	rs = stmtSQL.executeQuery(mSQL);	
	
		
	mSQL = "UPDATE Kühlschrank";
	mSQL = mSQL + " SET Kühlschrank.vorhanden = " +  akt_produkt.getVorhanden();
	
		
	stmtSQL.executeUpdate(mSQL);

	return true;
	}
	catch(SQLException err)
	{
	System.err.println(err);
	return false;
	}
	}

in meiner anderen Klasse:

Java:
protected void speichern_clicked() {
		
			while (db.nächster()==true){
				
				if (db.akt_produkt.getProduktname().contains(t_suche.getText())){
			
			int a = 0;
			String c;
			c=t_gekauft.getText();

			int b= Integer.parseInt(c);
		
			
			a= db.akt_produkt.getVorhanden() + b;
		    db.akt_produkt.setVorhanden(a);  
		    
			db.speichere_Produkt(db.akt_produkt);
			
				}
			}
			}

Ich hoffe ihr könnt mir helfen, ich bin echt am verzweifeln.

Gruß
Steffen (coolman1008)
 
Danke für die Antwort. Leider habe ich mit dem Datenbankzugriff in java noch sher wenig Erfahrungen da ich es nur in der Schule benutze.

wie öffne ich ein neues rs damit meine UPDATE Abfrage funktionieren kann?
 
Habe den Text jetzt soweit verändert:

Java:
public boolean update_Produkt(Produkt akt_produkt)
	{
		String mSQL;
		ResultSet rs;
		try
		{
			//Die Datenbank wurde bereits geöffnet! 
			//Gibt es das Produkt schon?
		mSQL = "SELECT Produktname,vorhanden,sicherheitsbestand,Menge FROM KÜHLSCHRANK ";
		mSQL = mSQL + " WHERE (Produktname" + akt_produkt.getProduktname() + ";";
		rs = stmtSQL.executeQuery(mSQL);

		if(rs.next())
		{
			//ja - dann nur mögliche Änderungen übernehmen
		mSQL = "UPDATE KÜHLSCHRANK ";
		mSQL = mSQL + "SET Produktname=" + akt_produkt.getProduktname()+ "";
		mSQL = mSQL + " vorhanden=" + akt_produkt.getVorhanden()+ ",";
		mSQL = mSQL + " sicherheitsbestand=" + akt_produkt.getSicherheit()+ ",";
		mSQL = mSQL + " Menge=" + akt_produkt.getMenge()+ "";
		mSQL = mSQL + " WHERE Produktname=" + akt_produkt.getProduktname() + ";";
		stmtSQL.executeUpdate(mSQL);
		}
		else
		{
			//nein - dann neues Produkt einfügen
	mSQL = "INSERT INTO KÜHLSCHRANK(Produktname,vorhanden,sicherheitsbestand,Menge) ";
		mSQL = mSQL + "VALUES("+ akt_produkt.getProduktname()+", "+akt_produkt.getVorhanden()+", "
		+akt_produkt.getSicherheit()+ ", "+akt_produkt.getMenge();
		stmtSQL.executeUpdate(mSQL);
		}
		return true;
		}
		catch(SQLException err)
		{
		System.err.println(err);
		return false;
		}}

doch leider bringt er andauernd diese Fehlermeldungen:

Java:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntaxfehler in Abfrageausdruck '(sicherheitsbestand=1;'.
java.sql.SQLException: ResultSet is closed

leider weiß ich nicht warum er diese Fehlermeldungen bringt und bekomme einfach kein neues Resultset geöffnet oder was an meiner Abfrage falsch sein könnte. Danke für eure Hilfe.
 
du hast drei verschiedene Querys, kannst du die Fehlermeldung auf eine davon einschränken?
ist es die zweite?
gib den zusammengebauten String mSQL aus, poste ihn hier,

kannst du etwas über die Datenbank sagen, welchen Datentyp hat sicherheitsbestand?
funktionieren einfachere Querys, z.B. update Kühlschrank nur mit neuen Produktnamen?

ins catch gehört WIE IMMER
err.printStackTrace();
 
Komma fehlt:
SQL:
 mSQL = mSQL + "SET Produktname=" + akt_produkt.getProduktname()+ ",";
 
Zuletzt bearbeitet:
1) tu uns und vor allem dir selbst erstmal den gefallen und rücke deinen code mal ordentlich ein ...
so ist das ja ein krampf ...

2) du solltest anstatt Exception.toString *nichts anderes ist PrintStream.println(Exception)* mal lieber das hier verwenden
Java:
err.printStackTrace();
das gibt dir eine detailierte fehlermeldung was wo wann warum schief gelaufen ist ... nur mit dem exception-text kommt man meist nicht weit ...

3)
Java:
String+String+String
sowas macht man in java nicht !
verwende hierfür StringBuilder und baue das ganze mit StringBuilder.append(String) zusammen ...

4) syntax-fehler im SQL-query
deine qeuries sind syntaktisch fehlerhaft
es fehlen zum beispiel schließende klammern , leerzeichen , operanden ... desswegen bekommst du auch als fehlermeldung "SYNTAXFEHLER" ...

5) charset
UMLAUTE und SONDERZEICHEN sollte man immer vermeiden wo es geht !
mich würde es nicht wundern wenn du zuletzt eine fehlermeldung über eine nicht gefundene spalte / tabelle "KÜHLSCHRANK" erhältst weil wärend der verbindung charset-fehler auftreten und dann beim SQL-server sowas wie KfeacHLSCHRANK ankommt ... aber naja ...


alles in allem enthält dein code einfach zu viele fehler und ist auch nicht sauber implementiert ... von der fehlenden formatierung mal ganz zu schweigen ...
 
Danke für eure Antworten. Meine Abfrage habe ich soweit verbessert bekommen das diese keine Fehler mehr erzeugt. Doch leider bleibt mein Problem mit dem ResultSet.
Um dieses zu öffnen muss ich da etwas in meiner methode verändern die meine Speichermethode aufruft?

Java:
protected void speichern_clicked() {
		
			while (db.nächster()==true){
				
				if (db.akt_produkt.getProduktname().contains(t_suche.getText())){
			
			int a = 0;
			String c;
			c=t_gekauft.getText();

			int b= Integer.parseInt(c);
		
			
			a= p.getVorhanden() + b;
		    p.setVorhanden(a); 
		    
		    
			db.update_Produkt(p);
			
				}
			}
			}
 
meiner Ansicht nach wird auch im ersten Posting schon kein ResultSet nach anderen weiteren Queries verwendet
(im ersten Posting wird gar überhaupt nicht auf das ResultSet zugegriffen?),
wieder einmal die Frage: wo tritt konkret der Fehler auf, welche Zeile, welcher StackTrace, welche exakte Fehlermeldung,

ist es nicht leicht das bei Programmierfehlern immer korrekt mit anzugeben?

---

allgemein ist die Abhilfe, mehrere Statements zu verwenden,
wo die bei dir herkommen ist unklar, wenn du aber eines hast, dann vielleicht auch mehrere

ich bin aber skeptisch ob das der Fehler ist
 
Zuletzt bearbeitet von einem Moderator:
[c]db.nächster[/c]
OUCH .... evil code !

umlaute sind in java selbst zwar kein problem ... werden aber zu einem wenn du das source-file von windows nach linux / vise-versa porten willst ... -> ÄNDERN !

btw : STACKTRACE !!!
sollen wir raten welche fehlermeldung du bekommst ?
 
Nochmals Danke für eure Antworten. Leider bekomme ich nur die Fehlermeldung:

Java:
java.sql.SQLException: ResultSet is closed

den konkreten Fehler kann ich leider nicht anzeigen da ich nicht weiß wo ich

Java:
err.printStackTrace();

einfügen sollte. Direkt in den letzten catch Befehl?

[JAVA
catch(SQLException err)
{
err.printStackTrace();
System.err.println(err);
return false;
}}[/code]

denn wenn ich es so mache kommt leider nur die gleiche Fehlermeldung raus.

Ps: ich benutze Java momentan nur in der Schule und mache so eine Datenbankspeicherung zum ersten Mal un habe leider noch keinerlei erfahrung damit. Deswegen sagen mir auch viele eurer Fachwörter leider nichts.
Entschuldigung das ich mich so blöd anstelle.
 
> Direkt in den letzten catch Befehl?
in jeden catch-Befehl, außer du hast begründet ein besseres Verfahren

-----

wenn du generell nichts über Programmablauf weißt, kann man dir noch weniger extern helfen,
allgemeine Ratschläge:
- fange mit einem Hello-Word-Programm an, und füge nur dann Methoden und Code hinzu wenn du auch weißt was dort ungefähr passiert
- zur Kontrolle könnte z.B. zu Beginn und Ende jeder Methode eine Ausgabe des Methodennames erfolgen,
auch Schleifen gerne mitzählen, aktuelle wichtige Parameter wie Produktname ausgeben usw.,

wenn der Bildschirm mit hunderten Meldungen überschwemmt wird und auch die letzten vor der Fehlermeldung mehr stören als helfen, dann kann man von ZUVIEL Information reden,
die meisten Probleme entstehen aber durch ZUWENIG Information
 
also die Grundkenntnisse mit Grafischer Oberfläche mit GUI kann ich schon, nur die Datenbanken haben wir in der Schule bis jetzt nur eingelesen und nicht etwas hinzugefügt oder verändert.
 
ob Datenbank, GUI, Webframework oder Marssonde, das Gute an Java ist ja dass alles weitgehend einfacher Code ist,
die Grundlage besteht auch darin zu verstehen, dass Codezeilen hintereinanderstehen und der Reihe nach abgearbeitet werden,

eine Exception taucht an einer bestimmten Stelle auf, ein try und catch funktionieren in der Regel,
System.out.println() lassen Ausgaben auf dem Bildschirm erscheinen, Objekte können null sein usw.

wenn solche Regeln verstanden sind, dann kann man mit einem Programm auch arbeiten und sieht keine Blackbox,
deren einzige Reaktion sein soll dass am Ende eine Fehlermeldung rauskommt
 

Zurück
Oben