准备好的陈述有问题

时间:2011-03-26 12:29:36

标签: java mysql prepared-statement

我有这段代码:

 Date start = new Date(Integer.parseInt(jTextField4.getText()), Integer.parseInt(jTextField16.getText()), Integer.parseInt(jTextField17.getText()));  
        Date end = new Date(Integer.parseInt(jTextField5.getText()), Integer.parseInt(jTextField18.getText()), Integer.parseInt(jTextField19.getText()));
        statement = connection.createStatement();
        preparedStatement1 = connection.prepareStatement("insert into sportmangg(customer_code,"
             + "sportman_code, start, finish, salary,amount,box salary,private salary, food salary, "
             + "other salary, bime salary, number) "
             + "values (? ,?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?");
      preparedStatement1.setString(1,jTextField15.getText());
     preparedStatement1.setString(2, jTextField1.getText());
     preparedStatement1.setDate(3, start);
     preparedStatement1.setDate(4, end);
     preparedStatement1.setInt(5, Integer.parseInt(jTextField6.getText()) );
     preparedStatement1.setInt(6,Integer.parseInt(jTextField14.getText()) );
     preparedStatement1.setInt(7, Integer.parseInt(jTextField7.getText()));
     preparedStatement1.setInt(8, Integer.parseInt(jTextField8.getText()));
     preparedStatement1.setInt(9, Integer.parseInt(jTextField9.getText()));
     preparedStatement1.setInt(10, Integer.parseInt(jTextField11.getText()));
     preparedStatement1.setInt(11, Integer.parseInt(jTextField10.getText()));
     preparedStatement1.setInt(12, Integer.parseInt(jTextField20.getText()));
     preparedStatement1.executeUpdate();

但它有这个错误:

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 'salary,private salary, food salary, other salary, bime salary, number) values ('' at line 1

有什么问题?

7 个答案:

答案 0 :(得分:11)

你真的不应该在字段名称中有空格。尝试用``

包围它

答案 1 :(得分:3)

包含空格的列名称是 非常 错误主意。

如果你必须拥有它们,请用反引号包围它们:

`private salary`

答案 2 :(得分:1)

你在SQ​​L查询的最后一行错过了)所以它应该是:

+ "  values (? ,?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?   )";

答案 3 :(得分:1)

也许你可以试试这个:
https://github.com/stuparmihailo/util4j/releases/tag/v1.0
这是一个简单的项目,并且有很好的创建语句的方法:
String query = "INSERT INTO table VALUES (?,?,?,?,?,?,?)"; PreparedStatement stmt = con.prepareStatement(query); StatementUtil.fill(stmt, 45, "text", 2, null, new Date(), false, 3.5);

答案 4 :(得分:0)

您应该使用private_salary替换私人薪水,并继续使用可接受的列名约定。

答案 5 :(得分:0)

列或表名称不应包含空格。通过下划线加入他们。并使它们成为大写......这些不是规则,而是接受使用DB对象的方式。如果在数据库中无法更改名称,并且您遇到类似工资的问题,那么some salary应该有所帮助。

答案 6 :(得分:0)

梅迪; 我认为你要做的就是这一切:

  1. 更改名称 空间命名列(私人工资, 食品工资,其他工资,bime 薪水)要么用下划线代替空格 (由命名约定推荐)或 带有重音符号的周围名字:

      

    `box salary`,`private salary`,`food salary`,`other salary`,`bime   salary`

  2. 修复此行添加最后的括号

      

    +“值(?,?,?,?,?,?,?,?,?,?,?,?”);

    必须说:

      

    +“值(?,?,?,?,?,?,?,?,?,?,?,?); ”);

  3. 最后我建议把一个prepareStatement参数取出一个String或StringBuffer变量,比如说“sqlString”或者什么,这样你就可以更透明地操作它了。这样的事情:

  4. String sqlString = "";
    sqlString += " insert into sportmangg";
    sqlString += " (customer_code, sportman_code, start, finish,";
    sqlString += " salary, amount, box_salary, private_salary,";
    sqlString += " food_salary, other_salary, bime_salary, number)";
    sqlString += " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
    preparedStatement1 = connection.prepareStatement(sqlString);
    

    (或者如果你使用 StringBuffer 使用附加方法)