sql语法错误

cu6pst1q  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(483)

下面是当用户单击ApplyBalance时的代码。这适用于第一部分,用户的余额更新很好,但当我尝试执行第二条语句时,会出现sql语法错误。是什么导致了问题?

  1. public void mouseClicked(MouseEvent e) {
  2. if (cal == true) {
  3. try {
  4. int balchange = updatebal;
  5. String username = (String) userPicker.getSelectedItem();
  6. Connection conn = DriverManager.getConnection( Host, Name, Pass );
  7. PreparedStatement pst = conn.prepareStatement("UPDATE table_1 SET user_bal='"+balchange+"' WHERE user_name='"+username+"'");
  8. pst.execute();
  9. String sign = "£";
  10. String PayName = textField_1.getText();
  11. PreparedStatement pst2 = conn.prepareStatement("INSERT INTO payment_info (payment_name, payment_amount, payment_date, username)"+" VALUES ('"+PayName+"', '"+sign+balchange+"', '"+Date+"', '"+username+"'");
  12. pst2.execute();
  13. cal = false;
  14. }
  15. catch (Exception e3) {
  16. e3.printStackTrace();
  17. }
  18. }
  19. else {
  20. JOptionPane.showMessageDialog(null, "Please use the Calculator First!");
  21. }
  22. }

下面是我运行这个时得到的堆栈跟踪。

  1. 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 '' at line 1
  2. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  3. at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  4. at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  5. at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
  6. at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
  7. at com.mysql.jdbc.Util.getInstance(Util.java:387)
  8. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)
  9. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
  10. at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
  11. at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
  12. at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
  13. at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
  14. at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
  15. at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1192)
  16. at AdminPanelMain$7.mouseClicked(AdminPanelMain.java:444)
  17. at java.awt.Component.processMouseEvent(Component.java:6538)
  18. at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
  19. at java.awt.Component.processEvent(Component.java:6300)
  20. at java.awt.Container.processEvent(Container.java:2236)
  21. at java.awt.Component.dispatchEventImpl(Component.java:4891)
  22. at java.awt.Container.dispatchEventImpl(Container.java:2294)
  23. at java.awt.Component.dispatchEvent(Component.java:4713)
  24. at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
  25. at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534)
  26. at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
  27. at java.awt.Container.dispatchEventImpl(Container.java:2280)
  28. at java.awt.Window.dispatchEventImpl(Window.java:2750)
  29. at java.awt.Component.dispatchEvent(Component.java:4713)
  30. at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
  31. at java.awt.EventQueue.access$500(EventQueue.java:97)
  32. at java.awt.EventQueue$3.run(EventQueue.java:709)
  33. at java.awt.EventQueue$3.run(EventQueue.java:703)
  34. at java.security.AccessController.doPrivileged(Native Method)
  35. at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
  36. at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
  37. at java.awt.EventQueue$4.run(EventQueue.java:731)
  38. at java.awt.EventQueue$4.run(EventQueue.java:729)
  39. at java.security.AccessController.doPrivileged(Native Method)
  40. at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
  41. at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
  42. at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
  43. at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
  44. at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
  45. at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
  46. at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
  47. at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
wbrvyc0a

wbrvyc0a1#

您的第二个查询缺少右括号 Values 条款。
使用参数化查询,而不是直接在查询中附加参数。

  1. public void mouseClicked(MouseEvent e) {
  2. if (cal == true) {
  3. try {
  4. int balchange = updatebal;
  5. String username = (String) userPicker.getSelectedItem();
  6. Connection conn = DriverManager.getConnection( Host, Name, Pass );
  7. PreparedStatement pst = conn.prepareStatement("UPDATE table_1 SET user_bal=? WHERE user_name=?");
  8. pst.setInt(1, balchange);
  9. pst.setString(2, username);
  10. pst.execute();
  11. String sign = "£";
  12. String PayName = textField_1.getText();
  13. PreparedStatement pst2 = conn.prepareStatement("INSERT INTO payment_info (payment_name, payment_amount, payment_date, username)"
  14. + " VALUES (?, ?, ?, ?)");
  15. pst2.setString(1, PayName);
  16. pst2.setString(2, sign + balchange);
  17. pst2.setString(3, "Date");//if it's date column use ps2.setDate(3, new Date());
  18. pst2.setString(4, username);
  19. pst2.execute();
  20. cal = false;
  21. }
  22. catch (Exception e3) {
  23. e3.printStackTrace();
  24. }
  25. }
  26. else {
  27. JOptionPane.showMessageDialog(null, "Please use the Calculator First!");
  28. }
  29. }

这看起来会更干净,更容易写。最重要的是,它将使您免受sql注入攻击。
以下是用于参数化查询的oracle文档https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

展开查看全部
vuktfyat

vuktfyat2#

看看这里:

  1. PreparedStatement pst2 = conn.prepareStatement("INSERT INTO payment_info (payment_name, payment_amount, payment_date, username)"+" VALUES ('"+PayName+"', '"+sign+balchange+"', '"+Date+"', '"+username+"'")

似乎在sql语句中缺少正确的括号,应该是 VALUES() 不是 VALUES( .
顺便说一下,有几种orm系统,例如 mybatis 或者 hibernate ,为什么不选一个呢?它们不仅可以帮助您减少工作量,还可以方便地访问您的数据库。

相关问题