# SQL Statement: executeUpdate



## sonic29 (5. Apr 2011)

Hallo,

ich bin mittlerweile ein wenig am verzweifeln an einem SQL Statement. Der Tabelle event soll eine neue Zeile eingefügt werden. Am besten poste ich die komplette doPost Methode, damit man den möglichen Fehler am besten findet.
Das Einfügen einer Zeile im DBMS klappt wunderbar. Es wird eine SQL Exception geworfen an folgender Stelle: 


```
stmt2 = con.createStatement();
            stmt2.executeUpdate("INSERT INTO events(event_id, datum, name, infotext, wo, in, foto) VALUES(" + eventid_neu + ", '" + datum_ts + "', '" + name + "', '" + infotext + "', '" + wo + "', '" + in + "', 0)");
            stmt2.close();
```

Nun die komplette doPost Methode:


```
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String sparte_aktuell = session.getAttribute("sparte").toString();
        Ordner ordner = new Ordner();
        String ordner_aktuell = ordner.ordner_finden(sparte_aktuell);
        String name = request.getParameter("name");
        String infotext = request.getParameter("text");
        String datum_eingabe = request.getParameter("datum");
        datum_eingabe = datum_eingabe.replaceAll("-", ".");
        String_to_date std = new String_to_date();
        java.util.Date datum = std.cast_string_date(datum_eingabe);
        java.sql.Timestamp datum_ts = new java.sql.Timestamp(datum.getTime());
        String in = request.getParameter("in");
        String wo = request.getParameter("wo");
        //Verbindung mit der Datenbank herstellen
        Connection con = DBVerbindung.getConnection();
        Statement stmt;
        Statement stmt2;
        try {
            int eventid_max = 0;
            int eventid_neu = 0;
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT MAX(event_id) FROM events");
            rs.next();
            eventid_max = rs.getInt(1);
            eventid_neu = eventid_max + 1;
            stmt.close();       
            stmt2 = con.createStatement();
            stmt2.executeUpdate("INSERT INTO events(event_id, datum, name, infotext, wo, in, foto) VALUES(" + eventid_neu + ", '" + datum_ts + "', '" + name + "', '" + infotext + "', '" + wo + "', '" + in + "', 0)");
            stmt2.close();
            response.sendRedirect(ordner_aktuell + "/foto_upload.jsp?e" + eventid_neu);
        } catch (SQLException e) {
            response.sendRedirect(ordner_aktuell + "/index.jsp");
        } finally {
            try {
                if (con != null) {
                    con.close();
                }
            } catch (SQLException exc) {
            }
        }
    }
```

Findet jemand einen/den Fehler? Schonmal vielen Dank für die Hilfe.

Viele Grüße


----------



## XHelp (5. Apr 2011)

sonic29 hat gesagt.:


> Es wird eine SQL Exception geworfen



Wie lautet die genau? Diese wird ja meistens erklärt.


----------



## sonic29 (5. Apr 2011)

Die SQL Exception wird abgefangen. Die Anwendung geht in den catch Block rein und ruft folgenden Befehl auf:


```
response.sendRedirect(ordner_aktuell + "/index.jsp");
```

Leitet sozusagen auf die Startseite weiter...


----------



## XHelp (5. Apr 2011)

Dann logg die Exception, schmeiß die weiter, gib die aus... was auch immer. Nur den *Namen* der Exception zu kennen ist nur die halbe Miete


----------



## ARadauer (5. Apr 2011)

Ich würde PreparedStatements benutzen...


----------



## r.w. (5. Apr 2011)

Hallo sonic29,

ohne die Exception kann man natürlich nur raten.

So könnte z.B. die Spalte event_id die AutoIncrement-Eigenschaft haben. Dann dürftest Du sie nicht mit übergeben. 
Zudem würde ich, wenn Du für die Spalte "Foto" nie etwas übergeben möchtest, auch diese aus der Auflistung entfernen.

Ist aber, wie gesagt, nur geraten. Mehr kann man aus der geworfenen Exeption entnehmen.

VG ROlf


----------



## sonic29 (5. Apr 2011)

Ich wollte jetzt mal die exception ausgeben lassen:

```
} catch (SQLException e) {
            e.printStackTrace();
        }
```

Als ergebnis wird mir eine komplett weiße (leere) seite angezeigt. die url hat den pfad des bereits geposteten servlets. Hilft mir jetzt überhaupt nicht weiter, aber vllt euch?

Grüße


----------



## XHelp (5. Apr 2011)

Du musst ja auch nicht auf die Seite gucken, sondern auf die Konsole...
java - correctly printstacktrace of servlet exception - Stack Overflow
Da stehen paar Hinweise die du verwenden kannst. Bzw. google einfach mal nach "printStrackTrace servlet", dann findest du jede Menge Informationen


----------



## sonic29 (5. Apr 2011)

okay, schonmal viele Dank für den Tipp.
Ich bekomme nun den folgenden Fehler ausgegeben:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'in, foto) VALUES(1, '2011-04-20 23:11:00.0', 'dh', 'yhd', 'yh', 'yh', 0)' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
	at eventpackage.fussball.Neuer_event.doPost(Neuer_event.java:76)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Thread.java:662)


Habt ihr ne Ahnung, was ich falsch mache?


----------



## sonic29 (5. Apr 2011)

Problem gelöst.
Es lag daran, dass Attribut "in" ein SQL-Schlüsselwort darstellt. Habe nun einen anderen Namen für die Spalte benutzt und es funktioniert. 

Schönen Abend noch und vielen Dank...


----------



## XHelp (5. Apr 2011)

Steht doch da: *You have an error in your SQL syntax;*
Du hast übrigens den SQL-Befehl nicht, wie du es geschrieben hast, ausprobiert, sonst würdest du es merken, dass es auch so nicht klappt. Das liegt daran, dass du ungeschickt die Spaltennamen gewählt hast. 
	
	
	
	





```
IN
```
 ist ein Schlüsselwort, also musst du es entweder umbenennen oder escapen:

```
INSERT INTO events(event_id, datum, name, infotext, wo, `in`, foto) ...
```


----------



## 5474n (29. Feb 2012)

Hallo,

habe ein ähnliches Problem wie oben erwähnt,
Es wird bei mir keine Exception geworfen, mein Problem ist aber, dass sich nach über 10 Minuten Ladezeit  immer noch nichts tut und sich teilweise mein Browser oder Eclipse (Programmiere mit Eclipse Indigo EE und Java 7) aufhängt.
Kann ich über diese Methode, meine Datenbank Updaten. 
Mit Insert funktioniert die Methode, will aber nicht dass immer alle Objekte neu in die Datenbank geschrieben, sondern ausschließlich Aktualisiert wird .
Gibt des sonst noch eine bessere Variante?


```
public static void saveDatabase(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException
	{
		PrintWriter out = response.getWriter();

		

		Connection connect = null; //Verbindung erstellt und als null intialisiert
		Statement statm = null; //Aussage objekt
		ResultSet res = null; //Ergebnis Obejekt wird erstellt

		try
		{
			connect = getConnection(); // Connection initalisierung
			statm = connect.createStatement(); //Statement initalisierung

			int iFach = 0;
			String sTyp = "";
			String sinterpret = "";
			String stitel = "";
			String sgenre = "";
			String skaufdatum = "";

			for (int a = 0; a < DatenVector.DatenStaender.capacity(); a++)
			{
				if (DatenVector.DatenStaender.elementAt(a) != null)
				{

					iFach = DatenVector.DatenStaender.get(a).getiFachangabe();
					sinterpret = DatenVector.DatenStaender.get(iFach).getsInterpret();
					stitel = DatenVector.DatenStaender.get(iFach).getsTitel();
					sgenre = DatenVector.DatenStaender.get(iFach).getsGenre();
					skaufdatum = DatenVector.DatenStaender.get(iFach).getsKaufdatum();
					Traeger dt = DatenVector.DatenStaender.get(iFach);

					if (dt instanceof CD)
					{
						sTyp = "CD";
					}
					if (dt instanceof DVD)
					{
						sTyp = "DVD";
					}
					String sql = ("Update sh_regal set fach = '" + iFach + " ', typ = '" + sTyp
						+ "', interpret = ' " + sinterpret + " ',titel = '" + stitel + "',genre =' " + sgenre
						+ "',kaufdatum=' " + skaufdatum + "'");

					//für Abfragen stmt.executeQuery
					//für Datenmanipulation (update,delete) stmt.executeUpdate

					statm.executeUpdate(sql);

				}
			}
			out.println("Datentraeger wurde in Datenbank geschrieben");
		}
		catch (ClassNotFoundException e)
		{
			handleException(e, "DB driver class not found"); //Exception Handlind
		}
		catch (SQLException e)
		{
			handleException(e);
		}
		finally
		{
			closeConnection(connect, statm, res);
			out.println("<form method='GET' action='" + "" + "/CDVerwaltung/Startseite'>"); // Button!
			out.println("<input type=SUBMIT value=\"Startseite\">\n" + "</form>\n");
		}
```


----------



## 5474n (29. Feb 2012)

Habe es nun so gelöst, das ich vor dem Speichern mit 
	
	
	
	





```
INSERT INTO sh_regal..
```
 eine Methode aufrufe, die zuvor erstellte Datensätze aus der Datenbank wieder löscht 
	
	
	
	





```
Delete sh_regal
```
einen anderen Lösungsweg habe ich nicht gefunden.


----------



## SlaterB (29. Feb 2012)

ich habe dieses Thema bzw. dein Anhängsel darin übrigens erst jetzt bei deinem zweiten Posting gesehen,
ein eigenes Thema hätte dir sicher mehr Zuschauer gebracht/ bringt vielleicht noch falls noch irgendwas offen ist


----------



## nillehammer (29. Feb 2012)

> String sql = ("Update sh_regal set fach = '" + iFach + " ', typ = '" + sTyp
> + "', interpret = ' " + sinterpret + " ',titel = '" + stitel + "',genre =' " + sgenre
> + "',kaufdatum=' " + skaufdatum + "'");


Irgendwie fehlt hier eine WHERE-Clause (irgendsowas wie WHERE id = ...). Ohne diese wird das Update ja auf alle Datensätze angewendet.

Und ansonsten schau Dir mal PreparedStatement an.


----------



## SlaterB (29. Feb 2012)

http://www.java-forum.org/datenbankprogrammierung/132734-datenbank-update.html


----------

