Java Beans: INSERT INTO Syntax Fehler
-
Liebe Forum Community,
Ich arbeite zur Zeit an einem kleinen JSP-Projekt.
Ich möchte eine User Datenbank verwenden und dieser über eine Bean in die Datenbank speichern und auch wieder auslesen. Doch irgendwie hat wer was gegen meine SQL Syntax. Ich seh den Fehler nicht. Bin vl durch das viele Nachlesen schon "blind" geworden.
Vl könnt ihr mir helfen. Hier der betreffende Code aus der Bean:String query = "INSERT INTO st_users(" + "First Name," + "Last Name," + "User Name," + "Mat Number," + "Password," + "Creation Date," + "Last Access Date," + "Comment)" + " VALUES(" + "'"+firstname+"'" + "," + "'"+lastname+"'" + "," + "'"+username+"'" + "," + "'"+matnumber+"'" + "," + "'"+password+"'" + "," + "'"+creationDate+"'" + "," + "'"+lastAccessDate+"'" + "," + "'"+comment+"'" + ");"; try { stmt = con.createStatement(); stmt.executeUpdate(query); }catch(SQLException e) { e.printStackTrace(); }
Die verbindung zur Datenbank steht zu dem Zeitpunkt bereits ohne Probleme.
Die Parameter firstname, lastname, etc... übergebe ich ganz normal an die Funktion. Die stimmen auch.Doch beim ausführen bekomme ich diese Exception
com.mysql.jdbc.exceptions.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 'Name,Last Name,User Name,Mat Number,Password,Creation Date,Last Access Date,Comm' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1316)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1235)
at StudyTalk.ST_user.insertUser(ST_user.java:172)
at org.apache.jsp.register_jsp._jspService(register_jsp.java:121)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11ProtocolWorker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)ich hoffe ihr habt genug informationen um mir helfen zu können.
Mfg
-
Heißen die Spaltennamen wirklich "First Name"? Dann müssen sie mit einemAuswertungsschutz versehen werden, weil er ja sonst denkt, dass es zwei Bezeichner sind => `First Name`. Du kannst den SQL-String ja mal in einemMySQL-Admintool ausführen lassen.
-
vielen dank für den tipp. funktioniert.
er beschwert sich jetzt nur mehr das ich ein falsches format fürs datum hab. hab ein new java.util.Date() übergeben.
Welches Format brauch ich da?//EDIT:
habs mit NOW() fgemacht und es funktioniert. danke für die hilfe.
-
ok mittlerweile werden die user korrekt gespeichert doch nun spinnt er beim auslesen rum und wirft mir die ganze zeit eine NullPointerException.
Hier der Code:
System.out.println(username); String query = "SELECT * FROM st_users WHERE st_users.UserName = \"" + username + "\""; System.out.println(query); try { [b]ResultSet rs = stmt.executeQuery(query);[/b] this.setUserMembers(rs); }catch(Exception e) { e.printStackTrace(); }
In der fettgedruckten Zeile passt ihm irgendetwas nicht.
Wie ihr seht hab ich mal mit out.println überprüft ob er die richtigen Parameter hat. und das sql kommando sieht auf der console so aus:abc <--- System.out.println(username)
SELECT * FROM st_users WHERE st_users.UserName = "abc" <--- System.out.println(query)hab keine Ahnung denn wenn ich das Kommando im phpMyAdmin ausführe gehts ohne Probleme.
und der user mit dem Usernamen abc existiert auch.
Vl weiss von euch wer wo mein fehler liegt.
mfg
-
Was ist denn stmt?
-
stmt ist eine Variable vom Typ Statement. wird global deklariert. oder is das allgemein nicht besonders intelligent wenn ich sowas global mache?
//EDIT:
hier die zeilen:public void connectDB() { String url="jdbc:mysql://localhost/StudyTalk"; try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch(IllegalAccessException e) { e.printStackTrace(); } catch(InstantiationException i) { i.printStackTrace(); } catch(ClassNotFoundException c) { c.printStackTrace(); } try { con = DriverManager.getConnection (url, "ST_ADMIN", dbpassword); stmt = con.createStatement(); } catch(SQLException ex) { ex.printStackTrace(); } }
-
Gut, aber was steht in stmt? null?
digital_doom schrieb:
oder is das allgemein nicht besonders intelligent wenn ich sowas global mache?
Du meinst static. Richtig, das ist nicht gut, es so zu machen.
-
tfa schrieb:
Gut, aber was steht in stmt? null?
Also habs mir mal ausgegeben und da steht welch überraschung null drinnen. versteh nur nicht warum
tfa schrieb:
digital_doom schrieb:
oder is das allgemein nicht besonders intelligent wenn ich sowas global mache?
Du meinst static. Richtig, das ist nicht gut, es so zu machen.
also soll ich die immer wieder local deklarieren?
also bei jeder abfrage einConnection con = DriverManager.getConnection(url, user, password); Statement stmt = con.createStatement();
und url, user und password global sichtbar machen?
-
Am besten erzeugst du dir die Connection an einer Stelle und hebst sie in einer Objekt-Variablen auf. Dann kannst du immer wieder lokal Statements generieren. (Connection-Erzeugung ist relativ teuer, Statement-Erzeugung kostet fast nichts).
Noch besser wäre, wenn du einen Connection-Pool verwendest. Da spart man eine Menge Probleme. http://commons.apache.org/dbcp/
-
vielen dank für die hilfe.
funktioniert alles. und das mit dem connectionPool hatte ich vor jedoch wollte ich mal da ich noch relativ neu bin auf dme gebiet der datenbankintegration zuerst mal mit einfachen connections arbeiten und mich dann in das thema connection pool ein bisschen einarbeiten.
auf jeden fall haben mir deine tipps geholfen. danke
mfg