如何解决java.sql.SQLException:参数索引超出范围?

如何解决java.sql.SQLException:参数索引超出范围?,java,mysql,sql,servlets,prepared-statement,Java,Mysql,Sql,Servlets,Prepared Statement,我是一名新手开发人员。在我的代码中,html页面在浏览器中正确显示,但在提交数据后,它不会调用post方法,因此不会将数据存储在我的mysql workbence数据库中。数据库中的模式名是registration,表名是reg_details。我使用的是ApacheTomcat服务器 HTML文件: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1">

我是一名新手开发人员。在我的代码中,html页面在浏览器中正确显示,但在提交数据后,它不会调用post方法,因此不会将数据存储在我的mysql workbence数据库中。数据库中的模式名是registration,表名是reg_details。我使用的是ApacheTomcat服务器

HTML文件:

<!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="Registration" method="post" autocomplete="on">
    <fieldset>
    <legend>Registration Details:</legend>
    First Name &nbsp <input type="text" name="firstname" autofocus> &nbsp Middle name &nbsp <input type="text" name="middlename"> &nbsp Last Name &nbsp <input type="text" name="lastname"><br><br>
    Address &nbsp <br> <textarea name="address" rows="2" cols="25"></textarea>
    <br><br>
    Gender &nbsp <input type="radio" name="gender" value="male"> Male <input type="radio" name="gender" value="female"> Female<br><br>
    Mobile No. &nbsp <input type="text" name="mobileno"> <br><br>
    Email Id &nbsp <input type="email" name="emailid"> <br><br> 
    Birth Date &nbsp <input type="date" name="birthday"><br><br>
    Username &nbsp <input type="text" name="username"><br><br>
    Password &nbsp <input type="password" name="password"><br><br>
    <input type="submit" value="Submit">
    </fieldset>
    </form>
    </body>
    </html>
我用你的建议更新了报告。我在结束时关闭了连接并删除了服务方法,但在执行相同的错误后退出。我正在连接我的控制台,以便对您有所帮助。我使用mysql-connector-java-5.1.44-bin.jar进行数据库连接

以下是来自服务器控制台的stacktrace:

org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Hospital Queue Management' did not find a matching property. org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number:         8.0.48.0
org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8085"]
 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8019"]
 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1512 ms
 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3327)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3312)
    at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4027)
    at Registration.doPost(Registration.java:44)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
java.sql.SQLException:参数索引超出范围(1>数量) 参数,即0)

preparedstatement没有任何占位符(参数数量为
0

但是,你正在尝试设置

ps.setString(1, firstname);
这就是为什么,你会得到例外。您需要更改SQL以接受一个参数

INSERT INTO reg_details (name) values (?)
java.sql.SQLException:参数索引超出范围(1>数量) 参数,即0)

preparedstatement没有任何占位符(参数数量为
0

但是,你正在尝试设置

ps.setString(1, firstname);
这就是为什么,你会得到例外。您需要更改SQL以接受一个参数

INSERT INTO reg_details (name) values (?)

如果在调用存储过程时出现此异常:

java.sql.SQLException:的参数索引X超出范围(1,Z)

如果你正在使用

  • spring数据jpa
  • 返回一个值。例如-id字段
  • 那你就得小心这些东西

    @Repository
    public interface UserDao extends JpaRepository<User, Long>{
    
        @Procedure(procedureName = "PersistUserInfo" , outputParameterName = "id")
        long saveUserInfo(String userName, String firstName, String lastName);
    
    }
    
    在hibernate日志中,您会发现SP的调用如下:

    CREATE PROCEDURE `PersistUserInfo`(IN userName varchar(20), IN firstName varchar(100), IN lastName varchar(100), OUT id BIGINT)
    
    {call PersistUserInfo(?,?,?,?)}
    

    通过这些更改,我能够解决问题并能够调用存储过程。

    如果在调用存储过程时出现此异常:

    java.sql.SQLException:的参数索引X超出范围(1,Z)

    如果你正在使用

  • spring数据jpa
  • 返回一个值。例如-id字段
  • 那你就得小心这些东西

    @Repository
    public interface UserDao extends JpaRepository<User, Long>{
    
        @Procedure(procedureName = "PersistUserInfo" , outputParameterName = "id")
        long saveUserInfo(String userName, String firstName, String lastName);
    
    }
    
    在hibernate日志中,您会发现SP的调用如下:

    CREATE PROCEDURE `PersistUserInfo`(IN userName varchar(20), IN firstName varchar(100), IN lastName varchar(100), OUT id BIGINT)
    
    {call PersistUserInfo(?,?,?,?)}
    

    通过这些更改,我可以解决问题并调用存储过程。

    不要忘记关闭连接欢迎使用堆栈溢出!你能详细说明你的代码是如何“不工作”的吗?你在期待什么,到底发生了什么?如果您遇到异常/错误,请发布发生该异常/错误的行以及异常/错误详细信息。请输入这些详细信息,否则我们可能无法提供帮助。由于您有以下信息:
    e.printStackTrace()
    请检查您正在使用的服务器(tomcat、jetty、w/e)运行应用程序的日志,并查看其中是否打印了异常。这是发现问题并解决问题的重要信息。此外,注意基本概念。MySQL是数据库引擎,MySQL Workbench是一个客户端工具,允许您“查看”MySQL引擎中数据库和表的人工表示。我不喜欢您的“服务”方法的外观-如果您删除它会发生什么。我认为这实际上是在截取你所有的电话servlet@DaiveH感谢回复,我删除了服务方法,但代码仍然没有在mysql数据库中存储数据。不要忘记关闭连接欢迎使用堆栈溢出!你能详细说明你的代码是如何“不工作”的吗?你在期待什么,到底发生了什么?如果您遇到异常/错误,请发布发生该异常/错误的行以及异常/错误详细信息。请输入这些详细信息,否则我们可能无法提供帮助。由于您有以下信息:
    e.printStackTrace()
    请检查您正在使用的服务器(tomcat、jetty、w/e)运行应用程序的日志,并查看其中是否打印了异常。这是发现问题并解决问题的重要信息。此外,注意基本概念。MySQL是数据库引擎,MySQL Workbench是一个客户端工具,允许您“查看”MySQL引擎中数据库和表的人工表示。我不喜欢您的“服务”方法的外观-如果您删除它会发生什么。我认为这实际上是在截取你所有的电话servlet@DaiveH感谢回复,我删除了服务方法,但代码仍然没有在mysql数据库中存储数据。请看stacktrace。这显然是一个名为
    Registration
    的普通
    HttpServlet
    子类,它覆盖了
    doPost()
    方法,直接由JDBC调用
    PreparedStatement的
    setString()
    。并没有Spring框架,并没有JPA,所以答案是并没有用的。这显然是一个名为
    Registration
    的普通
    HttpServlet
    子类,它覆盖了
    doPost()
    方法,直接由JDBC调用
    PreparedStatement的
    setString()
    。并没有Spring框架,并没有JPA,所以答案并没有用处。