如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]
Posted
技术标签:
【中文标题】如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]【英文标题】:How to resolve MySQLSyntaxErrorException in JDBC preparedStatement [duplicate] 【发布时间】:2018-01-14 12:37:24 【问题描述】:我有一个查询会引发com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
,但我不知道为什么。我正在使用 xampp,当我直接尝试相同的查询时,它工作正常。我还有一大堆使用非常相似的查询的其他方法,它们都可以工作。
问题似乎与更新日期有关,我在错误消息中注意到 java 将 ' ' 放在日期周围,这使它成为一个字符串,并且可能是错误的原因。但是我不确定如何解决此问题以将日期插入日期。
代码如下:
public void update(int userId, String date, String column, String value)
try
// convert date from String to Date
DateTime dt = DateTime.parse(date);
java.sql.Date sqlDate = new java.sql.Date(dt.getMillis());
// create prepared statement
conn = DriverManager.getConnection("jdbc:mysql://localhost/db","root", "");
String query = "UPDATE expenses_income SET ? = ? WHERE userId = ? AND date = CAST(? AS DATETIME);";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString(1, column);
preparedStmt.setString(2, value);
preparedStmt.setInt(3, userId);
preparedStmt.setDate(4, sqlDate);
preparedStmt.executeUpdate();
conn.close();
catch (Exception e)
System.err.println("MySQL exception: " + e);
还有错误信息:
MySQL exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''comment' = '123' WHERE userId = 1 AND date = CAST('2018-01-06' AS DATETIME)' at line 1
我也尝试了不强制转换为日期时间的查询:
String query = "UPDATE expenses_income SET ? = ? WHERE userId = ? AND date = ?;";
但我得到了同样的错误。
然后我尝试使用 java.util.Date
而不是 Joda DateTime
,但这没有帮助。有什么想法吗?
谢谢!
【问题讨论】:
列名不能作为prepared statement的参数。 参数只针对值,列名不是值。 【参考方案1】:.. ''comment' = '123' 附近使用的正确语法
由于列名参数化不正确,您会遇到异常。
UPDATE expenses_income SET ? = ?
应该是
UPDATE expenses_income SET column_name = ?
我还注意到 SQL 末尾的分号 ;
,应该将其删除,并且您不需要显式转换 Date
。应该只是
UPDATE expenses_income SET column_name = ? WHERE userId = ? AND date = ?
此外,您不应将列名命名为 date
,而应为 last_updated
或其他有意义的名称。
【讨论】:
我将查询更改为“字符串查询=”更新费用_收入设置? = ? WHERE userId = " + column + " AND date = CAST(?AS DATETIME);";"但我仍然收到相同的错误消息。编辑对不起,我刚刚注意到我的错误。谢谢! @kattapillar 你懒得看我的解决方案。我说,你应该保留列名。仔细看看我的解决方案。以上是关于如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]的主要内容,如果未能解决你的问题,请参考以下文章
JDBC-PreparedStatement实现CURD(笔记)
如何解决“无法为连接 URL 创建类 'com.mysql.jdbc.Driver' 的 JDBC 驱动程序”
如何解决 JDBC PreparedStatement 中的 MySQLSyntaxErrorException [重复]