为“ select…limit?,?”准备的查询检索MetaData时,MySQLSyntaxErrorException

问题描述

| 我尝试使用\“ limit \”子句中的参数执行查询后,从准备好的语句中获取元数据:
PreparedStatement ps = conn.prepareStatement(\"select * from tbl limit ?,?\");
ps.setLong(1,0);
ps.setLong(2,10);
ps.execute();
ResultSetMetaData rsmd = ps.getMetaData();
代码在最后一行抛出异常:
Exception in thread \"main\" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
at com.mysql.jdbc.PreparedStatement.getMetaData(PreparedStatement.java:2882)
at ...... <my classes>
当我跳过检索ResultSetMetaData时,代码可以正常工作。 我在Internet和错误数据库中找不到任何提及错误的信息。 我尝试使用以下连接器/ J版本:5.1.14、5.1.12、5.1.9(Maven依赖项)。 服务器版本为5.0.77 谁能帮我?     

解决方法

这是因为执行\“ setLong()\”时,prepared语句如何分配参数。 在prepared语句中使用setter时,它将参数括在单引号中。 我不确定\“ executeQuery \”为何起作用。 如果直接执行以下查询,您将看到类似的异常。
\"select * from tbl limit \'0\',\'10\'\"
而是使用以下内容。
int startLimit = 0;
int endLimit = 10;
PreparedStatement ps = conn.prepareStatement(\"select * from tbl limit \" + startLimit + \",\" + endLimit);
ps.execute();
// you can use \"Statement\" if you dont have any more parameters
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...