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  ('route', 'price') VALUES ...
                 /\
                  here

'次に、列の名前にコロンを使用しないでください。代わりに、次のようにバッククォートを使用します。

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

コロンは、リテラル値を渡すために使用されます。

于 2012-12-24T08:54:58.577 に答える
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 に答える
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 に答える