请问各位,我的这个有什么错误哇?SQL语句在数据库中单独执行没问题,我的数据库是mysql
代码如下:
String sql = "SELECT id, name, orders, link, color, parent_id FROM productnav WHERE parent_id=? order by orders";
List l = null;
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, parentId);
ResultSet rs = ps.executeQuery(sql);
l = new ArrayList();
while(rs.next()){
ProductNav nav = new ProductNav();
nav.setId(rs.getString(1));
nav.setName(rs.getString(2));
nav.setOrders(rs.getInt(3));
nav.setLink(rs.getString(4));
nav.setColor(rs.getString(5));
nav.setParentId(rs.getString(6));
l.add(nav);
}
}catch(SQLException e){
e.printStackTrace();
log.error(e.getMessage());
}
报的错误信息如下:
com.mysql.jdbc.exceptions.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 '? order by orders' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2934)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1708)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3178)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1203)
at org.apache.commons.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:205)
at com.wyx.common.database.impl.MysqlOperation.listProductChildNav(MysqlOperation.java:109)
at com.wyx.actions.admin.ProductNavAction.listChilds(ProductNavAction.java:134)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at com.wyx.actions.admin.LoginFilter.doFilter(LoginFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)

解决方案 »

  1.   


    ResultSet rs = ps.executeQuery(sql);改为ResultSet rs = ps.executeQuery();
      

  2.   

     right syntax to use near '? order by orders' at line 1仔细查看下你的SQL语句。
    ?是不是用中文拼音 打的符号。
      

  3.   

    把二楼的改了
    sql在数据执行没问题应该sql就是正确的,可能是二楼说的那个原因
      

  4.   


    答:不能使用ResultSet rs = ps.executeQuery(sql);因为:sql串含有?,不是一条合法的SQL语句,因而不能当作SQL语句用 ps.executeQuery(sql)来执行它.而应该用:ResultSet rs = ps.executeQuery();来执行ps这个填写了参数值的PreparedStatement.
      

  5.   

       1。SQL 语句写错了 
        2。ps.executeQuery(sql) 改成ps.executeQuery()
      

  6.   

    顶!jdbc的书专门讲过这点的。
      

  7.   

    有参数不能执行
    ps.executeQuery(sql)
      

  8.   

    先执行ps.executeUpdate();
    在创建一个Statement对象执行sql语句。
      

  9.   

    ResultSet rs = ps.executeQuery();
    二楼正解。
      

  10.   

    ResultSet rs = ps.executeQuery();