【问题标题】:PreparedStatement throws MySQLSyntaxErrorExceptionPreparedStatement 抛出 MySQLSyntaxErrorException
【发布时间】:2010-05-11 15:24:39
【问题描述】:

我有以下 Java 代码:

String query = "Select 1 from myTable where name = ? and age = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, name);
stmt.setInt(2, age);
ResultSet rs = stmt.executeQuery();

每当我运行上述代码时,它都会在第 2 行(声明 PreparedStatement 的位置)抛出异常:

错误 0221202:SQLException = com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '? 附近使用的正确语法。和年龄=?在第 1 行

有人对我做错了什么有任何建议吗?谢谢!

【问题讨论】:

  • 你是否与变量conn建立了连接?
  • myTable 中有哪些列?真的有一个叫1吗?如果要选择所有列但只选择一行,则为SELECT * FROM myTable WHERE name=? AND age=? LIMIT 1;
  • 很好地了解列被命名为“1”。没有名为“1”的列,而是名为生日的列。我现在已将查询更改为“从 myTable 中选择生日,其中 name = ? and age = ?”但同样的错误信息仍然存在。有名为“name”和“age”的列具有适当的数据类型(字符串和 int)。
  • 从“选择 1”更改为“选择生日”后,我注意到错误移至我的 executeQuery() 语句。我的实际示例更复杂,它在 PreparedStatement 上循环而不调用 clearParameters。所以这个问题现在已经解决了。 :)

标签: java mysql prepared-statement


【解决方案1】:

你可以试试这个

String query = "Select 1 from myTable where `name` = ? and age = ?";

String query = "Select count(*) from myTable where `name` = ? and age = ?";  

无论如何,您的代码对我来说非常适合;
您确定您的字符串中没有特殊字符吗?
使用的 MySQL 和驱动版本是什么?
这是正确的代码吗?

【讨论】:

    【解决方案2】:

    看起来PreparedStatement 类只支持 SQL“IN”参数化列表。看起来您想将其更改为使用 prepareCall 函数:

    CallableStatement stmt = conn.prepareCall(query);
    

    并且CallableStatement 扩展了PreparedStatement,因此进行更改非常容易。

    【讨论】:

    • 请不要在人们投反对票时进行报复。相反,请尝试根据您现有的信息(例如评分高的答案)改进您的答案。
    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 2013-09-11
    • 2011-05-07
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多