MySQLSyntaxErrorException MYSTIQUE

时间:2015-10-06 23:33:54

标签: java mysql sql prepared-statement

我正在尝试更新我的jtable(更改值并按Enter键),我收到错误。由于大小,错误未满。我认为其余部分只是用于汇集连接的c3p0工具生成的无关信息。

推定首先,我认为这可能是c3p0的问题,因为为了将它用于预处理语句,我必须编辑配置文件/更改设置。但我使用了DriverManager方式的传统get连接,发现它与它无关。

另一个假设 - 是一些数据类型问题。因为我键入3.00并且错误显示为''Flat' = '3.0' where ID = '4'' at line 1 不执行ImportData方法中的文本测试行。所以这意味着它在执行SQL语句时崩溃了。在我的数据库表中,除ID和日期之外的列的类型为float(9,2),表示总数= 9;数字"点后#34; = 2.我确实有DecimalFormatRenderer类可能与此有关。

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 ''Flat' = '3.0' where ID = '4'' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
at com.mysql.jdbc.Util.getInstance(Util.java:360)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:978)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
at components.TableWithBottomLine$ImportData.<init>(TableWithBottomLine.java:174)
at components.TableWithBottomLine.tableChanged(TableWithBottomLine.java:147)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableCellUpdated(Unknown Source)
at components.TableWithBottomLine$MyTableModel.setValueAt(TableWithBottomLine.java:251)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
at javax.swing.JTable$GenericEditor.stopCellEditing(Unknown Source)
at javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(Unknown Source)
at javax.swing.JTextField.fireActionPerformed(Unknown Source)
at javax.swing.JTextField.postActionEvent(Unknown Source)
at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

代码摘自我的程序:

public void tableChanged(TableModelEvent e) {
    int row = e.getFirstRow();
    int col = e.getColumn();
    model = (MyTableModel) e.getSource();
    String colName = model.getColumnName(col);
    Object cellValue = model.getValueAt(row, col);        
    Object cell_Id = model.getValueAt(row, 0);

    try {
        new ImportData(colName, cellValue, cell_Id);
        bottomLabel.setText(textForLabel());
    } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
}   

public class ImportData {    

    public ImportData(String a, Object b, Object c)
            throws ClassNotFoundException, SQLException {
        Connection connection = null;
        PreparedStatement prepStmt = null;      

        try {
            connection = ConnectionManager.getConnection();
            String colName = a;             
            String cellValue = b.toString();                
            String cell_Id = c.toString();                      

            String updateString = "update finance.fin " + "set ? = ? " + "where ID = ? "+ ";";
            prepStmt = connection.prepareStatement(updateString);
            prepStmt.setString(1, colName);
            prepStmt.setString(2, cellValue);
            prepStmt.setString(3, cell_Id);             
            prepStmt.executeUpdate();  

            System.out.println("Text test line out of ImportData() method");

        } catch (SQLException e) {
            e.printStackTrace();
        } 
        finally {
            closeAll(null, null, prepStmt, connection);
        }  
    }   
}

1 个答案:

答案 0 :(得分:0)

来自http://coderanch.com的Roel De Nijs 回答了这个问题。 说实话,我看到你的代码有3个问题。首先也是最重要的一点:我认为你不能在准备好的陈述中做这样的事情"set ? = ? "我认为列名不能用占位符代替。尝试使用"set Flat = ? ",看看它是否有效。如果确实如此,您就知道是什么导致了这些问题。 另外两个是你将参数设置为String而它们不是字符串,但可能是double和int。所以改变你的代码

prepStmt.setString(1, colName); prepStmt.setString(2, cellValue); prepStmt.setString(3, cell_Id);

// column name not dynamic for test prepStmt.setDouble(1, cellValue); prepStmt.setInt(2, cell_Id);

看看这是否有效。您当然应该确保您的变量具有适当的类型。 PS。不建议在变量名中使用下划线,根据命名约定,它应该是camelCase。下面的工作代码:

public class ImportData {    

    public ImportData(String a, Object b, Object c)
            throws ClassNotFoundException, SQLException {
        Connection connection = null;
        PreparedStatement prepStmt = null;          
        try {
            connection = ConnectionManager.getConnection();
            String colName = a;             
           // String cellValue = b.toString();
           // String cellId = c.toString();
            float cellValue = (float) b;
            int cellId = (int) c;               
            String updateString = "update finance.fin " + "set " + colName + "= ? " + "where ID = ? "+ ";";
            prepStmt = connection.prepareStatement(updateString);
            prepStmt.setFloat(1, cellValue);
            prepStmt.setInt(2, cellId);             
            prepStmt.executeUpdate();  

        } catch (SQLException e) {
            e.printStackTrace();
        } 
        finally {
            closeAll(null, null, prepStmt, connection);
        }  
    }   
}