0

我试图将值从 JTextField 中的用户输入插入到表中。代码运行时出现错误:

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法

谁能帮我解决这个问题?谢谢!

这是我的代码。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

class InputRoute
{

JTextField text1;
JTextField text2;
JTextField text3;
String c;
Float d;

public void inputRoute() 
{

    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "YarraTram";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "root";
    String password = "abc123";

    try 
    {
        Class.forName(driver).newInstance();
        conn = DriverManager.getConnection(url + dbName, userName, password);

        PreparedStatement statement = conn.prepareStatement("INSERT INTO  ('route', 'price') VALUES ('"+c+"', '"+d+"')");
        statement.executeQuery();

    } 
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

 public void createAndShowGUI() 
{

    final JFrame frame = new JFrame("Yarra Tram Route Finder(New Route)");

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new FlowLayout());

    JLabel label1 = new JLabel("From: ");
    JLabel label2 = new JLabel("To: ");
    JLabel label3 = new JLabel("Price: ");

    text1 = new JTextField(20);
    text2 = new JTextField(20);
    text3 = new JTextField(20);

    JButton button1 = new JButton("Add");
    JButton button2 = new JButton("Close");

    frame.add(label1, BorderLayout.WEST);
    frame.add(text1, BorderLayout.EAST);
    frame.add(label2, BorderLayout.WEST);
    frame.add(text2, BorderLayout.EAST);
    frame.add(label3, BorderLayout.WEST);
    frame.add(text3, BorderLayout.EAST);
    frame.add(button1);
    frame.add(button2);

    button2.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            String a = text1.getText();
            String b = text2.getText();
            d = Float.parseFloat(text3.getText());

            c = a + " - " + b;

            inputRoute();
        }
    });
    button2.addActionListener(new ActionListener() 
    {
        @Override
        public void actionPerformed(ActionEvent e) 
        {
            frame.dispose();
        }
    });

    frame.setSize( 500,120 );
    frame.setLocationRelativeTo( null );
    frame.pack();
    frame.setVisible(true);
} 
}

这是我的 MySQL 表

 CREATE TABLE `route` (
 `rid` int(11) NOT NULL AUTO_INCREMENT,
 `route` varchar(100) ,
 `price` decimal(5,2) ,
 PRIMARY KEY (`rid`)
 )
4

4 回答 4

1
INSERT INTO "table_name" ("column1", "column2", ...)
VALUES ("value1", "value2", ...)
于 2012-12-24T08:59:57.237 回答
1

您在 SQL 查询中缺少表名。您不需要将列名放在单引号中。只有非数字值需要放在单引号中。

当您使用准备好的语句时,为什么不使用PreparedStatement#setParamater(). 根据当前的代码,我认为您不会充分利用 PreparedStatement 的优势。准备好的语句有其自身的优势。首先它有助于避免 SQL 注入,然后提高查询性能。您可以谷歌进一步的细节。

String c = <your_route>;
float d = <your_price>;      
PreparedStatement statement = conn.prepareStatement("INSERT INTO TABLE_NAME('route', 'price') VALUES (?, ?)");
statement.setString(1,c);
statement.setFloat(2,d);
statement.executeQuery();
于 2012-12-24T09:10:28.943 回答
1

首先,您在以下位置缺少表名:

... ("INSERT INTO  ('route', 'price') VALUES ...
                 /\
                  here

其次,您不应该在'列名中使用冒号。像这样使用反引号:

... ("INSERT INTO  `route` (`route`, `price`) VALUES ...

冒号用于传递文字值。

于 2012-12-24T08:54:58.577 回答
0

第 1 点

您缺少表名

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName ('route', 'price') VALUES ('"+c+"', '"+d+"')");
                                                                 ^^^^^^^^^

第 2 点

您处理准备好的语句的方式不是正确的方式。总是像下面这样。

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName (route, price) VALUES (?, ?)");
statement.setString(1, c);
statement.setFloat(2, d);

第 3 点

我也认为'route', 'price'行不通。我觉得你想使用`(反引号)而不是单引号'


所以,你的最后陈述应该是

PreparedStatement statement = conn.prepareStatement("INSERT INTO tableName
(route, price) VALUES (?, ?)");
statement.setString(1, c);
statement.setFloat(2, d);
于 2012-12-24T09:27:42.233 回答