SQL Statement: executeUpdate

Status
Nicht offen für weitere Antworten.

sonic29

Mitglied
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:

Java:
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:

Java:
    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
 
Die SQL Exception wird abgefangen. Die Anwendung geht in den catch Block rein und ruft folgenden Befehl auf:

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

Leitet sozusagen auf die Startseite weiter...
 
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
 
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
 
Ich wollte jetzt mal die exception ausgeben lassen:
Java:
} 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
 
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?
 
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...
 
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.
Code:
IN
ist ein Schlüsselwort, also musst du es entweder umbenennen oder escapen:
SQL:
INSERT INTO events(event_id, datum, name, infotext, wo, `in`, foto) ...
 
Zuletzt bearbeitet:
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?

Java:
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");
		}
 
Habe es nun so gelöst, das ich vor dem Speichern mit
SQL:
INSERT INTO sh_regal..
eine Methode aufrufe, die zuvor erstellte Datensätze aus der Datenbank wieder löscht
SQL:
Delete sh_regal
einen anderen Lösungsweg habe ich nicht gefunden.
 
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
 
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben