错误:索引参数超出范围

问题描述:

我要插入组合框错误:索引参数超出范围

的所选项目的主键,但我得到这个错误Parameter index out of range(12 > number of parameter which is 0)

我真的不知道如何解决这个

这里是我的代码:

String valueTrainer = "kosong"; 
try 
{ 
    String sql2 = "Insert into ahli (MemberID, TrainerID, Name, ICNumber, Address, Nationality," 
         + "PhoneNumber, Email, EmergencyPerson, EmergencyContact, DateReg, MemberTypeID) " 
         + "values(?,?,?,?,?,?,?,?,?,?,?,?)"; 


       pst = conn.prepareStatement(sql2); 

       pst.setString(1, MemberIDTextField.getText()); 
       pst.setString(2, valueTrainer); 
       pst.setString(3, NameTextField.getText()); 
       pst.setString(4, jTextField1.getText()); 
       pst.setString(5, AddressTextArea.getText()); 

       //Nationality combo box 
       String nationalityList = NationalityComboBox.getSelectedItem().toString(); 
       pst.setString(6, nationalityList); 

       pst.setString(7, PhoneNumberTextField.getText()); 
       pst.setString(8, EmailTextField.getText()); 
       pst.setString(9, EmerContactPersonTextField.getText()); 
       pst.setString(10, EmerContactNumberTextField.getText()); 

       //Date Chooser 
       pst.setString(11, ((JTextField)MemberDateChooser.getDateEditor().getUiComponent()).getText()); 

       //membertype combobox 
       // problem start from here, I think.. 
       String memberTypeList = MemberTypeComboBox.getSelectedItem().toString(); 
       String sql1 ="Select MemberTypeID from jeniskeahlian where Type = '"+memberTypeList+"' " ; 
       pst = conn.prepareStatement(sql1); 

       rs = pst.executeQuery(); 

       while(rs.next()){ 

        String memberType = rs.getString("MemberTypeID"); 
        pst.setString(12, memberType); 

       } 

       pst.execute(); 

       JOptionPane.showMessageDialog(null, "New member has been added"); 

      } catch (SQLException | HeadlessException e) { 
       JOptionPane.showMessageDialog(null, e); 
      } 
+0

您正在使用相同的pst对象来检索membertypeid并执行插入操作。检查你的逻辑...首先检索membertypeid,然后创建插入语句。 – wxyz

您没有正确使用pst

同一命名参考上的准备好的语句不能在不同的sql语句上使用,除非一个被正确使用和关闭。准备,设置,执行,关闭一个语句,然后在另一个语句上重复相同的操作。

更改您的代码如下

try 
{ 
    String memberTypeList = MemberTypeComboBox.getSelectedItem().toString(); 
    String sql1 ="Select MemberTypeID 
        from jeniskeahlian 
        where Type = ? " ; 
    pst = conn.prepareStatement(sql1); 
    pst.setString(1, memberTypeList); 

    rs = pst.executeQuery(); 
    String memberType = ""; 
    while(rs.next()){ 
     memberType = rs.getString("MemberTypeID"); 
    } 
    rs.close(); 
    pst.close(); 

    String sql2 = "Insert into ahli (MemberID, TrainerID, Name, 
            ICNumber, Address, Nationality, 
            PhoneNumber, Email, EmergencyPerson, 
            EmergencyContact, DateReg, MemberTypeID) 
        values(?,?,?,?,?,?,?,?,?,?,?,?)"; 

    pst = conn.prepareStatement(sql2); 

    pst.setString(1, MemberIDTextField.getText()); 
    pst.setString(2, valueTrainer); 
    pst.setString(3, NameTextField.getText()); 
    pst.setString(4, jTextField1.getText()); 
    pst.setString(5, AddressTextArea.getText()); 

    //Nationality combo box 
    String nationalityList = NationalityComboBox.getSelectedItem().toString(); 
    pst.setString(6, nationalityList); 

    pst.setString(7, PhoneNumberTextField.getText()); 
    pst.setString(8, EmailTextField.getText()); 
    pst.setString(9, EmerContactPersonTextField.getText()); 
    pst.setString(10, EmerContactNumberTextField.getText()); 

    //Date Chooser 
    pst.setString(11, ((JTextField)MemberDateChooser 
           .getDateEditor() 
           .getUiComponent()).getText()); 
    pst.setString(12, memberType); 

    pst.execute(); 

    JOptionPane.showMessageDialog(null, "New member has been added"); 

} // try 
+0

感谢@ravinder – SyasyaAzizan

当你插入语句似乎正确填充,在while循环您很少尝试执行没有参数的select语句,因此pst.setString(12,memberType)失败。

String sql1 ="Select MemberTypeID from jeniskeahlian where Type = '"+memberTypeList+"' " ; //no ? in this query 

在执行查询之前,您应该已经设置了所有参数的所有值。

+0

更好地使用不同的语句来获取membertypeids。 – Prabahar