INSERT INTO语句中的Java SQL语法错误

INSERT INTO语句中的Java SQL语法错误,java,sql,Java,Sql,我正在尝试将下面的数据插入到一个表中,该表的列ID为[autoNumber],键入[text],to[text],from[text],message[text]和attachmentLoc[text] 因此,生成自动编号时,我插入它们并提供列名。当它运行时,控制台会打印出: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement. at sun.

我正在尝试将下面的数据插入到一个表中,该表的列ID为[autoNumber],键入[text],to[text],from[text],message[text]和attachmentLoc[text]

因此,生成自动编号时,我插入它们并提供列名。当它运行时,控制台会打印出:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3149)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:216)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(JdbcOdbcPreparedStatement.java:138)
at MultiEchoServer.saveMessage(MultiEchoServer.java:147)
at ClientHandler.run(MultiEchoServer.java:409)
导致错误的代码是:

try
    {
        String sql = "INSERT INTO Messages (type, to, from, message, attachmentLoc) VALUES(?,?,?,?,?)";     
        PreparedStatement stmt = database.prepareStatement(sql);
        stmt.setString(1, message.getType());
        stmt.setString(2, message.getTo());
        stmt.setString(3, message.getFrom());
        stmt.setString(4, message.getMessage());
        stmt.setString(5, attachmentLoc);
        stmt.executeUpdate();
    }
    catch (SQLException e)
    {
        System.out.println("Could not perform statement");
        e.printStackTrace();
    }

感谢您的帮助

您需要INSERT语句的有效语法。SQL不理解问号

也许,您需要以下选项之一:

  • “?”
  • 空的
  • ''
或者其他一些价值

因此,假设列接受空值,您可以使用:
值(NULL,NULL,NULL,NULL,NULL)

INSERT语句需要有效的语法。SQL不理解问号

也许,您需要以下选项之一:

  • “?”
  • 空的
  • ''
或者其他一些价值

因此,假设列接受空值,您可以使用:
值(NULL、NULL、NULL、NULL、NULL)

您不说明正在使用的数据库引擎,但许多列名(以及表名)可能是保留字的候选项。最明显的是来自的

您将需要在标识符引号中写入这些标识符,这些标识符通常是反勾号字符(`)或字符[和](取决于引擎):


只需要在作为保留字的标识符周围使用引号,但在所有标识符周围使用引号不会有任何影响。此外,没有理由不在语句末尾包含值后面的空格和分号(尽管大多数引擎都不需要分号)。

您没有说明正在使用的数据库引擎,但许多列名(以及表名)可能是保留字的候选项。最明显的是来自

您将需要在标识符引号中写入这些标识符,这些标识符通常是反勾号字符(`)或字符[和](取决于引擎):


只需要在作为保留字的标识符周围使用引号,但在所有标识符周围使用引号不会有任何影响。此外,没有理由不在语句末尾包含值后面的空格和分号(尽管大多数引擎都不需要这两个分号)。

From是保留字,更改为messageFrom后,允许插入数据库。

From是保留字,将其更改为messageFrom后,允许插入数据库。

可能是因为我在数据库中使用了单词from吗?是的,是因为它是保留字:-d可能是因为我在数据库中使用了单词from吗?是的,是因为它是保留字:-d这些是参数占位符。这些是参数占位符。我回答了我自己的问题,谢谢。因为from是一个保留字。我将列名更改为messagefromthepathing引擎建立不同的保留字列表。我会注意
类型
,以及
消息
。显然,无论您现在使用的是哪种SQL产品,它们都不会保留,但如果您稍后关闭引擎,则需要注意。PS:当您回答自己的问题时,您应该将其作为答案而不是评论发布,然后(短暂延迟后)您可以将自己的答案标记为正确。你不会因为接受自己的答案而得分,但它会将问题从“仍然未解决”列表中删除,并帮助将来出现的人找到正确答案。我回答了自己的问题,无论如何,谢谢。因为from是一个保留字。我将列名更改为messagefromthepathing引擎建立不同的保留字列表。我会注意
类型
,以及
消息
。显然,无论您现在使用的是哪种SQL产品,它们都不会保留,但如果您稍后关闭引擎,则需要注意。PS:当您回答自己的问题时,您应该将其作为答案而不是评论发布,然后(短暂延迟后)您可以将自己的答案标记为正确。你不会因为接受自己的答案而得分,但它会将问题从“仍然未解决”列表中删除,并帮助将来出现的人找到正确答案。
INSERT INTO `Messages` (`type`, `to`, `from`, `message`, `attachmentLoc`)
  VALUES (?,?,?,?,?);
INSERT INTO [Messages] ([type], [to], [from], [message], [attachmentLoc]) 
   VALUES (?,?,?,?,?);