java.sql.SQLException:参数索引超出范围(2>;参数数,即1)

java.sql.SQLException:参数索引超出范围(2>;参数数,即1),java,mysql,jdbc,prepared-statement,Java,Mysql,Jdbc,Prepared Statement,大家好,我是新来的,我在下面提到的类中遇到了一个问题。我试图做的就是提供程序名作为参数,并从数据库返回程序链接。这是我的代码 public String getLink (String Program){ String Program_Link=null; try { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (Exceptio

大家好,我是新来的,我在下面提到的类中遇到了一个问题。我试图做的就是提供程序名作为参数,并从数据库返回程序链接。这是我的代码

public String getLink (String Program){

    String Program_Link=null;

    try {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }

        Connection mycon=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/programinformation","root","");
        PreparedStatement mystmt=mycon.prepareStatement("SELECT Program_Link from program_table where Program_Name=?"); 
        mystmt.setString(2, Program);       
        ResultSet rs=mystmt.executeQuery();

        System.out.println("The link acquired is"+rs.getString("Program_Link"));

        while(rs.next()){
            System.out.println(rs.getString(2));
        }
    } catch (Exception exc){
        exc.printStackTrace();
    }

    return Program_Link;    
}
但是我得到了以下错误

Connecting to a selected database...
Connected to database successfully...
Creating statement...
Statement created ...
java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3399)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3384)
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4110)
    at com.TvToday.StarSystems.TSMService.getLink(TSMService.java:35)
    at com.TvToday.StarSystems.Process.doPost(Process.java:36)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Server Responding from doPost Method  !!!

错误消息准确地捕获问题;您的SQL是:

SELECT Program_Link from program_table where Program_Name=?
其中有一个占位符(通过问号编码),但您尝试设置第二个占位符的值:

mystmt.setString(2, Program);
所以,它爆炸了。尝试将
2
更改为
1

mystmt.setString(1, Program);


你那里也有一只虫子。如果驱动程序未能加载(顺便说一句,这在10年多的时间里都不是必需的),您将捕获异常,打印错误消息,,但无论如何继续运行。如果捕获到异常,请解决该问题或将其记录并返回。否则,就别再理它了。

谢谢波希米亚人,它帮我解决了问题,但现在我要在结果集错误开始之前面对这个问题。正如我所说,我开始工作才几周。rs.getString(“Program_Link”)应该遵循rs.next()。因此,您要么在while(rs.next())循环中移动第一个System.out.println(),要么将其注释掉。这个问题以前不是被问过无数次吗?难道你就不能找到和/或润色一个典型的骗局并投票给close吗?多亏了你们所有人,我的问题得到了解决,每个人都欢呼起来。在你输入问题标题后,你怎么会错过标题下方弹出的相关问题列表?您可以在右侧栏的“相关”部分再次看到它们。这些相关的问题究竟是如何无助于回答你的具体问题的?