【问题标题】:Java MySQLSyntaxErrorExceptionJava MySQLSyntaxErrorException
【发布时间】:2014-05-08 10:10:52
【问题描述】:

您好,我目前正在开发一个应用程序来维护某家工厂的库存,我无法将订单插入数据库。我尝试自己解决这个问题,但如果有人能帮助我解决这个问题,我就做不到`很高兴。

这是我的错误

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 'order (Add_Order_PID,Customer_idCustomer,Items_idItems,User_idUser,Color,Leather' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3250)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1355)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1270)
at DB.Save_Update_Delete(DB.java:32)
at New_Order1.jButton4ActionPerformed(New_Order1.java:605)
at New_Order1.access$800(New_Order1.java:23)
at New_Order1$9.actionPerformed(New_Order1.java:389)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:702)
at java.awt.EventQueue$4.run(EventQueue.java:700)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

我的代码是

for (int i = 0; i < jTable1.getRowCount(); i++) {
            String $Name = "", $Color = "", $Leather = "", $s38 = "", $s39 = "", $s40 = "", $s41 = "", $s42 = "", $s43 = "", $s44 = "", $s45 = "", $s46 = "", Total = "", ItemId = "";
            $Name += jTable1.getValueAt(i, 0)+"";
            $Color += jTable1.getValueAt(i, 1)+"";
            $Leather += jTable1.getValueAt(i, 2)+"";
            $s38 += jTable1.getValueAt(i, 3)+"";
            $s39 += jTable1.getValueAt(i, 4)+"";
            $s40 += jTable1.getValueAt(i, 5)+"";
            $s41 += jTable1.getValueAt(i, 6)+"";
            $s42 += jTable1.getValueAt(i, 7)+"";
            $s43 += jTable1.getValueAt(i, 8)+"";
            $s44 += jTable1.getValueAt(i, 9)+"";

            $s45 += jTable1.getValueAt(i, 10)+"";
            $s46 += jTable1.getValueAt(i, 11)+"";
            Total += jTable1.getValueAt(i, 12)+"";
            ItemId += jTable1.getValueAt(i, 13)+"";
            DB.Save_Update_Delete("insert into order (Add_Order_PID,Customer_idCustomer,Items_idItems,User_idUser,Color,Leather,s38,s39,s40,s41,s42,s43,s44,s45,s46,Total) values ('"+pid+"','"+Integer.parseInt(customerID.getText())+"','"+Integer.parseInt(ItemId)+"','"+Integer.parseInt(UserID.getText())+"','"+$Color+"','"+$Leather+"','"+$s38+"','"+$s39+"','"+$s40+"','"+$s41+"','"+$s42+"','"+$s43+"','"+$s44+"','"+$s45+"','"+$s46+"','"+Total+"')");
        }

【问题讨论】:

  • 使用准备好的语句
  • 详细说明“使用准备好的语句”:准备好的语句更有效并且可以安全地免受 SQL 注入攻击,而连接的 SQL 字符串(如您所用)则不然。
  • @FrankSchmitt 他们是在 PreparedStatement 中以任何方式在 where 子句下添加条件,或者我需要先确定所有条件,然后单步创建 PreparedStatement。抱歉,这不是主题。
  • @GauravGupta 我建议您为此提出一个单独的问题;这个问题有一些解决方案(即使条件的数量不同,例如,对客户端代码未提供的绑定变量使用虚拟 OR 子句),但一些解决方案是 RDBMS 特定的(例如,在 Oracle 中使用 SYS_CONTEXT)。
  • 能否请您添加表结构

标签: java sql


【解决方案1】:

你正在用引号('')插入 int 值

DB.Save_Update_Delete("insert into order (Add_Order_PID,Customer_idCustomer,Items_idItems,User_idUser,Color,Leather,s38,s39,s40,s41,s42,s43,s44,s45,s46,Total) values ('"+pid+"','"+Integer.parseInt(customerID.getText())+"','"+Integer.parseInt(ItemId)+"','"+Integer.parseInt(UserID.getText())+"','"+$Color+"','"+$Leather+"','"+$s38+"','"+$s39+"','"+$s40+"','"+$s41+"','"+$s42+"','"+$s43+"','"+$s44+"','"+$s45+"','"+$s46+"','"+Total+"')"

);

这里最好使用PreparedStatementlearn

【讨论】:

  • 不确定这是否是问题所在,但通常 SQL 服务器会足够聪明,可以为 int 接收字符串值(单引号)。
  • @Shashi 我明白了,虽然我用 Oracle 和 MSSQL 进行了测试,但是用单引号将整数括起来没有问题。但是对于 MYSQL,我正在阅读 this 并注意到那里的 OP 正在比较带引号的整数,所以我猜它至少适用于他的 MySQL 版本。
  • @JqueryLearner 我也尝试了 Prepared Statement 但它给出了同样的错误
  • @user3615913 编辑您的问题,显示您的架构并更新 JDBC 代码。还要检查每个字段以了解它是否有任何值或其 NULL。您的某些字段不为空,因此如果您插入NULL 那么它也会导致问题。
【解决方案2】:

检查 Add_Order_PID 是否为整数。如果是整数,不要加双引号。

对于任何数字数据类型,不要放在双引号内..

最好使用 PreparedStatement 进行插入

【讨论】:

  • 我删除了双引号,但我得到了同样的错误。除了当我删除双引号时,它看起来像一个字符串
  • 我也尝试了 Prepared Statement 但它给出了同样的错误
  • 请提供表格结构.. 使用 pastebin.com 并提供 url.. 或者用表格结构更新问题会更好
  • idOrder INT NOT NULL AUTO_INCREMENT , Add_Order_PID INT NOT NULL , Customer_idCustomer VARCHAR(45) NOT NULL , Items_idItems VARCHAR(25) NOT NULL , User_idUser INT NOT NULL , Color VARCHAR(45) NULL , Leather VARCHAR(45) NULL , s38 VARCHAR(45) NULL , s39 VARCHAR(45) NULL , s40 VARCHAR(45) NULL , s41 VARCHAR( 45) 空, s42 VARCHAR(45) 空, s43 VARCHAR(45) 空, s44 VARCHAR(45) 空, s45 VARCHAR(45) 空, s46 VARCHAR(45) 空, @ 987654337@ VARCHAR(45) NULL ,`
  • @user3615913 能否请将 DB.Save_Update_Delete 替换为 System.out.println 并粘贴控制台输出...
【解决方案3】:
insert into order (Add_Order_PID,Customer_idCustomer,Items_idItems,User_idUser,Color,Leather,s38,s‌​39,s40,s41,s42,s43,s44,s45,s46,Total) values ('8','1','2','1','Black','Leather 1','2','0','0','0','0','0','0','0','0','2')

直接在 mysql 控制台中尝试您的 sql 语句。它将为您提供有关真正问题的更多信息。也许你违反了一些外键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 2012-12-28
    • 2018-04-25
    • 1970-01-01
    • 2012-04-20
    • 2016-08-13
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多