【问题标题】:JDBC Insert with Prepared Statement says I have SQL Syntax Error [duplicate]带有准备好的语句的 JDBC 插入说我有 SQL 语法错误 [重复]
【发布时间】:2016-12-17 12:50:30
【问题描述】:

我正在尝试在我的表中进行简单的插入,但我的程序说我有一个 SQL 语法错误。有什么想法吗?

SQL 代码

CREATE TABLE ticket (
    start_time DATETIME NOT NULL,
    end_time DATETIME NOT NULL,
    seat VARCHAR(50) NOT NULL,
    sep VARCHAR(50) NOT NULL, 
    price INT(50) NOT NULL,
    foroom VARCHAR(50) NOT NULL,
    printer INT(15) NOT NULL, 
    PRIMARY KEY (seat)
);

JAVA 代码

try
{
    System.out.println("Attempting to connect...\n");
    Class.forName("com.mysql.jdbc.Driver");
    connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/baseis?autoReconnect=true&useSSL=false","root","");
    System.out.println("Connection Succesful!!!");
    String sql = "INSERT INTO ticket (start_time)" + " VALUES (?)";
    PreparedStatement prepared = connection.prepareStatement(sql);
    prepared.setString(1,"2016-07-17 19:00:00");
    prepared.executeUpdate(sql);
}
catch(SQLException error)
{
    System.out.println("Error: " + error.getMessage());
}

错误

Error: 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 '?)' at line 1

【问题讨论】:

    标签: java mysql sql-server jdbc insert


    【解决方案1】:

    您需要为声明为“NOT NULL”的所有列提供值

    调试此类问题的最佳方法是捕获发送到数据库的实际 SQL 语句。

    【讨论】:

    • 试过了,现在我得到这个“错误:参数索引超出范围(1>参数个数,即0)。”
    • 为什么说它没有参数?
    • 如果你使用PreparedStatement::setString(),你不需要在字符串两边加上引号。
    • 从executeUpdate(sql)中删除了sql字符串,还是一样的错误
    【解决方案2】:

    您需要为所有NOT NULL 列提供值,并且不要将sql 字符串提供给executeUpdate()

    // set some values for the record
    String seat = "";
    String sep = "";
    int price = 0;
    String foroom = "";
    int printer = 0;
    
    String sql = "INSERT INTO ticket (start_time, end_time, seat, sep, price, foroom, printer) VALUES (?, ?, ?, ?, ?, ?, ?)";
    PreparedStatement prepared = connection.prepareStatement(sql);
    prepared.setString(1, "2016-07-17 19:00:00");
    prepared.setString(2, "2016-07-17 20:00:00");
    prepared.setString(3, seat);
    prepared.setString(4, sep);
    prepared.setInt(5, price);
    prepared.setString(6, foroom);
    prepared.setInt(7, printer);
    prepared.executeUpdate();
    

    【讨论】:

    • 虽然那将是第二个问题,但实际上并不是导致问题错误的问题。您的回答只是“意外地”修复了它(因为您使用了prepared.executeUpdate() 而不是prepared.executeUpdate(sql)
    • 我知道修复的那部分,但没有明确提及。我已经编辑了答案以使其更加明显。谢谢!
    • 请注意:使用 PostgreSQL,使用 java.sql.PreparedStatement,我必须在表名周围使用转义双引号:"INSERT INTO \"order\" (customer) VALUES (?)",否则语法错误
    • 那是因为order是一个关键字。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2013-12-06
    • 2012-07-08
    • 2018-04-10
    • 1970-01-01
    • 2021-08-26
    • 2013-09-21
    • 2014-06-18
    相关资源
    最近更新 更多