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

Posted

技术标签:

【中文标题】java.sql.SQLException:参数索引超出范围(2 > 参数个数,即 0)【英文标题】:java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 0) 【发布时间】:2013-04-18 06:43:45 【问题描述】:
public class Brothers extends javax.swing.JFrame 

    /**
     * declaring connection and SQL statement
     */

    Connection cn;
    Statement st;
    PreparedStatement pstmt=null;
    PreparedStatement pst;
    ResultSet rs;
    Object fname, mname, lname, bdate, nation, statusq,InstNo,  photo, combo, place, mimi; 
    int status;



    public Brothers()         
        dbconnect _db = new dbconnect();

/*//////////////the above is just to show that I have two prepared statement each for each sql statement that i have //////////*/
        try 
            Class.forName("com.mysql.jdbc.Driver");
            //String unicode= "?useUnicode=yes&characterEncoding=UTF-8";
            cn = DriverManager.getConnection(_db.getHost(), _db.getUsername(), _db.getPassword());
            st=cn.createStatement(); 

 try

        String Sql="INSERT INTO brothers(FirstName, MiddleName, LastName, BirthDate, BirthPlace, Nationality, InstituteNumber, Status, Picture) VALUES(?,?,?,?,?,?,?,?,?)";  
        pstmt=cn.prepareStatement(Sql);
        //pstmt.setString(1,txtTrial.getText());('?','?','?','?','?','?','?','?','?')
        pstmt.setString(2,txtFirtsName.getText());
        pstmt.setString(3,txtMiddleName.getText());
        pstmt.setString(4,txtLastName.getText());
        pstmt.setString(5,((JTextField)chooserBirthDate.getDateEditor().getUiComponent()).getText());
        pstmt.setString(6,txtPlacBirth.getText());

        String nations=combonation.getSelectedItem().toString();
        pstmt.setString(7,nations);
        pstmt.setString(8,txtInstituteNo.getText());


        pstmt.setObject(9,combostatus.getSelectedItem());
        pstmt.setBytes(10, person_image);

      pstmt.executeUpdate(Sql);

        JOptionPane.showMessageDialog(null, "Saving Successfull");

        

        catch(Exception e)

          //JOptionPane.showMessageDialog(null, e);
          e.printStackTrace(); 
      

当我尝试使用上面的代码插入数据时,它会引发异常:

java.sql.SQLException: Parameter index out of range (10 > number of parameters, which is 9).
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3813)
    at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3795)

我已经尝试过查看,但我找不到问题,请帮忙!

【问题讨论】:

当我改用它时,我可以插入除图片以外的数据:try String addrecords="insert into Brothers(FirstName, MiddleName, LastName, BirthDate, BirthPlace, Nationality, InstituteNumber, Status,图片) values('"+ fname +"', '" + mname +"', '" + lname +"', '" + dave +"', '" + place +"', '" + isa +" ', '" + InstNo +"', '" + statusq +"', '" + photo +"')"; //wrapField(); st.executeUpdate(添加记录); 您应该更改问题的标题以匹配您在问题正文中输入的异常的实际消息! 【参考方案1】:

您在位置 2 而不是 1 开始插入

 pstmt.setString(2,txtFirtsName.getText());

改成

pstmt.setString(1,txtFirtsName.getText());

对最后一个将是的其他人做同样的事情

pstmt.setBytes(9, person_image);

【讨论】:

你当然是对的,但要么是有其他问题,要么是错误信息“Parameter index out of range (2 > number of parameters, which is 0)”相当误导。据我所知,您不必按顺序设置参数(您可以设置 2,然后 3,然后 1)所以当他尝试设置 10 而不是 2 时它应该崩溃? 请再次阅读异常,它是“(10>参数个数,即9)”,这意味着他试图在位置10插入一个参数,但它只支持9个参数。另外我没有说他需要按顺序设置参数。 我的表有十列:BrothersID,FirstName, MiddleName, LastName, BirthDate, BirthPlace, Nationality, InstituteNumber, Status, Picture。 BrothersID 是一个自动增量,这意味着我不必在上面输入任何内容!!!但我什至尝试通过创建一个我不使用的文本文件来欺骗它...参见 //pstmt.setString(1,txtTrial.getText());但还是不行 当然,抱歉,我没有正确阅读问题正文中的异常,请查看问题标题! 伙计们,当我按照您的建议进行操作时,错误更改为:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)【参考方案2】:

问号? 的数量必须等于参数。

如果您有 7 个参数,那么您的语句中应该有 7 个问号,即insert into table name values(?,?,?,?,?,?,?)

【讨论】:

【参考方案3】:

您的 SQL 语句中只有 9 个参数。

String Sql="INSERT INTO brothers(FirstName, MiddleName, LastName, BirthDate, BirthPlace, Nationality, InstituteNumber, Status, Picture) VALUES(?,?,?,?,?,?,?,?,?)";

当您注释掉第一个setString 方法调用时,您应该已为以下调用重新编号参数索引。它们的编号应该是 1 - 9,而不是 2 - 10。

【讨论】:

伙计们,当我按照您的建议进行操作时,错误更改为:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法) 我的表有十列:BrothersID,FirstName, MiddleName, LastName, BirthDate, BirthPlace, Nationality, InstituteNumber, Status, Picture。 BrothersID 是一个自动增量,这意味着我不必在上面输入任何内容!!!但我什至尝试通过创建一个我不使用的文本文件来欺骗它...参见 //pstmt.setString(1,txtTrial.getText());但还是不行【参考方案4】:

第一个参数的索引应该是1而不是2,最后一个参数的索引应该是9而不是10。分配N个参数时,索引从1到N。

【讨论】:

当我按照您的建议进行操作时,错误更改为:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native方法)【参考方案5】:

使用 psmt.executeUpdate(); 代替 pstmt.executeUpdate(Sql);

【讨论】:

以上是关于java.sql.SQLException:参数索引超出范围(2 > 参数个数,即 0)的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException:索引处缺少 IN 或 OUT 参数:: 1

java.sql.SQLException: 调用中无效的参数

java.sql.SQLException:调用中的参数无效:getBytes()

以下错误是啥意思:java.sql.sqlexception 在索引处缺少输入或输出参数

java.sql.SQLException:spring boot中的参数索引超出范围(6>参数个数,即5)

java.sql.SQLException: 调用中无效的参数DSRA0010E: SQL 状态 = null,错误代码 = 17,433