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吗?多亏了你们所有人,我的问题得到了解决,每个人都欢呼起来。在你输入问题标题后,你怎么会错过标题下方弹出的相关问题列表?您可以在右侧栏的“相关”部分再次看到它们。这些相关的问题究竟是如何无助于回答你的具体问题的?