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

问题描述:

我试图从[文本],消息[文本]中将下面的数据插入到具有列ID [autoNumber],键入[text],[text]和attachmentLoc [文本]INSERT INTO语句中的Java SQL语法错误

所以自动编号生成我插入他们提供的列名称。当它运行在控制台打印出:

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(); 
    } 

感谢您的帮助

+0

难道是因为我正在使用我的数据库中的单词吗? – 2012-04-18 17:27:22

+1

是的,因为它是一个保留字:-D – 2012-04-18 17:29:08

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

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

也许,你希望下列之一: '?'

  • NULL
  • ''

或者一些其他的价值。

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

+0

这些是参数占位符。 – 2012-04-18 18:39:41

你所使用的数据库引擎,你没有说明,但一些列名(以及表名)可能是保留字的候选者。最明显的是from

你将需要写这些标识符在标识符引用其通常是要么反引号字符(')或字符[和](取决于发动机):

INSERT INTO `Messages` (`type`, `to`, `from`, `message`, `attachmentLoc`) 
    VALUES (?,?,?,?,?); 

INSERT INTO [Messages] ([type], [to], [from], [message], [attachmentLoc]) 
    VALUES (?,?,?,?,?); 

只有在保留字的标识符周围需要引用,但在所有标识符周围使用引号都不会造成伤害。此外,没有理由不在VALUES后面加上空格,并在语句结尾处加上分号(尽管大多数引擎不需要)。

+0

我回答了我自己的问题,无论如何。这是因为来自一个保留字。我将列名更改为messageFrom – 2012-04-18 22:13:53

+0

不同的引擎建立不同的保留字列表。我会提防'type','to'和'message'。显然,它们并不是保留在你现在使用的任何SQL产品中,但是如果你稍后将引擎切换出来,那么它是需要注意的。 – 2012-04-19 12:37:31

+0

PS:当你回答自己的问题时,你应该将它作为答案发布,而不是评论,然后(短暂延迟后),你可以标记自己的答案是正确的。你不会为接受你自己的答案而获得积分,但它会从“仍然开放”的列表中删除问题,并帮助未来出现的人找到正确的答案。 – 2012-04-19 12:38:46