Грешка: Параметърът на индекса е извън диапазона

Искам да вмъкна първичен ключ на избрания елемент от разгъващия се списък

но получих тази грешка 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);
            }

person Jasmine Ziz    schedule 23.05.2014    source източник
comment
използвате същия pst обект, за да извлечете membertypeid и да извършите вмъкването. Прегледайте логиката си... първо извлечете membertypeid, след това създайте израза за вмъкване.   -  person wxyz    schedule 23.05.2014


Отговори (3)


Не използвате 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
person Ravinder Reddy    schedule 23.05.2014

Въпреки че операторът ви за вмъкване изглежда правилно попълнен, в цикъла while вие рядко се опитвате да изпълните оператор за избор, който няма параметри, така че pst.setString(12,memberType) се проваля.

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

Преди да изпълните заявката, трябва да сте задали всички стойности за всички параметри.

person Prabahar    schedule 23.05.2014
comment
По-добре използвайте различен оператор за получаване на membertypeids. - person Prabahar; 23.05.2014