【问题标题】:Error when trying to issue data manipulation statements with executeUpdate尝试使用 executeUpdate 发出数据操作语句时出错
【发布时间】:2013-10-05 05:04:33
【问题描述】:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以在“firstName”、“lastName”、“email”、“address”、“userName”、“password”附近使用正确的语法)VALUES(第 1 行的“nu”

当我运行我的 gui 以将数据输入到表中时,我遇到了上述错误。

我正在使用下面的代码

【问题讨论】:

  • 去掉firstName、lastName等周围的单引号。
  • 我认为大卫的意思是,去掉列名周围的单引号;)
  • 密码值旁边缺少撇号:'" + password + ")");
  • 嘿,已经修复了,但是当它操作表格时,插入的值都是空的。

标签: java mysql sql exception


【解决方案1】:

在执行前尝试以下方式查看查询以找出错误:

    public void Create(String first, String last, String email, String address, String username, String password) {
        Connection conn = null;
        PreparedStatement statement = null;
        try {
            Class.forName(JDBC_DRIVER).newInstance();
            conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);

            StringBuilder query = new StringBuilder("INSERT INTO person(firstName, lastName, email, address, userName, password) VALUES(")
                .append("'").append(first).append("',")
                .append("'").append(last).append("',")
                .append("'").append(email).append("',")
                .append("'").append(address).append("',")
                .append("'").append(username).append("',")
                .append("'").append(password).append("'")
                .append(")");

            System.out.println( query.toString());

            statement = conn.prepareStatement( query.toString() );
            statement.executeUpdate();

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

            if (statement != null) {
                statement.close();
            }

            if (conn != null) {
                conn.close();
            }

        }
    }

您可以像这样更改您的 submitButton 函数:

    //action listeners for Login in button and menu item
    submitButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String fName = jtfFname.getText();
            String lName = jtfLname.getText();
            String email = jtfEmail.getText();
            String address = jtfAddress1.getText();
            String username = jtfUsername.getText();
            String password = jtfPassword.getText();

            Create(fName , lName, email, address, username, password);
        }
    });

【讨论】:

  • 嘿,我怎么能用我的 gui 实现这个来获取 jtextfields?
  • 根据您的要求修改
  • 是的,看起来正确,我只是想将此代码添加到我的..不知道如何。
  • 去掉定义:String first、last、email、address、username、password;用提供的一个替换您的 submitButton 操作,用提供的一个替换您的 create 函数实现...让我为您完成它
  • 似乎工作正常只是遇到statement.close();的问题
【解决方案2】:

不要以这种方式使用准备好的语句。您的代码易受 SQL 注入攻击。

以这种方式使用准备好的语句:

    PreparedStatement statement = conn.prepareStatement(
          "INSERT INTO person (firstName, lastName, email, address, userName, password) "
          + "VALUES (? , ?, ?, ?, ?, ?)";
        statement.setString( 1, first);
        statement.setString( 2, last );
        statement.setString( 3, email );
        statement.setString( 4, address );
        statement.setString( 5, username );
        statement.setString( 6, password );
        statement.executeUpdate();

这也可以防止诸如缺少撇号之类的愚蠢错误。

这是一个教程how to use PreparedStatementhttp://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

【讨论】:

  • 为这个干杯,我怎样才能让我的 gui 可以实现这个。
  • 只需将此示例复制并粘贴到您的代码中,它应该可以工作。
【解决方案3】:

您在声明的最后缺少'。你的陈述应该是:

 PreparedStatement statement = 
 conn.prepareStatement("INSERT INTO person ('firstName', 'lastName', 'email', 
                      'address', 'userName', 'password') "
                     + "VALUES ('" + first + "', '" + last + "', '" + email + "',
        '" + address + "', '" + username + "', '" + password + "')");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2010-12-26
    • 2011-09-21
    • 2015-01-01
    • 2020-07-22
    相关资源
    最近更新 更多